// Copyright 2017-2022 The Khronos Group Inc.
//
// SPDX-License-Identifier: CC-BY-4.0

include::{generated}/meta/{refprefix}VK_KHR_acceleration_structure.adoc[]

=== 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.adoc[]


=== 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 comparison of differences and similarities
between VK_NV_ray_tracing and VK_KHR_acceleration_structure?
--
*DISCUSSION*:

The following is a more detailed comparison 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, pname: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`
