// 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*::
    2020-11-12
*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
  - 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 <<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
  ** <<VK_KHR_deferred_host_operations>> is required again
  * Change acceleration structure build to always be sized
  ** de-alias elink: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:
  ** <<VK_KHR_acceleration_structure>> (for acceleration structure
     operations)
  ** <<VK_KHR_ray_tracing_pipeline>> (for ray tracing pipeline and shader
     stages)
  ** <<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
     <<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
     <<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 <<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 slink:VkBindAccelerationStructureMemoryInfoNV,
     flink: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)
