vkCmdBuildAccelerationStructuresKHR(3)

# vkCmdBuildAccelerationStructuresKHR(3) Manual Page

## Name

vkCmdBuildAccelerationStructuresKHR - Build an acceleration structure

## C Specification

To build acceleration structures call:

    // Provided by VK_KHR_acceleration_structure
    void vkCmdBuildAccelerationStructuresKHR(
        VkCommandBuffer                             commandBuffer,
        uint32_t                                    infoCount,
        const VkAccelerationStructureBuildGeometryInfoKHR* pInfos,
        const VkAccelerationStructureBuildRangeInfoKHR* const* ppBuildRangeInfos);

## Parameters

- `commandBuffer` is the command buffer into which the command will be recorded.

- `infoCount` is the number of acceleration structures to build. It specifies the number of the `pInfos` structures and `ppBuildRangeInfos` pointers that must be provided.

- `pInfos` is a pointer to an array of `infoCount` VkAccelerationStructureBuildGeometryInfoKHR structures defining the geometry used to build each acceleration structure.

- `ppBuildRangeInfos` is a pointer to an array of `infoCount` pointers to arrays of VkAccelerationStructureBuildRangeInfoKHR structures. Each `ppBuildRangeInfos`[i] is a pointer to an array of `pInfos`[i].`geometryCount` VkAccelerationStructureBuildRangeInfoKHR structures defining dynamic offsets to the addresses where geometry data is stored, as defined by `pInfos`[i].

## Description

The `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 | This means that an application cannot build a top-level acceleration structure in the same vkCmdBuildAccelerationStructuresKHR call as the associated bottom-level or instance acceleration structures are being built. Similarly, the application cannot build a bottom-level acceleration structure in the same vkCmdBuildAccelerationStructuresKHR call as the associated micromaps 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.

The input buffers passed to this commands will be referenced by the implementation for the duration of this command’s execution on the device.

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. Micromaps must always be fully-self-contained.

The application can reuse or free any memory which was used by the command as an input or as scratch without affecting the results of future commands, provided proper synchronization is used as described below.

Note | A VkAccelerationStructureBuildRangeInfoKHR structure is not used when building an acceleration structure with any of the following geometry types, and must be NULL: VK_GEOMETRY_TYPE_DENSE_GEOMETRY_FORMAT_TRIANGLES_AMDX VK_GEOMETRY_TYPE_MICROMAP_KHR

Note | The required alignment of the device addresses passed in to parameters below might not be provided by the base address of a VkBuffer created with the correct usage flags and must still be manually aligned by the application code.

Accesses to the acceleration structure scratch buffers as identified by the VkAccelerationStructureBuildGeometryInfoKHR::`scratchData` buffer device addresses must be synchronized with the VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR pipeline stage and an access type of (VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_KHR | VK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_KHR). Accesses to each VkAccelerationStructureBuildGeometryInfoKHR::`srcAccelerationStructure` and VkAccelerationStructureBuildGeometryInfoKHR::`dstAccelerationStructure` must be synchronized with the VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR pipeline stage and an access type of VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_KHR or VK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_KHR, as appropriate.

Accesses to other input buffers as identified by any used values of VkAccelerationStructureGeometryMotionTrianglesDataNV::`vertexData`, VkAccelerationStructureGeometryMicromapDataKHR::`data`, VkAccelerationStructureGeometryMicromapDataKHR::`triangleArray`, VkAccelerationStructureDenseGeometryFormatTrianglesDataAMDX::`compressedData`, VkAccelerationStructureGeometryTrianglesDataKHR::`vertexData`, VkAccelerationStructureGeometryTrianglesDataKHR::`indexData`, VkAccelerationStructureGeometryTrianglesDataKHR::`transformData`, VkAccelerationStructureGeometryAabbsDataKHR::`data`, and VkAccelerationStructureGeometryInstancesDataKHR::`data` must be synchronized with the VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR pipeline stage and an access type of VK_ACCESS_SHADER_READ_BIT.

Valid Usage

- VUID-vkCmdBuildAccelerationStructuresKHR-accelerationStructure-08923
  The `VkPhysicalDeviceAccelerationStructureFeaturesKHR`::`accelerationStructure` feature must be enabled

- VUID-vkCmdBuildAccelerationStructuresKHR-ppBuildRangeInfos-11543
  Each element of `ppBuildRangeInfos`[i] must be a valid pointer to an array of `pInfos`[i].`geometryCount` `VkAccelerationStructureBuildRangeInfoKHR` structures if the `pInfos`[i].type is not one of:

  - VK_GEOMETRY_TYPE_DENSE_GEOMETRY_FORMAT_TRIANGLES_AMDX

  - VK_ACCELERATION_STRUCTURE_TYPE_OPACITY_MICROMAP_KHR

- VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-10906
  For each element of `pInfos`[i] whose `pGeometries` or `ppGeometries` members have a `geometryType` of VK_GEOMETRY_TYPE_DENSE_GEOMETRY_FORMAT_TRIANGLES_AMDX, `ppBuildRangeInfos`[i] must be `NULL`

- VUID-vkCmdBuildAccelerationStructuresKHR-ppBuildRangeInfos-11544
  For each element of `pInfos`[i] whose `pGeometries` or `ppGeometries` members have a `geometryType` of VK_GEOMETRY_TYPE_MICROMAP_KHR, `ppBuildRangeInfos`[i] must be `NULL`

- VUID-vkCmdBuildAccelerationStructuresKHR-mode-11545
  For each element of `pInfos`, if its `type` member is VK_ACCELERATION_STRUCTURE_TYPE_OPACITY_MICROMAP_KHR, its `mode` must equal VK_BUILD_ACCELERATION_STRUCTURE_MODE_BUILD_KHR

- VUID-vkCmdBuildAccelerationStructuresKHR-srcAccelerationStructure-11546
  For each element of `pInfos`, if its `type` member is VK_ACCELERATION_STRUCTURE_TYPE_OPACITY_MICROMAP_KHR, its `srcAccelerationStructure` must be VK_NULL_HANDLE

- VUID-vkCmdBuildAccelerationStructuresKHR-dstAccelerationStructure-11547
  For each element of `pInfos`, if its `type` member is VK_ACCELERATION_STRUCTURE_TYPE_OPACITY_MICROMAP_KHR, its `dstAccelerationStructure` member must have been created with a value of VkAccelerationStructureCreateInfoKHR::`type` equal to either VK_ACCELERATION_STRUCTURE_TYPE_OPACITY_MICROMAP_KHR or VK_ACCELERATION_STRUCTURE_TYPE_GENERIC_KHR

- VUID-vkCmdBuildAccelerationStructuresKHR-dstAccelerationStructure-11548
  The `dstAccelerationStructure` member of any element of `pInfos` must not be referenced by any VkAccelerationStructureTrianglesOpacityMicromapKHR::`micromap` member included in the `pNext` chain of any `geometry.triangles` member of any element of `pGeometries` or `ppGeometries` in any other element of `pInfos`

- VUID-vkCmdBuildAccelerationStructuresKHR-dstAccelerationStructure-11549
  The range of memory backing the `dstAccelerationStructure` member of any element of `pInfos` that is accessed by this command must not overlap the memory backing any VkAccelerationStructureTrianglesOpacityMicromapKHR::`micromap` member included in the `pNext` chain of any `geometry.triangles` member of any element of `pGeometries` or `ppGeometries` in any other element of `pInfos`, which is accessed by this command

- VUID-vkCmdBuildAccelerationStructuresKHR-micromap-11550
  For each element of `pInfos`[i].`pGeometries` or `pInfos`[i].`ppGeometries`, if it includes a VkAccelerationStructureGeometryMicromapDataKHR structure in its `pNext` chain, its `data` and `triangleArray` members must be a valid VkDeviceAddress

- VUID-vkCmdBuildAccelerationStructuresKHR-micromap-11551
  For each element of `pInfos`[i].`pGeometries` or `pInfos`[i].`ppGeometries`, if it includes a VkAccelerationStructureGeometryMicromapDataKHR structure in its `pNext` chain, the buffers from which the buffer device addresses for its `data` and `triangleArray` members are queried must have been created with the VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_BUILD_INPUT_READ_ONLY_BIT_KHR usage flag

- VUID-vkCmdBuildAccelerationStructuresKHR-micromap-11552
  For each element of `pInfos`[i].`pGeometries` or `pInfos`[i].`ppGeometries`, if it includes a VkAccelerationStructureGeometryMicromapDataKHR structure in its `pNext` chain, its `data` and `triangleArray` members must be a multiple of `128`

- VUID-vkCmdBuildAccelerationStructuresKHR-micromap-11553
  For each element of `pInfos`[i].`pGeometries` or `pInfos`[i].`ppGeometries`, if it includes a VkAccelerationStructureGeometryMicromapDataKHR structure in its `pNext` chain, each element of its `triangleArray` member must specify an access within the range of the VkBuffer that `data` was retrieved from, given by [`dataOffset`, `dataOffset`
  triangleSize] where triangleSize is calculated using its `format` and `subdivisionLevel` members rounded up to the nearest byte

- VUID-vkCmdBuildAccelerationStructuresKHR-micromap-11554
  For each element of `pInfos`[i].`pGeometries` or `pInfos`[i].`ppGeometries`, if it includes a VkAccelerationStructureGeometryMicromapDataKHR structure in its `pNext` chain, the range of [`triangleArray`, `triangleArray` + (`triangleArrayStride` * numTriangles)] must be within the range of the VkBuffer from which the `triangleArray` member was retrieved from, where numTriangles is the sum of `count` of all elements of `pUsageCounts` or `ppUsageCounts`

- VUID-vkCmdBuildAccelerationStructuresKHR-micromap-11555
  For each element of `pInfos`[i].`pGeometries` or `pInfos`[i].`ppGeometries`, if it includes a VkAccelerationStructureGeometryMicromapDataKHR structure in its `pNext` chain, each element of its `geometry.triangleArray` member must have a `format` with a valid value from VkOpacityMicromapFormatKHR

- VUID-vkCmdBuildAccelerationStructuresKHR-micromap-11556
  For each element of `pInfos`[i].`pGeometries` or `pInfos`[i].`ppGeometries`, if it includes a VkAccelerationStructureGeometryMicromapDataKHR structure in its `pNext` chain, for each element of its `triangleArray` member with a `format` equal to VK_OPACITY_MICROMAP_FORMAT_2_STATE_KHR, `subdivisionLevel` must be less than or equal to `maxOpacity2StateSubdivisionLevel`

- VUID-vkCmdBuildAccelerationStructuresKHR-indexBuffer-11575
  For each element of `pInfos`[i].`pGeometries` or `pInfos`[i].`ppGeometries` with a `geometryType` equal to VK_GEOMETRY_TYPE_TRIANGLES_KHR, if its `geometry.triangles` member includes a VkAccelerationStructureTrianglesOpacityMicromapKHR structure in its `pNext` chain, the micromap’s `indexType` member is not VK_INDEX_TYPE_NONE_KHR, and `micromap` is not VK_NULL_HANDLE, for each index in `indexBuffer`[j] greater than zero where j is within the range [0, numTrianglesInGeometry - 1] where numTrianglesInGeometry is equal to `ppBuildRangeInfos`[i]→primitiveCount, index plus `baseTriangle` must be less than or equal to numTriangles, where numTriangles is given by the sum of all `count` parameters in the `pUsageCounts` or `ppUsageCounts` provided to the micromap’s build command

- VUID-vkCmdBuildAccelerationStructuresKHR-indexBuffer-11577
  For each element of `pInfos`[i].`pGeometries` or `pInfos`[i].`ppGeometries` with a `geometryType` equal to VK_GEOMETRY_TYPE_TRIANGLES_KHR, if its `geometry.triangles` member includes a VkAccelerationStructureTrianglesOpacityMicromapKHR structure in its `pNext` chain, and the micromap’s `indexType` member is not VK_INDEX_TYPE_NONE_KHR, `indexBuffer`
  (`indexStride` * numTrianglesInGeometry) must be within the range of the VkBuffer from which the `indexBuffer` device address was obtained from where numTrianglesInGeometry is equal to `ppBuildRangeInfos`[i]→primitiveCount

- VUID-vkCmdBuildAccelerationStructuresKHR-indexBuffer-11578
  For each element of `pInfos`[i].`pGeometries` or `pInfos`[i].`ppGeometries` with a `geometryType` equal to VK_GEOMETRY_TYPE_TRIANGLES_KHR, if its `geometry.triangles` member includes a VkAccelerationStructureTrianglesOpacityMicromapKHR structure in its `pNext` chain, the micromap’s `indexType` member is not VK_INDEX_TYPE_NONE_KHR, and `micromap` is VK_NULL_HANDLE, for each index in `indexBuffer`[j] where j is within the range from [0, numTrianglesInGeometry - 1], index must be a valid VkOpacityMicromapSpecialIndexKHR value where numTrianglesInGeometry is equal to `ppBuildRangeInfos`[i]→primitiveCount

- VUID-vkCmdBuildAccelerationStructuresKHR-mode-04628
  The `mode` member of each element of `pInfos` must be a valid VkBuildAccelerationStructureModeKHR value

- VUID-vkCmdBuildAccelerationStructuresKHR-srcAccelerationStructure-04629
  If the `srcAccelerationStructure` member of any element of `pInfos` is not VK_NULL_HANDLE, the `srcAccelerationStructure` member must be a valid VkAccelerationStructureKHR handle

- VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-04630
  For each element of `pInfos`, if its `mode` member is VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR, its `srcAccelerationStructure` member must not be VK_NULL_HANDLE

- VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-03708
  For each element of `pInfos`, if its `mode` member is VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR, `srcAccelerationStructure` must be fully backed by physical memory

- VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-03403
  The `srcAccelerationStructure` member of any element of `pInfos` must not be the same acceleration structure as the `dstAccelerationStructure` member of any other element of `pInfos`

- VUID-vkCmdBuildAccelerationStructuresKHR-dstAccelerationStructure-03698
  The `dstAccelerationStructure` member of any element of `pInfos` must not be the same acceleration structure as the `dstAccelerationStructure` member of any other element of `pInfos`

- VUID-vkCmdBuildAccelerationStructuresKHR-dstAccelerationStructure-03800
  The `dstAccelerationStructure` member of any element of `pInfos` must be a valid VkAccelerationStructureKHR handle

- VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-03707
  For each element of `pInfos`, its `dstAccelerationStructure` member must be fully backed by physical memory

- VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-03699
  For each element of `pInfos`, if its `type` member is VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_KHR, its `dstAccelerationStructure` member must have been created with a value of VkAccelerationStructureCreateInfoKHR::`type` equal to either VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_KHR or VK_ACCELERATION_STRUCTURE_TYPE_GENERIC_KHR

- VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-03700
  For each element of `pInfos`, if its `type` member is VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_KHR, its `dstAccelerationStructure` member must have been created with a value of VkAccelerationStructureCreateInfoKHR::`type` equal to either VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_KHR or VK_ACCELERATION_STRUCTURE_TYPE_GENERIC_KHR

- VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-03663
  For each element of `pInfos`, if its `mode` member is VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR, inactive primitives in its `srcAccelerationStructure` member must not be made active

- VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-03664
  For each element of `pInfos`, if its `mode` member is VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR, active primitives in its `srcAccelerationStructure` member must not be made inactive

- VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-03709
  For each element of `pInfos`, if an acceleration structure is referenced by the `geometry.instances.data` member of any element of `pGeometries` or `ppGeometries` with a `geometryType` of VK_GEOMETRY_TYPE_INSTANCES_KHR, it must be fully backed by physical memory

- VUID-vkCmdBuildAccelerationStructuresKHR-None-03407
  The `dstAccelerationStructure` member of any element of `pInfos` must not be referenced by the `geometry.instances.data` member of any element of `pGeometries` or `ppGeometries` with a `geometryType` of VK_GEOMETRY_TYPE_INSTANCES_KHR in any other element of `pInfos`

- VUID-vkCmdBuildAccelerationStructuresKHR-dstAccelerationStructure-03701
  The range of memory backing the `dstAccelerationStructure` member of any element of `pInfos` that is accessed by this command must not overlap the memory backing the `srcAccelerationStructure` member of any other element of `pInfos` with a `mode` equal to VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR, which is accessed by this command

- VUID-vkCmdBuildAccelerationStructuresKHR-dstAccelerationStructure-03702
  The range of memory backing the `dstAccelerationStructure` member of any element of `pInfos` that is accessed by this command must not overlap the memory backing the `dstAccelerationStructure` member of any other element of `pInfos`, which is accessed by this command

- VUID-vkCmdBuildAccelerationStructuresKHR-dstAccelerationStructure-03703
  The range of memory backing the `dstAccelerationStructure` member of any element of `pInfos` that is accessed by this command must not overlap the memory backing the `scratchData` member of any element of `pInfos` (including the same element), which is accessed by this command

- VUID-vkCmdBuildAccelerationStructuresKHR-scratchData-03704
  The range of memory backing the `scratchData` member of any element of `pInfos` that is accessed by this command must not overlap the memory backing the `scratchData` member of any other element of `pInfos`, which is accessed by this command

- VUID-vkCmdBuildAccelerationStructuresKHR-scratchData-03705
  The range of memory backing the `scratchData` member of any element of `pInfos` that is accessed by this command must not overlap the memory backing the `srcAccelerationStructure` member of any element of `pInfos` with a `mode` equal to VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR (including the same element), which is accessed by this command

- VUID-vkCmdBuildAccelerationStructuresKHR-dstAccelerationStructure-03706
  The range of memory backing the `dstAccelerationStructure` member of any element of `pInfos` that is accessed by this command must not overlap the memory backing any acceleration structure referenced by the `geometry.instances.data` member of any element of `pGeometries` or `ppGeometries` with a `geometryType` of VK_GEOMETRY_TYPE_INSTANCES_KHR in any other element of `pInfos`, which is accessed by this command

- VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-03667
  For each element of `pInfos`, if its `mode` member is VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR, its `srcAccelerationStructure` member must have previously been constructed with VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_UPDATE_BIT_KHR set in VkAccelerationStructureBuildGeometryInfoKHR::`flags` in the build

- VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-03668
  For each element of `pInfos`, if its `mode` member is VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR, its `srcAccelerationStructure` and `dstAccelerationStructure` members must either be the same VkAccelerationStructureKHR, or not have any memory aliasing

- VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-03758
  For each element of `pInfos`, if its `mode` member is VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR, its `geometryCount` member must have the same value which was specified when `srcAccelerationStructure` was last built

- VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-03759
  For each element of `pInfos`, if its `mode` member is VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR, its `flags` member must have the same value which was specified when `srcAccelerationStructure` was last built

- VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-03760
  For each element of `pInfos`, if its `mode` member is VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR, its `type` member must have the same value which was specified when `srcAccelerationStructure` was last built

- VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-03761
  For each element of `pInfos`, if its `mode` member is VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR, then for each `VkAccelerationStructureGeometryKHR` structure referred to by its `pGeometries` or `ppGeometries` members, its `geometryType` member must have the same value which was specified when `srcAccelerationStructure` was last built

- VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-03762
  For each element of `pInfos`, if its `mode` member is VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR, then for each `VkAccelerationStructureGeometryKHR` structure referred to by its `pGeometries` or `ppGeometries` members, its `flags` member must have the same value which was specified when `srcAccelerationStructure` was last built

- VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-03763
  For each element of `pInfos`, if its `mode` member is VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR, then for each `VkAccelerationStructureGeometryKHR` structure referred to by its `pGeometries` or `ppGeometries` members, if `geometryType` is VK_GEOMETRY_TYPE_TRIANGLES_KHR, its `geometry.triangles.vertexFormat` member must have the same value which was specified when `srcAccelerationStructure` was last built

- VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-03764
  For each element of `pInfos`, if its `mode` member is VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR, then for each `VkAccelerationStructureGeometryKHR` structure referred to by its `pGeometries` or `ppGeometries` members, if `geometryType` is VK_GEOMETRY_TYPE_TRIANGLES_KHR, its `geometry.triangles.maxVertex` member must have the same value which was specified when `srcAccelerationStructure` was last built

- VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-03765
  For each element of `pInfos`, if its `mode` member is VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR, then for each `VkAccelerationStructureGeometryKHR` structure referred to by its `pGeometries` or `ppGeometries` members, if `geometryType` is VK_GEOMETRY_TYPE_TRIANGLES_KHR, its `geometry.triangles.indexType` member must have the same value which was specified when `srcAccelerationStructure` was last built

- VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-03766
  For each element of `pInfos`, if its `mode` member is VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR, then for each `VkAccelerationStructureGeometryKHR` structure referred to by its `pGeometries` or `ppGeometries` members, if `geometryType` is VK_GEOMETRY_TYPE_TRIANGLES_KHR, if its `geometry.triangles.transformData` address was `NULL` when `srcAccelerationStructure` was last built, then it must be `NULL`

- VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-03767
  For each element of `pInfos`, if its `mode` member is VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR, then for each `VkAccelerationStructureGeometryKHR` structure referred to by its `pGeometries` or `ppGeometries` members, if `geometryType` is VK_GEOMETRY_TYPE_TRIANGLES_KHR, if its `geometry.triangles.transformData` address was not `NULL` when `srcAccelerationStructure` was last built, then it must not be `NULL`

- VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-10898
  For each element of `pInfos`, if its `mode` member is VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR, then for each `VkAccelerationStructureGeometryKHR` structure referred to by its `pGeometries` or `ppGeometries` members, if `geometryType` is VK_GEOMETRY_TYPE_DENSE_GEOMETRY_FORMAT_TRIANGLES_AMDX, the `numTriangles` member of the `VkAccelerationStructureDenseGeometryFormatTrianglesDataAMDX` structure in the `pNext` chain must have the same value which was specified when `srcAccelerationStructure` was last built

- VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-10899
  For each element of `pInfos`, if its `mode` member is VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR, then for each `VkAccelerationStructureGeometryKHR` structure referred to by its `pGeometries` or `ppGeometries` members, if `geometryType` is VK_GEOMETRY_TYPE_DENSE_GEOMETRY_FORMAT_TRIANGLES_AMDX, the `numVertices` member of the `VkAccelerationStructureDenseGeometryFormatTrianglesDataAMDX` structure in the `pNext` chain must have the same value which was specified when `srcAccelerationStructure` was last built

- VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-10900
  For each element of `pInfos`, if its `mode` member is VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR, then for each `VkAccelerationStructureGeometryKHR` structure referred to by its `pGeometries` or `ppGeometries` members, if `geometryType` is VK_GEOMETRY_TYPE_DENSE_GEOMETRY_FORMAT_TRIANGLES_AMDX, the `maxPrimitiveIndex` member of the `VkAccelerationStructureDenseGeometryFormatTrianglesDataAMDX` structure in the `pNext` chain must have the same value which was specified when `srcAccelerationStructure` was last built

- VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-10901
  For each element of `pInfos`, if its `mode` member is VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR, then for each `VkAccelerationStructureGeometryKHR` structure referred to by its `pGeometries` or `ppGeometries` members, if `geometryType` is VK_GEOMETRY_TYPE_DENSE_GEOMETRY_FORMAT_TRIANGLES_AMDX, the `maxGeometryIndex` member of the `VkAccelerationStructureDenseGeometryFormatTrianglesDataAMDX` structure in the `pNext` chain must have the same value which was specified when `srcAccelerationStructure` was last built

- VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-10902
  For each element of `pInfos`, if its `mode` member is VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR, then for each `VkAccelerationStructureGeometryKHR` structure referred to by its `pGeometries` or `ppGeometries` members, if `geometryType` is VK_GEOMETRY_TYPE_DENSE_GEOMETRY_FORMAT_TRIANGLES_AMDX, the `format` member of the `VkAccelerationStructureDenseGeometryFormatTrianglesDataAMDX` structure in the `pNext` chain must have the same value which was specified when `srcAccelerationStructure` was last built

- VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-10903
  For each element of `pInfos`, if its `mode` member is VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR, then for each `VkAccelerationStructureGeometryKHR` structure referred to by its `pGeometries` or `ppGeometries` members, if `geometryType` is VK_GEOMETRY_TYPE_DENSE_GEOMETRY_FORMAT_TRIANGLES_AMDX, the `dataSize` member of the `VkAccelerationStructureDenseGeometryFormatTrianglesDataAMDX` structure in the `pNext` chain must have the same value which was specified when `srcAccelerationStructure` was last built

- VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-03768
  For each element of `pInfos`, if its `mode` member is VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR, then for each `VkAccelerationStructureGeometryKHR` structure referred to by its `pGeometries` or `ppGeometries` members, if `geometryType` is VK_GEOMETRY_TYPE_TRIANGLES_KHR, and `geometry.triangles.indexType` is not VK_INDEX_TYPE_NONE_KHR, then the value of each index referenced must be the same as the corresponding index value when `srcAccelerationStructure` was last built

- VUID-vkCmdBuildAccelerationStructuresKHR-primitiveCount-03769
  For each element of `pInfos`, if its `mode` member is VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR, then for each `VkAccelerationStructureGeometryKHR` structure referred to by its `pGeometries` or `ppGeometries` members, the `primitiveCount` member of its corresponding `VkAccelerationStructureBuildRangeInfoKHR` structure must have the same value which was specified when `srcAccelerationStructure` was last built

- VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-03801
  For each element of `pInfos`[i].`pGeometries` or `pInfos`[i].`ppGeometries` with a `geometryType` of VK_GEOMETRY_TYPE_INSTANCES_KHR, the corresponding `ppBuildRangeInfos`[i][j].`primitiveCount` must be less than or equal to VkPhysicalDeviceAccelerationStructurePropertiesKHR::`maxInstanceCount`

- VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-12258
  If `pInfos`[i].`mode` is VK_BUILD_ACCELERATION_STRUCTURE_MODE_BUILD_KHR, and N is not `0`, all addresses between `pInfos`[i].`scratchData.deviceAddress` and `pInfos`[i].`scratchData.deviceAddress` + N - 1 must be in the buffer device address range of the same buffer, where N is given by the `buildScratchSize` member of the VkAccelerationStructureBuildSizesInfoKHR structure returned from a call to vkGetAccelerationStructureBuildSizesKHR with an identical VkAccelerationStructureBuildGeometryInfoKHR structure and primitive count

- VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-12259
  If `pInfos`[i].`mode` is VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR, and N is not `0`, all addresses between `pInfos`[i].`scratchData.deviceAddress` and `pInfos`[i].`scratchData.deviceAddress` + N - 1 must be in the buffer device address range of the same buffer, where N is given by the `updateScratchSize` member of the VkAccelerationStructureBuildSizesInfoKHR structure returned from a call to vkGetAccelerationStructureBuildSizesKHR with an identical VkAccelerationStructureBuildGeometryInfoKHR structure and primitive count

- VUID-vkCmdBuildAccelerationStructuresKHR-geometry-03673
  The buffers from which the buffer device addresses for all of the `geometry.triangles.vertexData`, `geometry.triangles.indexData`, `geometry.triangles.transformData`, `geometry.aabbs.data`, and `geometry.instances.data` members of all `pInfos`[i].`pGeometries` and `pInfos`[i].`ppGeometries` are queried must have been created with the VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_BUILD_INPUT_READ_ONLY_BIT_KHR usage flag set

- VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-12260
  If `pInfos`[i].`mode` is VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR, and the size reported by `updateScratchSize` member of the VkAccelerationStructureBuildSizesInfoKHR structure returned from a call to vkGetAccelerationStructureBuildSizesKHR with an identical VkAccelerationStructureBuildGeometryInfoKHR structure and primitive count is non-zero, `pInfos`[i].`scratchData.deviceAddress` must be a device address allocated to the application from a buffer created with the VK_BUFFER_USAGE_STORAGE_BUFFER_BIT usage flag set

- VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-12261
  If `pInfos`[i].`mode` is VK_BUILD_ACCELERATION_STRUCTURE_MODE_BUILD_KHR, and the size reported by `buildScratchSize` member of the VkAccelerationStructureBuildSizesInfoKHR structure returned from a call to vkGetAccelerationStructureBuildSizesKHR with an identical VkAccelerationStructureBuildGeometryInfoKHR structure and primitive count is non-zero, `pInfos`[i].`scratchData.deviceAddress` must be a device address allocated to the application from a buffer created with the VK_BUFFER_USAGE_STORAGE_BUFFER_BIT usage flag set

- VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-03710
  For each element of `pInfos`, its `scratchData.deviceAddress` member must be a multiple of VkPhysicalDeviceAccelerationStructurePropertiesKHR::`minAccelerationStructureScratchOffsetAlignment`

- VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-03804
  For each element of `pInfos`[i].`pGeometries` or `pInfos`[i].`ppGeometries` with a `geometryType` of VK_GEOMETRY_TYPE_TRIANGLES_KHR, `geometry.triangles.vertexData.deviceAddress` must be a valid VkDeviceAddress

- VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-03711
  For each element of `pInfos`[i].`pGeometries` or `pInfos`[i].`ppGeometries` with a `geometryType` of VK_GEOMETRY_TYPE_TRIANGLES_KHR, `geometry.triangles.vertexData.deviceAddress` must be aligned to:

  - the size of the format specified in `vertexFormat`, in bytes, if that format is a packed format

  - the component size of the format specified in `vertexFormat`, in bytes, if that format is not a packed format

- VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-03806
  For each element of `pInfos`[i].`pGeometries` or `pInfos`[i].`ppGeometries` with a `geometryType` of VK_GEOMETRY_TYPE_TRIANGLES_KHR, if `geometry.triangles.indexType` is not VK_INDEX_TYPE_NONE_KHR, `geometry.triangles.indexData.deviceAddress` must be a valid VkDeviceAddress

- VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-03712
  For each element of `pInfos`[i].`pGeometries` or `pInfos`[i].`ppGeometries` with a `geometryType` of VK_GEOMETRY_TYPE_TRIANGLES_KHR, and with `geometry.triangles.indexType` not equal to VK_INDEX_TYPE_NONE_KHR, `geometry.triangles.indexData.deviceAddress` must be aligned to the size in bytes of the type in `indexType`

- VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-03808
  For each element of `pInfos`[i].`pGeometries` or `pInfos`[i].`ppGeometries` with a `geometryType` of VK_GEOMETRY_TYPE_TRIANGLES_KHR, if `geometry.triangles.transformData.deviceAddress` is not `0`, it must be a valid VkDeviceAddress

- VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-03810
  For each element of `pInfos`[i].`pGeometries` or `pInfos`[i].`ppGeometries` with a `geometryType` of VK_GEOMETRY_TYPE_TRIANGLES_KHR, if `geometry.triangles.transformData.deviceAddress` is not `0`, it must be aligned to `16` bytes

- VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-03811
  For each element of `pInfos`[i].`pGeometries` or `pInfos`[i].`ppGeometries` with a `geometryType` of VK_GEOMETRY_TYPE_AABBS_KHR, `geometry.aabbs.data.deviceAddress` must be a valid VkDeviceAddress

- VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-03714
  For each element of `pInfos`[i].`pGeometries` or `pInfos`[i].`ppGeometries` with a `geometryType` of VK_GEOMETRY_TYPE_AABBS_KHR, `geometry.aabbs.data.deviceAddress` must be aligned to `8` bytes

- VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-03715
  For each element of `pInfos`[i].`pGeometries` or `pInfos`[i].`ppGeometries` with a `geometryType` of VK_GEOMETRY_TYPE_INSTANCES_KHR, if `geometry.arrayOfPointers` is VK_FALSE, `geometry.instances.data.deviceAddress` must be aligned to `16` bytes

- VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-03716
  For each element of `pInfos`[i].`pGeometries` or `pInfos`[i].`ppGeometries` with a `geometryType` of VK_GEOMETRY_TYPE_INSTANCES_KHR, if `geometry.arrayOfPointers` is VK_TRUE, `geometry.instances.data.deviceAddress` must be aligned to `8` bytes

- VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-03717
  For each element of `pInfos`[i].`pGeometries` or `pInfos`[i].`ppGeometries` with a `geometryType` of VK_GEOMETRY_TYPE_INSTANCES_KHR, if `geometry.arrayOfPointers` is VK_TRUE, each element of `geometry.instances.data.deviceAddress` in device memory must be aligned to `16` bytes

- VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-03813
  For each element of `pInfos`[i].`pGeometries` or `pInfos`[i].`ppGeometries` with a `geometryType` of VK_GEOMETRY_TYPE_INSTANCES_KHR, `geometry.instances.data.deviceAddress` must be a valid VkDeviceAddress

- VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-12281
  For each element of `pInfos`[i].`pGeometries` or `pInfos`[i].`ppGeometries` with a `geometryType` of VK_GEOMETRY_TYPE_INSTANCES_KHR, each VkAccelerationStructureInstanceKHR::`accelerationStructureReference` value in `geometry.instances.data.deviceAddress` must be `0` or a value obtained from vkGetAccelerationStructureDeviceAddressKHR for a valid bottom level acceleration structure

- VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-10607
  For each element of `pInfos`[i].`pGeometries` or `pInfos`[i].`ppGeometries` with a `geometryType` of VK_GEOMETRY_TYPE_INSTANCES_KHR, if VK_GEOMETRY_INSTANCE_DISABLE_OPACITY_MICROMAPS_BIT_KHR is set in VkAccelerationStructureInstanceKHR::`flags` then `geometry.instances.data.deviceAddress` must refer to an acceleration structure that was built with VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_DISABLE_OPACITY_MICROMAPS_BIT_KHR set in VkAccelerationStructureBuildGeometryInfoKHR::`flags`

- VUID-vkCmdBuildAccelerationStructuresKHR-commandBuffer-09547
  `commandBuffer` must not be a protected command buffer

- VUID-vkCmdBuildAccelerationStructuresKHR-micromap-11701
  For any element of `pInfos`[i].`pGeometries` or `pInfos`[i].`ppGeometries` with a `geometryType` of VK_GEOMETRY_TYPE_TRIANGLES_KHR, if there is an instance of VkAccelerationStructureTrianglesOpacityMicromapKHR in the `geometry.triangles.pNext` chain with a valid `micromap` member, then the `micromap` member must have been constructed prior to this command’s execution on the device

- VUID-vkCmdBuildAccelerationStructuresKHR-micromap-11624
  For any element of `pInfos`[i].`pGeometries` or `pInfos`[i].`ppGeometries` with a `geometryType` of VK_GEOMETRY_TYPE_TRIANGLES_KHR, if there is an instance of VkAccelerationStructureTrianglesOpacityMicromapKHR in the `geometry.triangles.pNext` chain with a valid `micromap` member, then the `micromap` member must have been built with a `type` of VK_ACCELERATION_STRUCTURE_TYPE_OPACITY_MICROMAP_KHR

- VUID-vkCmdBuildAccelerationStructuresKHR-micromap-11625
  For each element of `pInfos`, if its `mode` member is VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR, then for each `VkAccelerationStructureGeometryKHR` structure referred to by its `pGeometries` or `ppGeometries` members, if `geometryType` is VK_GEOMETRY_TYPE_TRIANGLES_KHR, and the same geometry in the original build of `srcAccelerationStructure` was built with an instance of VkAccelerationStructureTrianglesOpacityMicromapKHR in its `geometry.triangles.pNext` chain with a valid `micromap` member, then an instance of VkAccelerationStructureTrianglesOpacityMicromapKHR must be included in the in the `geometry.triangles.pNext` chain with a valid `micromap` member

- VUID-vkCmdBuildAccelerationStructuresKHR-micromap-11626
  For each element of `pInfos`, if its `mode` member is VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR, then for each `VkAccelerationStructureGeometryKHR` structure referred to by its `pGeometries` or `ppGeometries` members, if `geometryType` is VK_GEOMETRY_TYPE_TRIANGLES_KHR, and the same geometry in the original build of `srcAccelerationStructure` was built with an instance of VkAccelerationStructureTrianglesOpacityMicromapKHR in its `geometry.triangles.pNext` chain with its `micromap` member equal to `VK_NULL_HANDLE`, then an instance of VkAccelerationStructureTrianglesOpacityMicromapKHR must be included in the in the `geometry.triangles.pNext` chain with its `micromap` member equal to `VK_NULL_HANDLE`

- VUID-vkCmdBuildAccelerationStructuresKHR-micromap-11627
  For each element of `pInfos`, if its `mode` member is VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR, then for each `VkAccelerationStructureGeometryKHR` structure referred to by its `pGeometries` or `ppGeometries` members, if `geometryType` is VK_GEOMETRY_TYPE_TRIANGLES_KHR, and the same geometry in the original build of `srcAccelerationStructure` was not built with an instance of VkAccelerationStructureTrianglesOpacityMicromapKHR in its `geometry.triangles.pNext` chain, then an instance of VkAccelerationStructureTrianglesOpacityMicromapKHR must not be included in the in the `geometry.triangles.pNext` chain

- VUID-vkCmdBuildAccelerationStructuresKHR-micromap-11628
  For each element of `pInfos`, if its `mode` member is VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR, its `srcAccelerationStructure` was originally built without the VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_OPACITY_MICROMAP_UPDATE_BIT_KHR flag, and `srcAccelerationStructure` was constructed by deserialization with vkCmdCopyMemoryToAccelerationStructureKHR, then for each `VkAccelerationStructureGeometryKHR` structure referred to by its `pGeometries` or `ppGeometries` members, if `geometryType` is VK_GEOMETRY_TYPE_TRIANGLES_KHR, and the same geometry in the original build of `srcAccelerationStructure` was built with an instance of VkAccelerationStructureTrianglesOpacityMicromapKHR in its `geometry.triangles.pNext` chain with a valid `micromap` member, then an instance of VkAccelerationStructureTrianglesOpacityMicromapKHR must be included in the in the `geometry.triangles.pNext` chain with a `micromap` that was deserialized from the serialized data of the `micromap` in the original build of `srcAccelerationStructure`

- VUID-vkCmdBuildAccelerationStructuresKHR-micromap-11629
  For each element of `pInfos`, if its `mode` member is VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR, its `srcAccelerationStructure` was originally built without either the VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_OPACITY_MICROMAP_DATA_UPDATE_BIT_EXT or the VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_OPACITY_MICROMAP_UPDATE_BIT_KHR flags, and `srcAccelerationStructure` was not constructed by deserialization with vkCmdCopyMemoryToAccelerationStructureKHR, then for each `VkAccelerationStructureGeometryKHR` structure referred to by its `pGeometries` or `ppGeometries` members, if `geometryType` is VK_GEOMETRY_TYPE_TRIANGLES_KHR, and the same geometry in the original build of `srcAccelerationStructure` was built with an instance of VkAccelerationStructureTrianglesOpacityMicromapKHR in its `geometry.triangles.pNext` chain with a valid `micromap` member, then an instance of VkAccelerationStructureTrianglesOpacityMicromapKHR must be included in the in the `geometry.triangles.pNext` chain with the same `micromap` handle as the original build

- VUID-vkCmdBuildAccelerationStructuresKHR-micromap-11632
  For any element of `pInfos`[i].`pGeometries` or `pInfos`[i].`ppGeometries` with a `geometryType` of VK_GEOMETRY_TYPE_TRIANGLES_KHR, if there is an instance of VkAccelerationStructureTrianglesOpacityMicromapEXT in the `geometry.triangles.pNext` chain, then its `micromap` member must have been constructed prior to this command’s execution on the device

- VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-10904
  For each element of `pInfos`[i].`pGeometries` or `pInfos`[i].`ppGeometries` with a `geometryType` of VK_GEOMETRY_TYPE_TRIANGLES_KHR, if there is an instance of VkAccelerationStructureTrianglesOpacityMicromapEXT in the `geometry.triangles.pNext` chain, and its `indexType` is VK_INDEX_TYPE_NONE_KHR, then its `indexBuffer.deviceAddress` must be 0

- VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-10905
  For each element of `pInfos`[i].`pGeometries` or `pInfos`[i].`ppGeometries` with a `geometryType` of VK_GEOMETRY_TYPE_TRIANGLES_KHR, if there is an instance of VkAccelerationStructureTrianglesOpacityMicromapEXT in the `geometry.triangles.pNext` chain, and its `indexType` is not VK_INDEX_TYPE_NONE_KHR, then its `indexBuffer.deviceAddress` must be a valid VkDeviceAddress

- VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-11846
  For each element of `pInfos`[i].`pGeometries` or `pInfos`[i].`ppGeometries` with a `geometryType` of VK_GEOMETRY_TYPE_SPHERES_NV, if VkAccelerationStructureGeometrySpheresDataNV::`indexType` is VK_INDEX_TYPE_NONE_KHR, then its `indexData.deviceAddress` must be 0

- VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-11847
  For each element of `pInfos`[i].`pGeometries` or `pInfos`[i].`ppGeometries` with a `geometryType` of VK_GEOMETRY_TYPE_SPHERES_NV, if VkAccelerationStructureGeometrySpheresDataNV::`indexType` is not VK_INDEX_TYPE_NONE_KHR, then its `indexData.deviceAddress` must be a valid VkDeviceAddress

- VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-11848
  For each element of `pInfos`[i].`pGeometries` or `pInfos`[i].`ppGeometries` with a `geometryType` of VK_GEOMETRY_TYPE_SPHERES_NV, VkAccelerationStructureGeometrySpheresDataNV::`vertexData.deviceAddress` must be a valid VkDeviceAddress

- VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-11849
  For each element of `pInfos`[i].`pGeometries` or `pInfos`[i].`ppGeometries` with a `geometryType` of VK_GEOMETRY_TYPE_SPHERES_NV, VkAccelerationStructureGeometrySpheresDataNV::`radiusData.deviceAddress` must be a valid VkDeviceAddress

- VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-11850
  For each element of `pInfos`[i].`pGeometries` or `pInfos`[i].`ppGeometries` with a `geometryType` of VK_GEOMETRY_TYPE_LINEAR_SWEPT_SPHERES_NV, if VkAccelerationStructureGeometryLinearSweptSpheresDataNV::`indexType` is VK_INDEX_TYPE_NONE_KHR, then its `indexData.deviceAddress` must be 0

- VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-11851
  For each element of `pInfos`[i].`pGeometries` or `pInfos`[i].`ppGeometries` with a `geometryType` of VK_GEOMETRY_TYPE_LINEAR_SWEPT_SPHERES_NV, if VkAccelerationStructureGeometryLinearSweptSpheresDataNV::`indexType` is not VK_INDEX_TYPE_NONE_KHR, then its `indexData.deviceAddress` must be a valid VkDeviceAddress

- VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-11852
  For each element of `pInfos`[i].`pGeometries` or `pInfos`[i].`ppGeometries` with a `geometryType` of VK_GEOMETRY_TYPE_LINEAR_SWEPT_SPHERES_NV, VkAccelerationStructureGeometryLinearSweptSpheresDataNV::`vertexData.deviceAddress` must be a valid VkDeviceAddress

- VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-11853
  For each element of `pInfos`[i].`pGeometries` or `pInfos`[i].`ppGeometries` with a `geometryType` of VK_GEOMETRY_TYPE_LINEAR_SWEPT_SPHERES_NV, VkAccelerationStructureGeometryLinearSweptSpheresDataNV::`radiusData.deviceAddress` must be a valid VkDeviceAddress

- VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-10126
  For each `pInfos`[i], `dstAccelerationStructure` must have been created with a value of VkAccelerationStructureCreateInfoKHR::`size` greater than or equal to either:

  - the memory size required by the build operation, as returned by vkGetAccelerationStructureBuildSizesKHR with `pBuildInfo` = `pInfos`[i] and with each element of the `pMaxPrimitiveCounts` array greater than or equal to the equivalent `ppBuildRangeInfos`[i][j].`primitiveCount` values for `j` in [0,`pInfos`[i].`geometryCount`) or,

  - the result of querying the corresponding VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR, if updating a compacted acceleration structure

- VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-11845
  For each element of `pInfos`[i].`pGeometries` or `pInfos`[i].`ppGeometries` with a `geometryType` of VK_GEOMETRY_TYPE_TRIANGLES_KHR, if there is an instance of VkAccelerationStructureGeometryMotionTrianglesDataNV in the `geometry.triangles.pNext` chain, then its `vertexData.deviceAddress` must be a valid VkDeviceAddress

Valid Usage (Implicit)

- VUID-vkCmdBuildAccelerationStructuresKHR-commandBuffer-parameter
  `commandBuffer` must be a valid VkCommandBuffer handle

- VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-parameter
  `pInfos` must be a valid pointer to an array of `infoCount` valid VkAccelerationStructureBuildGeometryInfoKHR structures

- VUID-vkCmdBuildAccelerationStructuresKHR-ppBuildRangeInfos-parameter
  `ppBuildRangeInfos` must be a valid pointer to an array of `infoCount` VkAccelerationStructureBuildRangeInfoKHR structures

- VUID-vkCmdBuildAccelerationStructuresKHR-commandBuffer-recording
  `commandBuffer` must be in the recording state

- VUID-vkCmdBuildAccelerationStructuresKHR-commandBuffer-cmdpool
  The `VkCommandPool` that `commandBuffer` was allocated from must support VK_QUEUE_COMPUTE_BIT operations

- VUID-vkCmdBuildAccelerationStructuresKHR-renderpass
  This command must only be called outside of a render pass instance

- VUID-vkCmdBuildAccelerationStructuresKHR-suspended
  This command must not be called between suspended render pass instances

- VUID-vkCmdBuildAccelerationStructuresKHR-videocoding
  This command must only be called outside of a video coding scope

- VUID-vkCmdBuildAccelerationStructuresKHR-infoCount-arraylength
  `infoCount` must be greater than `0`

Host Synchronization

- Host access to `commandBuffer` must be externally synchronized

- Host access to the `VkCommandPool` that `commandBuffer` was allocated from must be externally synchronized

Command Properties

Command Buffer Levels | Render Pass Scope | Video Coding Scope | Supported Queue Types | Command Type
--- | --- | --- | --- | ---
Primary Secondary | Outside | Outside | VK_QUEUE_COMPUTE_BIT | Action

Conditional Rendering

vkCmdBuildAccelerationStructuresKHR is not affected by conditional rendering

## See Also

VK_KHR_acceleration_structure, VkAccelerationStructureBuildGeometryInfoKHR, VkAccelerationStructureBuildRangeInfoKHR, VkCommandBuffer

## Document Notes

For more information, see the Vulkan Specification.

This page is extracted from the Vulkan Specification. Fixes and changes should be made to the Specification, not directly.

## Copyright

Copyright 2014-2026 The Khronos Group Inc.

SPDX-License-Identifier: CC-BY-4.0