加速结构

加速结构

加速结构是实现用来有效地管理场景几何体的数据结构,在光线追踪查询期间遍历时会用到。应用程序负责管理加速结构对象(参见加速结构),包括分配、销毁、执行构建或更新以及同步光线追踪查询期间使用的资源。

有两种类型的加速结构,顶层加速结构底层加速结构

如果已执行将给定加速结构作为目标的加速结构构建命令复制命令,则认为加速结构已构建。

accelstruct
图 1. 加速结构
标题

该图显示了顶层和底层加速结构之间的关系。

几何体

几何体是指三角形或轴对齐边界框。

顶层加速结构

用于实例数组的不透明加速结构。引用此结构的描述符或设备地址是遍历的起始点。

顶层加速结构会引用其实例引用的任何底层加速结构。当访问顶层加速结构时,这些底层加速结构对象必须有效。

底层加速结构

用于几何体数组的不透明加速结构。

加速结构更新规则

API 定义了两种从几何体生成加速结构的操作

  • 构建操作用于构造加速结构。

  • 更新操作用于修改现有的加速结构。

更新操作对输入施加一定的约束,以换取更快的执行速度。执行更新时,应用程序需要提供加速结构的完整描述,但禁止更改实例定义、变换矩阵和顶点或 AABB 位置之外的任何内容。描述的所有其他方面必须与原始构建中的完全匹配。

更准确地说,应用程序必须不使用更新操作来执行以下任何操作

  • 将基元或实例从活动更改为非活动,反之亦然(如非活动基元和实例中所定义)。

  • 更改三角形几何体的索引或顶点格式。

  • 将三角形几何体变换指针从 null 更改为非 null,反之亦然。

  • 更改结构中几何体或实例的数量。

  • 更改结构中任何几何体的几何体标志。

  • 更改结构中任何几何体的顶点或基元的数量。

如果原始加速结构是使用不透明微型映射构建的,并且在 flags 中设置了 VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_OPACITY_MICROMAP_DATA_UPDATE_EXT,则应用程序必须向更新操作提供相应的微型映射信息。应用程序禁止更改分配给三角形的特定不透明度值之外的任何内容。

更准确地说,应用程序必须不使用更新操作来执行以下任何操作

如果原始加速结构是使用不透明微型映射构建的,并且在 flags 中设置了 VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_OPACITY_MICROMAP_UPDATE_EXT,则应用程序必须向更新操作提供微型映射。

如果原始加速结构是使用不透明微型映射构建的,并且未设置不透明微型映射更新标志,则应用程序必须向更新操作提供原始微型映射。

如果原始加速结构是使用位移微型映射构建的,并且在 flags 中设置了 VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_DISPLACEMENT_MICROMAP_UPDATE_NV,则应用程序必须向更新操作提供位移微型映射。

如果原始加速结构是使用位移微型映射构建的,并且未设置位移微型映射更新标志,则应用程序必须向更新操作提供原始微型映射。

非活动基元和实例

加速结构允许使用特定的输入值来表示非活动的基元或实例。

如果任何顶点的第一个 (X) 分量是 NaN,则三角形是非活动的。如果任何其他顶点分量是 NaN,而第一个分量不是,则行为是未定义的。如果顶点格式没有 NaN 表示形式,则所有三角形都被视为活动状态。

如果实例的加速结构引用为 0,则该实例是非活动的。

一个非激活的 AABB 是指其最小 X 坐标为 NaN 的 AABB。如果任何其他分量为 NaN,而第一个不是,则行为是未定义的

在以上定义中,“NaN” 指的是任何类型的 NaN。包括 signaling、non-signaling、quiet、loud 或其他类型的 NaN。

一个非激活的对象被认为对所有射线都是不可见的,并且不应该在加速结构中表示。实现应该确保非激活对象的存在不会严重降低遍历性能。

非激活对象会在自动生成的索引序列中被计数,这些索引序列通过 InstanceIdPrimitiveId SPIR-V 修饰符提供给着色器。这允许场景中的对象在激活和非激活状态之间自由更改,而不会影响任何使用 ID 值索引的数组的布局。

任何在激活和非激活状态之间的转换都需要重建完整的加速结构。应用程序必须不能执行加速结构更新,其中对象在源加速结构中是激活的,但在目标加速结构中将是非激活的,反之亦然。

退化图元和实例

退化图元和实例的行为与非激活图元和实例不同,定义如下:

  • 三角形,其一个或多个顶点的各自 (X)、(Y)、(Z) 分量相同,或者三个顶点中至少有两个 (X)、(Y) 或 (Z) 分量相同,因此形成一条线或一个点。退化三角形不会生成任何相交。

  • AABB,其 minX=maxXminY=maxYminZ=maxZ。退化 AABB 可能会调用相交着色器。

  • 实例,引用不包含任何激活图元的底层加速结构。构建加速结构时,实现应该将退化实例视为位于实例原点的一个点,由 VkAccelerationStructureInstanceKHR::transform 指定。

非激活图元和实例不同,退化图元和实例在执行加速结构更新时可能会从退化状态转换为非退化状态,反之亦然。

如果构建加速结构时,在 VkAccelerationStructureInfoNV::flagsVkAccelerationStructureBuildGeometryInfoKHR::flags 中未设置 VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_UPDATE_BIT_KHR,则退化图元可能会被丢弃。对于多个顶点定义了相同索引值的图元可以始终被丢弃。

构建加速结构

要构建加速结构,请调用:

// Provided by VK_NV_ray_tracing
void vkCmdBuildAccelerationStructureNV(
    VkCommandBuffer                             commandBuffer,
    const VkAccelerationStructureInfoNV*        pInfo,
    VkBuffer                                    instanceData,
    VkDeviceSize                                instanceOffset,
    VkBool32                                    update,
    VkAccelerationStructureNV                   dst,
    VkAccelerationStructureNV                   src,
    VkBuffer                                    scratch,
    VkDeviceSize                                scratchOffset);
  • commandBuffer 是将记录命令的命令缓冲区。

  • pInfo 包含加速结构共享的结构信息。

  • instanceData 是包含 VkAccelerationStructureInstanceKHR 结构数组的缓冲区,用于定义加速结构。对于底层加速结构,此参数必须NULL

  • instanceOffset 是实例数据所在位置的字节偏移量(相对于 instanceData 的起始位置)。

  • update 指定是否使用 src 中的数据更新 dst 加速结构。

  • dst 是指向构建的目标加速结构的指针。

  • src 是指向现有加速结构的指针,该加速结构将用于更新 dst 加速结构。

  • scratch 是将用作构建的暂存内存的 VkBuffer

  • scratchOffset 是相对于 scratch 起始位置的字节偏移量,将用作暂存内存。

dstsrcscratch 的访问必须VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR 管线阶段VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_KHRVK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_KHR访问类型进行同步

有效使用
有效使用(隐式)
  • VUID-vkCmdBuildAccelerationStructureNV-commandBuffer-parameter
    commandBuffer **必须** 是一个有效的 VkCommandBuffer 句柄。

  • VUID-vkCmdBuildAccelerationStructureNV-pInfo-parameter
    pInfo **必须** 是指向有效 VkAccelerationStructureInfoNV 结构的有效指针。

  • VUID-vkCmdBuildAccelerationStructureNV-instanceData-parameter
    如果 instanceData 不是 VK_NULL_HANDLE,则 instanceData **必须** 是有效的 VkBuffer 句柄。

  • VUID-vkCmdBuildAccelerationStructureNV-dst-parameter
    dst **必须** 是有效的 VkAccelerationStructureNV 句柄。

  • VUID-vkCmdBuildAccelerationStructureNV-src-parameter
    如果 src 不是 VK_NULL_HANDLE,则 src **必须** 是有效的 VkAccelerationStructureNV 句柄。

  • VUID-vkCmdBuildAccelerationStructureNV-scratch-parameter
    scratch **必须** 是一个有效的 VkBuffer 句柄。

  • VUID-vkCmdBuildAccelerationStructureNV-commandBuffer-recording
    commandBuffer **必须** 处于记录状态

  • VUID-vkCmdBuildAccelerationStructureNV-commandBuffer-cmdpool
    分配 commandBufferVkCommandPool **必须** 支持计算操作。

  • VUID-vkCmdBuildAccelerationStructureNV-renderpass
    此命令 **必须** 仅在渲染过程实例之外调用。

  • VUID-vkCmdBuildAccelerationStructureNV-videocoding
    此命令 **必须** 仅在视频编码范围之外调用。

  • VUID-vkCmdBuildAccelerationStructureNV-commonparent
    作为非忽略参数的有效句柄的 commandBufferdstinstanceDatascratchsrc 中的每一个 **必须** 从同一个 VkDevice 创建、分配或检索。

主机同步
  • commandBuffer 的主机访问 **必须** 外部同步。

  • 对分配 commandBufferVkCommandPool 的主机访问 **必须** 外部同步。

命令属性
命令缓冲区级别 渲染过程范围 视频编码范围 支持的队列类型 命令类型

主要
次要

外部

外部

计算

操作

要构建加速结构,请调用

// Provided by VK_KHR_acceleration_structure
void vkCmdBuildAccelerationStructuresKHR(
    VkCommandBuffer                             commandBuffer,
    uint32_t                                    infoCount,
    const VkAccelerationStructureBuildGeometryInfoKHR* pInfos,
    const VkAccelerationStructureBuildRangeInfoKHR* const* ppBuildRangeInfos);
  • commandBuffer 是将记录命令的命令缓冲区。

  • infoCount 是要构建的加速结构的数目。它指定必须提供的 pInfos 结构和 ppBuildRangeInfos 指针的数量。

  • pInfos 是指向 infoCountVkAccelerationStructureBuildGeometryInfoKHR 结构数组的指针,这些结构定义了用于构建每个加速结构的几何图形。

  • ppBuildRangeInfos 是指向 infoCount 个指针数组的指针,这些指针数组指向 VkAccelerationStructureBuildRangeInfoKHR 结构。每个 ppBuildRangeInfos[i] 是指向 pInfos[i].geometryCountVkAccelerationStructureBuildRangeInfoKHR 结构数组的指针,这些结构定义了指向存储几何数据的地址的动态偏移,如 pInfos[i] 所定义。

vkCmdBuildAccelerationStructuresKHR 命令提供了启动多个加速结构构建的功能,但是,任何单独的加速结构构建之间没有隐含的排序或同步。

这意味着应用程序 **不能** 在与正在构建的关联的底层或实例加速结构的同一个 vkCmdBuildAccelerationStructuresKHR 调用中构建顶层加速结构。在任何构建使用的任何加速结构内存或暂存内存之间也 **不能** 存在任何内存别名。

对由 VkAccelerationStructureBuildGeometryInfoKHR::scratchData 缓冲区设备地址标识的加速结构暂存缓冲区的访问必须VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR 管线阶段以及 (VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_KHR | VK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_KHR) 的访问类型同步。对每个 VkAccelerationStructureBuildGeometryInfoKHR::srcAccelerationStructureVkAccelerationStructureBuildGeometryInfoKHR::dstAccelerationStructure 的访问必须VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR 管线阶段以及相应的 VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_KHRVK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_KHR 访问类型同步

对由 VkAccelerationStructureGeometryMotionTrianglesDataNV::vertexData, VkAccelerationStructureGeometryTrianglesDataKHR::vertexData, VkAccelerationStructureGeometryTrianglesDataKHR::indexData, VkAccelerationStructureGeometryTrianglesDataKHR::transformData, VkAccelerationStructureGeometryAabbsDataKHR::dataVkAccelerationStructureGeometryInstancesDataKHR::data 的任何已使用值标识的其他输入缓冲区的访问必须VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR 管线阶段以及 VK_ACCESS_SHADER_READ_BIT访问类型同步

有效使用
  • VUID-vkCmdBuildAccelerationStructuresKHR-mode-04628
    pInfos 的每个元素的 mode 成员必须是有效的 VkBuildAccelerationStructureModeKHR

  • VUID-vkCmdBuildAccelerationStructuresKHR-srcAccelerationStructure-04629
    如果 pInfos 的任何元素的 srcAccelerationStructure 成员不是 VK_NULL_HANDLE,则 srcAccelerationStructure 成员必须是有效的 VkAccelerationStructureKHR 句柄

  • VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-04630
    对于 pInfos 的每个元素,如果其 mode 成员为 VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR,则其 srcAccelerationStructure 成员必须不是 VK_NULL_HANDLE

  • VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-03403
    pInfos 的任何元素的 srcAccelerationStructure 成员必须pInfos 的任何其他元素的 dstAccelerationStructure 成员不是同一个加速结构

  • VUID-vkCmdBuildAccelerationStructuresKHR-dstAccelerationStructure-03698
    pInfos 的任何元素的 dstAccelerationStructure 成员必须pInfos 的任何其他元素的 dstAccelerationStructure 成员不是同一个加速结构

  • VUID-vkCmdBuildAccelerationStructuresKHR-dstAccelerationStructure-03800
    pInfos 的任何元素的 dstAccelerationStructure 成员必须是有效的 VkAccelerationStructureKHR 句柄

  • VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-03699
    对于 pInfos 的每个元素,如果其 type 成员为 VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_KHR,则其 dstAccelerationStructure 成员必须已使用等于 VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_KHRVK_ACCELERATION_STRUCTURE_TYPE_GENERIC_KHRVkAccelerationStructureCreateInfoKHR::type 值创建

  • VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-03700
    对于 pInfos 的每个元素,如果其 type 成员为 VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_KHR,则其 dstAccelerationStructure 成员必须已使用等于 VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_KHRVK_ACCELERATION_STRUCTURE_TYPE_GENERIC_KHRVkAccelerationStructureCreateInfoKHR::type 值创建

  • VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-03663
    对于 pInfos 的每个元素,如果其 mode 成员为 VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR,则其 srcAccelerationStructure 成员中的非活动图元必须不能变为活动状态

  • VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-03664
    对于 pInfos 的每个元素,如果其 mode 成员为 VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR,则其 srcAccelerationStructure 成员中的活动图元必须不能变为非活动状态

  • VUID-vkCmdBuildAccelerationStructuresKHR-None-03407
    pInfos 的任何元素的 dstAccelerationStructure 成员必须不由 pInfos 的任何其他元素的 pGeometriesppGeometries 中具有 geometryTypeVK_GEOMETRY_TYPE_INSTANCES_KHR 的元素的 geometry.instances.data 成员引用

  • VUID-vkCmdBuildAccelerationStructuresKHR-dstAccelerationStructure-03701
    此命令访问的 pInfos 的任何元素的 dstAccelerationStructure 成员所支持的内存范围必须不与此命令访问的具有 mode 等于 VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHRpInfos 的任何其他元素的 srcAccelerationStructure 成员所支持的内存重叠

  • VUID-vkCmdBuildAccelerationStructuresKHR-dstAccelerationStructure-03702
    此命令访问的 pInfos 的任何元素的 dstAccelerationStructure 成员所支持的内存范围必须不与此命令访问的 pInfos 的任何其他元素的 dstAccelerationStructure 成员所支持的内存重叠

  • VUID-vkCmdBuildAccelerationStructuresKHR-dstAccelerationStructure-03703
    此命令访问的 pInfos 的任何元素的 dstAccelerationStructure 成员所支持的内存范围必须不与此命令访问的 pInfos 的任何元素的 scratchData 成员(包括同一元素)所支持的内存重叠

  • VUID-vkCmdBuildAccelerationStructuresKHR-scratchData-03704
    此命令访问的 pInfos 中任何元素的 scratchData 成员所指向的内存范围,不得与此命令访问的 pInfos 中任何其他元素的 scratchData 成员所指向的内存范围重叠。

  • VUID-vkCmdBuildAccelerationStructuresKHR-scratchData-03705
    此命令访问的 pInfos 中任何元素的 scratchData 成员所指向的内存范围,不得与此命令访问的,且 mode 等于 VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHRpInfos 中任何元素的 srcAccelerationStructure 成员(包括同一元素)所指向的内存范围重叠。

  • VUID-vkCmdBuildAccelerationStructuresKHR-dstAccelerationStructure-03706
    此命令访问的 pInfos 中任何元素的 dstAccelerationStructure 成员所指向的内存范围,不得与此命令访问的,且 pInfos 中任何其他元素的 geometry.instances.data 成员或 ppGeometries 成员所引用的,并且 geometryTypeVK_GEOMETRY_TYPE_INSTANCES_KHR 的任何加速结构所指向的内存范围重叠。

  • VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-03667
    对于 pInfos 的每个元素,如果其 mode 成员为 VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR,则其 srcAccelerationStructure 成员必须先前已使用 VkAccelerationStructureBuildGeometryInfoKHR::flags 中的 VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_UPDATE_BIT_KHR 位进行构造。

  • VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-03668
    对于 pInfos 的每个元素,如果其 mode 成员为 VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR,则其 srcAccelerationStructuredstAccelerationStructure 成员必须是相同的 VkAccelerationStructureKHR,或不具有任何内存别名

  • VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-03758
    对于 pInfos 的每个元素,如果其 mode 成员为 VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR,则其 geometryCount 成员必须具有与上次构建 srcAccelerationStructure 时指定的值相同的值。

  • VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-03759
    对于 pInfos 的每个元素,如果其 mode 成员为 VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR,则其 flags 成员必须具有与上次构建 srcAccelerationStructure 时指定的值相同的值。

  • VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-03760
    对于 pInfos 的每个元素,如果其 mode 成员为 VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR,则其 type 成员必须具有与上次构建 srcAccelerationStructure 时指定的值相同的值。

  • VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-03761
    对于 pInfos 的每个元素,如果其 mode 成员为 VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR,那么对于其 pGeometriesppGeometries 成员引用的每个 VkAccelerationStructureGeometryKHR 结构,其 geometryType 成员必须具有与上次构建 srcAccelerationStructure 时指定的值相同的值。

  • VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-03762
    对于 pInfos 的每个元素,如果其 mode 成员为 VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR,那么对于其 pGeometriesppGeometries 成员引用的每个 VkAccelerationStructureGeometryKHR 结构,其 flags 成员必须具有与上次构建 srcAccelerationStructure 时指定的值相同的值。

  • VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-03763
    对于 pInfos 的每个元素,如果其 mode 成员为 VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR,那么对于其 pGeometriesppGeometries 成员引用的每个 VkAccelerationStructureGeometryKHR 结构,如果 geometryTypeVK_GEOMETRY_TYPE_TRIANGLES_KHR,则其 geometry.triangles.vertexFormat 成员必须具有与上次构建 srcAccelerationStructure 时指定的值相同的值。

  • VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-03764
    对于 pInfos 的每个元素,如果其 mode 成员为 VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR,那么对于其 pGeometriesppGeometries 成员引用的每个 VkAccelerationStructureGeometryKHR 结构,如果 geometryTypeVK_GEOMETRY_TYPE_TRIANGLES_KHR,则其 geometry.triangles.maxVertex 成员必须具有与上次构建 srcAccelerationStructure 时指定的值相同的值。

  • VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-03765
    对于 pInfos 的每个元素,如果其 mode 成员为 VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR,那么对于其 pGeometriesppGeometries 成员引用的每个 VkAccelerationStructureGeometryKHR 结构,如果 geometryTypeVK_GEOMETRY_TYPE_TRIANGLES_KHR,则其 geometry.triangles.indexType 成员必须具有与上次构建 srcAccelerationStructure 时指定的值相同的值。

  • VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-03766
    对于 pInfos 的每个元素,如果其 mode 成员为 VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR,那么对于其 pGeometriesppGeometries 成员引用的每个 VkAccelerationStructureGeometryKHR 结构,如果 geometryTypeVK_GEOMETRY_TYPE_TRIANGLES_KHR,如果上次构建 srcAccelerationStructure 时其 geometry.triangles.transformData 地址为 NULL,则它必须NULL

  • VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-03767
    对于 pInfos 中的每个元素,如果其 mode 成员为 VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR,则对于其 pGeometriesppGeometries 成员引用的每个 VkAccelerationStructureGeometryKHR 结构,如果 geometryTypeVK_GEOMETRY_TYPE_TRIANGLES_KHR,如果其 geometry.triangles.transformData 地址在上次构建 srcAccelerationStructure 时不为 NULL,则它必须不为 NULL

  • VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-03768
    对于 pInfos 中的每个元素,如果其 mode 成员为 VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR,则对于其 pGeometriesppGeometries 成员引用的每个 VkAccelerationStructureGeometryKHR 结构,如果 geometryTypeVK_GEOMETRY_TYPE_TRIANGLES_KHRgeometry.triangles.indexType 不为 VK_INDEX_TYPE_NONE_KHR,则每个被引用的索引的值必须与上次构建 srcAccelerationStructure 时对应的索引值相同。

  • VUID-vkCmdBuildAccelerationStructuresKHR-primitiveCount-03769
    对于 pInfos 中的每个元素,如果其 mode 成员为 VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR,则对于其 pGeometriesppGeometries 成员引用的每个 VkAccelerationStructureGeometryKHR 结构,其对应的 VkAccelerationStructureBuildRangeInfoKHR 结构的 primitiveCount 成员必须具有与上次构建 srcAccelerationStructure 时指定的值相同的值。

  • VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-03801
    对于 pInfos[i].pGeometriespInfos[i].ppGeometriesgeometryTypeVK_GEOMETRY_TYPE_INSTANCES_KHR 的每个元素,对应的 ppBuildRangeInfos[i][j].primitiveCount 必须小于或等于 VkPhysicalDeviceAccelerationStructurePropertiesKHR::maxInstanceCount

  • VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-03707
    对于 pInfos 的每个元素,用于创建其 dstAccelerationStructure 成员的 buffer 必须绑定到设备内存。

  • VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-03708
    对于 pInfos 的每个元素,如果其 mode 成员为 VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR,则用于创建其 srcAccelerationStructure 成员的 buffer 必须绑定到设备内存。

  • VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-03709
    对于 pInfos 的每个元素,用于创建任何 pGeometriesppGeometriesgeometryTypeVK_GEOMETRY_TYPE_INSTANCES_KHR 的元素的 geometry.instances.data 成员引用的每个加速结构的 buffer 必须绑定到设备内存。

  • VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-03671
    如果 pInfos[i].modeVK_BUILD_ACCELERATION_STRUCTURE_MODE_BUILD_KHR,则 pInfos[i].scratchData.deviceAddresspInfos[i].scratchData.deviceAddress + N - 1 之间的所有地址必须位于同一缓冲区的缓冲设备地址范围内,其中 N 由调用 vkGetAccelerationStructureBuildSizesKHR 返回的 VkAccelerationStructureBuildSizesInfoKHR 结构的 buildScratchSize 成员给出,且该调用使用相同的 VkAccelerationStructureBuildGeometryInfoKHR 结构和图元计数。

  • VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-03672
    如果 pInfos[i].modeVK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR,则 pInfos[i].scratchData.deviceAddresspInfos[i].scratchData.deviceAddress + N - 1 之间的所有地址必须位于同一缓冲区的缓冲设备地址范围内,其中 N 由调用 vkGetAccelerationStructureBuildSizesKHR 返回的 VkAccelerationStructureBuildSizesInfoKHR 结构的 updateScratchSize 成员给出,且该调用使用相同的 VkAccelerationStructureBuildGeometryInfoKHR 结构和图元计数。

  • VUID-vkCmdBuildAccelerationStructuresKHR-geometry-03673
    从其中查询所有 pInfos[i].pGeometriespInfos[i].ppGeometries 的所有 geometry.triangles.vertexDatageometry.triangles.indexDatageometry.triangles.transformDatageometry.aabbs.datageometry.instances.data 成员的缓冲设备地址的缓冲区必须已使用 VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_BUILD_INPUT_READ_ONLY_BIT_KHR 用法标志创建。

  • VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-03674
    从中查询缓冲设备地址 pInfos[i].scratchData.deviceAddress 的缓冲区必须已使用 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT 用法标志创建。

  • VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-03802
    对于 pInfos 的每个元素,其 scratchData.deviceAddress 成员必须是从 vkGetBufferDeviceAddress 获取的有效设备地址。

  • VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-03803
    对于 pInfos 的每个元素,如果 scratchData.deviceAddress 是非稀疏缓冲区的地址,则它必须完全且连续地绑定到单个 VkDeviceMemory 对象。

  • VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-03710
    对于 pInfos 的每个元素,其 scratchData.deviceAddress 成员必须VkPhysicalDeviceAccelerationStructurePropertiesKHR::minAccelerationStructureScratchOffsetAlignment 的倍数。

  • VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-03804
    对于 pInfos[i].pGeometriespInfos[i].ppGeometriesgeometryTypeVK_GEOMETRY_TYPE_TRIANGLES_KHR 的任何元素,geometry.triangles.vertexData.deviceAddress 必须是从 vkGetBufferDeviceAddress 获取的有效设备地址。

  • VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-03805
    对于 pInfos[i].pGeometriespInfos[i].ppGeometries 的任何元素,如果其 geometryTypeVK_GEOMETRY_TYPE_TRIANGLES_KHR,且 geometry.triangles.vertexData.deviceAddress 是一个非稀疏缓冲区的地址,则它必须完全且连续地绑定到一个 VkDeviceMemory 对象。

  • VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-03711
    对于 pInfos[i].pGeometriespInfos[i].ppGeometries 的任何元素,如果其 geometryTypeVK_GEOMETRY_TYPE_TRIANGLES_KHR,则 geometry.triangles.vertexData.deviceAddress 必须按照 vertexFormat 中最小分量的大小(以字节为单位)进行对齐。

  • VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-03806
    对于 pInfos[i].pGeometriespInfos[i].ppGeometries 的任何元素,如果其 geometryTypeVK_GEOMETRY_TYPE_TRIANGLES_KHR,且 geometry.triangles.indexType 不为 VK_INDEX_TYPE_NONE_KHR,则 geometry.triangles.indexData.deviceAddress 必须是从 vkGetBufferDeviceAddress 获取的有效设备地址。

  • VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-03807
    对于 pInfos[i].pGeometriespInfos[i].ppGeometries 的任何元素,如果其 geometryTypeVK_GEOMETRY_TYPE_TRIANGLES_KHR,且 geometry.triangles.indexType 不为 VK_INDEX_TYPE_NONE_KHR,并且 geometry.triangles.indexData.deviceAddress 是一个非稀疏缓冲区的地址,则它必须完全且连续地绑定到一个 VkDeviceMemory 对象。

  • VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-03712
    对于 pInfos[i].pGeometriespInfos[i].ppGeometries 的任何元素,如果其 geometryTypeVK_GEOMETRY_TYPE_TRIANGLES_KHR,且 geometry.triangles.indexType 不等于 VK_INDEX_TYPE_NONE_KHR,则 geometry.triangles.indexData.deviceAddress 必须按照 indexType 中的类型大小(以字节为单位)进行对齐。

  • VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-03808
    对于 pInfos[i].pGeometriespInfos[i].ppGeometries 的任何元素,如果其 geometryTypeVK_GEOMETRY_TYPE_TRIANGLES_KHR,且 geometry.triangles.transformData.deviceAddress 不为 0,则它必须是从 vkGetBufferDeviceAddress 获取的有效设备地址。

  • VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-03809
    对于 pInfos[i].pGeometriespInfos[i].ppGeometries 的任何元素,如果其 geometryTypeVK_GEOMETRY_TYPE_TRIANGLES_KHR,且 geometry.triangles.transformData.deviceAddress 是一个非稀疏缓冲区的地址,则它必须完全且连续地绑定到一个 VkDeviceMemory 对象。

  • VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-03810
    对于 pInfos[i].pGeometriespInfos[i].ppGeometries 的任何元素,如果其 geometryTypeVK_GEOMETRY_TYPE_TRIANGLES_KHR,且 geometry.triangles.transformData.deviceAddress 不为 0,则它必须按照 16 字节对齐。

  • VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-03811
    对于 pInfos[i].pGeometriespInfos[i].ppGeometries 的任何元素,如果其 geometryTypeVK_GEOMETRY_TYPE_AABBS_KHR,则 geometry.aabbs.data.deviceAddress 必须是从 vkGetBufferDeviceAddress 获取的有效设备地址。

  • VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-03812
    对于 pInfos[i].pGeometriespInfos[i].ppGeometries 的任何元素,如果其 geometryTypeVK_GEOMETRY_TYPE_AABBS_KHR,且 geometry.aabbs.data.deviceAddress 是一个非稀疏缓冲区的地址,则它必须完全且连续地绑定到一个 VkDeviceMemory 对象。

  • VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-03714
    对于 pInfos[i].pGeometriespInfos[i].ppGeometries 的任何元素,如果其 geometryTypeVK_GEOMETRY_TYPE_AABBS_KHR,则 geometry.aabbs.data.deviceAddress 必须按照 8 字节对齐。

  • VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-03715
    对于 pInfos[i].pGeometriespInfos[i].ppGeometries 的任何元素,如果其 geometryTypeVK_GEOMETRY_TYPE_INSTANCES_KHR,且 geometry.arrayOfPointersVK_FALSE,则 geometry.instances.data.deviceAddress 必须按照 16 字节对齐。

  • VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-03716
    对于 pInfos[i].pGeometriespInfos[i].ppGeometries 的任何元素,如果其 geometryTypeVK_GEOMETRY_TYPE_INSTANCES_KHR,且 geometry.arrayOfPointersVK_TRUE,则 geometry.instances.data.deviceAddress 必须按照 8 字节对齐。

  • VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-03717
    对于 pInfos[i].pGeometriespInfos[i].ppGeometries 的任何元素,如果其 geometryTypeVK_GEOMETRY_TYPE_INSTANCES_KHR,且 geometry.arrayOfPointersVK_TRUE,则设备内存中 geometry.instances.data.deviceAddress 的每个元素必须按照 16 字节对齐。

  • VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-03813
    对于 pInfos[i].pGeometriespInfos[i].ppGeometries 的任何元素,如果其 geometryTypeVK_GEOMETRY_TYPE_INSTANCES_KHR,则 geometry.instances.data.deviceAddress 必须是从 vkGetBufferDeviceAddress 获取的有效设备地址。

  • VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-03814
    对于 pInfos[i].pGeometriespInfos[i].ppGeometries 中任何 geometryTypeVK_GEOMETRY_TYPE_INSTANCES_KHR 的元素,如果 geometry.instances.data.deviceAddress 是一个非稀疏缓冲区的地址,则它必须完整且连续地绑定到单个 VkDeviceMemory 对象。

  • VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-06707
    对于 pInfos[i].pGeometriespInfos[i].ppGeometries 中任何 geometryTypeVK_GEOMETRY_TYPE_INSTANCES_KHR 的元素,geometry.instances.data.deviceAddress 中的每个 VkAccelerationStructureInstanceKHR::accelerationStructureReference必须是一个有效的设备地址,其中包含从 vkGetAccelerationStructureDeviceAddressKHR 获取的值或 0

  • VUID-vkCmdBuildAccelerationStructuresKHR-commandBuffer-09547
    commandBuffer **不能**是受保护的命令缓冲区。

  • VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-10126
    对于每个 pInfos[i],dstAccelerationStructure **必须**已使用 VkAccelerationStructureCreateInfoKHR::size 值创建,该值大于或等于以下两者之一:

    • 构建操作所需的内存大小,如 vkGetAccelerationStructureBuildSizesKHR 返回,其中 pBuildInfo = pInfos[i] 并且 pMaxPrimitiveCounts 数组的每个元素大于或等于 ppBuildRangeInfos[i][j].primitiveCount 的等效值,其中 j[0,pInfos[i].geometryCount) 中;或者,

    • 如果更新压缩的加速结构,则查询相应的 VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR 的结果。

  • VUID-vkCmdBuildAccelerationStructuresKHR-ppBuildRangeInfos-03676
    ppBuildRangeInfos[i] 的每个元素**必须**是指向 pInfos[i].geometryCountVkAccelerationStructureBuildRangeInfoKHR 结构数组的有效指针。

有效使用(隐式)
  • VUID-vkCmdBuildAccelerationStructuresKHR-commandBuffer-parameter
    commandBuffer **必须** 是一个有效的 VkCommandBuffer 句柄。

  • VUID-vkCmdBuildAccelerationStructuresKHR-pInfos-parameter
    pInfos **必须**是指向 infoCount 个有效的 VkAccelerationStructureBuildGeometryInfoKHR 结构数组的有效指针。

  • VUID-vkCmdBuildAccelerationStructuresKHR-ppBuildRangeInfos-parameter
    ppBuildRangeInfos **必须**是指向 infoCountVkAccelerationStructureBuildRangeInfoKHR 结构数组的有效指针。

  • VUID-vkCmdBuildAccelerationStructuresKHR-commandBuffer-recording
    commandBuffer **必须** 处于记录状态

  • VUID-vkCmdBuildAccelerationStructuresKHR-commandBuffer-cmdpool
    分配 commandBufferVkCommandPool **必须** 支持计算操作。

  • VUID-vkCmdBuildAccelerationStructuresKHR-renderpass
    此命令 **必须** 仅在渲染过程实例之外调用。

  • VUID-vkCmdBuildAccelerationStructuresKHR-videocoding
    此命令 **必须** 仅在视频编码范围之外调用。

  • VUID-vkCmdBuildAccelerationStructuresKHR-infoCount-arraylength
    infoCount **必须**大于 0

主机同步
  • commandBuffer 的主机访问 **必须** 外部同步。

  • 对分配 commandBufferVkCommandPool 的主机访问 **必须** 外部同步。

命令属性
命令缓冲区级别 渲染过程范围 视频编码范围 支持的队列类型 命令类型

主要
次要

外部

外部

计算

操作

要构建一些参数来源于设备的加速结构,请调用

// Provided by VK_KHR_acceleration_structure
void vkCmdBuildAccelerationStructuresIndirectKHR(
    VkCommandBuffer                             commandBuffer,
    uint32_t                                    infoCount,
    const VkAccelerationStructureBuildGeometryInfoKHR* pInfos,
    const VkDeviceAddress*                      pIndirectDeviceAddresses,
    const uint32_t*                             pIndirectStrides,
    const uint32_t* const*                      ppMaxPrimitiveCounts);
  • commandBuffer 是将记录命令的命令缓冲区。

  • infoCount 是要构建的加速结构的数目。

  • pInfos 是指向 infoCountVkAccelerationStructureBuildGeometryInfoKHR 结构数组的指针,这些结构定义了用于构建每个加速结构的几何图形。

  • pIndirectDeviceAddresses 是指向一个 infoCount 个缓冲设备地址的数组的指针,这些地址指向由 pInfos[i] 定义的、包含动态偏移的 pInfos[i].geometryCountVkAccelerationStructureBuildRangeInfoKHR 结构,这些动态偏移指向存储几何体数据的地址。

  • pIndirectStrides 是指向一个包含 infoCount 个字节步幅的数组的指针,这些步幅表示 pIndirectDeviceAddresses 数组中元素之间的距离。

  • ppMaxPrimitiveCounts 是指向一个包含 infoCount 个指针的数组的指针,这些指针指向包含 pInfos[i].geometryCount 个值的数组,这些值指示此命令将为每个几何体构建的最大图元数量。

对加速结构、暂存缓冲区、顶点缓冲区、索引缓冲区和实例缓冲区的访问**必须**与 vkCmdBuildAccelerationStructuresKHR 同步。

pIndirectDeviceAddresses 的任何元素的访问**必须**与 VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR 管线阶段VK_ACCESS_INDIRECT_COMMAND_READ_BIT访问类型 同步

有效使用
  • VUID-vkCmdBuildAccelerationStructuresIndirectKHR-mode-04628
    pInfos 的每个元素的 mode 成员必须是有效的 VkBuildAccelerationStructureModeKHR

  • VUID-vkCmdBuildAccelerationStructuresIndirectKHR-srcAccelerationStructure-04629
    如果 pInfos 的任何元素的 srcAccelerationStructure 成员不是 VK_NULL_HANDLE,则 srcAccelerationStructure 成员必须是有效的 VkAccelerationStructureKHR 句柄

  • VUID-vkCmdBuildAccelerationStructuresIndirectKHR-pInfos-04630
    对于 pInfos 的每个元素,如果其 mode 成员为 VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR,则其 srcAccelerationStructure 成员必须不是 VK_NULL_HANDLE

  • VUID-vkCmdBuildAccelerationStructuresIndirectKHR-pInfos-03403
    pInfos 的任何元素的 srcAccelerationStructure 成员必须pInfos 的任何其他元素的 dstAccelerationStructure 成员不是同一个加速结构

  • VUID-vkCmdBuildAccelerationStructuresIndirectKHR-dstAccelerationStructure-03698
    pInfos 的任何元素的 dstAccelerationStructure 成员必须pInfos 的任何其他元素的 dstAccelerationStructure 成员不是同一个加速结构

  • VUID-vkCmdBuildAccelerationStructuresIndirectKHR-dstAccelerationStructure-03800
    pInfos 的任何元素的 dstAccelerationStructure 成员必须是有效的 VkAccelerationStructureKHR 句柄

  • VUID-vkCmdBuildAccelerationStructuresIndirectKHR-pInfos-03699
    对于 pInfos 的每个元素,如果其 type 成员为 VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_KHR,则其 dstAccelerationStructure 成员必须已使用等于 VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_KHRVK_ACCELERATION_STRUCTURE_TYPE_GENERIC_KHRVkAccelerationStructureCreateInfoKHR::type 值创建

  • VUID-vkCmdBuildAccelerationStructuresIndirectKHR-pInfos-03700
    对于 pInfos 的每个元素,如果其 type 成员为 VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_KHR,则其 dstAccelerationStructure 成员必须已使用等于 VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_KHRVK_ACCELERATION_STRUCTURE_TYPE_GENERIC_KHRVkAccelerationStructureCreateInfoKHR::type 值创建

  • VUID-vkCmdBuildAccelerationStructuresIndirectKHR-pInfos-03663
    对于 pInfos 的每个元素,如果其 mode 成员为 VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR,则其 srcAccelerationStructure 成员中的非活动图元必须不能变为活动状态

  • VUID-vkCmdBuildAccelerationStructuresIndirectKHR-pInfos-03664
    对于 pInfos 的每个元素,如果其 mode 成员为 VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR,则其 srcAccelerationStructure 成员中的活动图元必须不能变为非活动状态

  • VUID-vkCmdBuildAccelerationStructuresIndirectKHR-None-03407
    pInfos 的任何元素的 dstAccelerationStructure 成员必须不由 pInfos 的任何其他元素的 pGeometriesppGeometries 中具有 geometryTypeVK_GEOMETRY_TYPE_INSTANCES_KHR 的元素的 geometry.instances.data 成员引用

  • VUID-vkCmdBuildAccelerationStructuresIndirectKHR-dstAccelerationStructure-03701
    此命令访问的 pInfos 的任何元素的 dstAccelerationStructure 成员所支持的内存范围必须不与此命令访问的具有 mode 等于 VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHRpInfos 的任何其他元素的 srcAccelerationStructure 成员所支持的内存重叠

  • VUID-vkCmdBuildAccelerationStructuresIndirectKHR-dstAccelerationStructure-03702
    此命令访问的 pInfos 的任何元素的 dstAccelerationStructure 成员所支持的内存范围必须不与此命令访问的 pInfos 的任何其他元素的 dstAccelerationStructure 成员所支持的内存重叠

  • VUID-vkCmdBuildAccelerationStructuresIndirectKHR-dstAccelerationStructure-03703
    此命令访问的 pInfos 的任何元素的 dstAccelerationStructure 成员所支持的内存范围必须不与此命令访问的 pInfos 的任何元素的 scratchData 成员(包括同一元素)所支持的内存重叠

  • VUID-vkCmdBuildAccelerationStructuresIndirectKHR-scratchData-03704
    此命令访问的 pInfos 中任何元素的 scratchData 成员所指向的内存范围,不得与此命令访问的 pInfos 中任何其他元素的 scratchData 成员所指向的内存范围重叠。

  • VUID-vkCmdBuildAccelerationStructuresIndirectKHR-scratchData-03705
    此命令访问的 pInfos 中任何元素的 scratchData 成员所指向的内存范围,不得与此命令访问的,且 mode 等于 VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHRpInfos 中任何元素的 srcAccelerationStructure 成员(包括同一元素)所指向的内存范围重叠。

  • VUID-vkCmdBuildAccelerationStructuresIndirectKHR-dstAccelerationStructure-03706
    此命令访问的 pInfos 中任何元素的 dstAccelerationStructure 成员所指向的内存范围,不得与此命令访问的,且 pInfos 中任何其他元素的 geometry.instances.data 成员或 ppGeometries 成员所引用的,并且 geometryTypeVK_GEOMETRY_TYPE_INSTANCES_KHR 的任何加速结构所指向的内存范围重叠。

  • VUID-vkCmdBuildAccelerationStructuresIndirectKHR-pInfos-03667
    对于 pInfos 的每个元素,如果其 mode 成员为 VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR,则其 srcAccelerationStructure 成员必须先前已使用 VkAccelerationStructureBuildGeometryInfoKHR::flags 中的 VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_UPDATE_BIT_KHR 位进行构造。

  • VUID-vkCmdBuildAccelerationStructuresIndirectKHR-pInfos-03668
    对于 pInfos 的每个元素,如果其 mode 成员为 VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR,则其 srcAccelerationStructuredstAccelerationStructure 成员必须是相同的 VkAccelerationStructureKHR,或不具有任何内存别名

  • VUID-vkCmdBuildAccelerationStructuresIndirectKHR-pInfos-03758
    对于 pInfos 的每个元素,如果其 mode 成员为 VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR,则其 geometryCount 成员必须具有与上次构建 srcAccelerationStructure 时指定的值相同的值。

  • VUID-vkCmdBuildAccelerationStructuresIndirectKHR-pInfos-03759
    对于 pInfos 的每个元素,如果其 mode 成员为 VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR,则其 flags 成员必须具有与上次构建 srcAccelerationStructure 时指定的值相同的值。

  • VUID-vkCmdBuildAccelerationStructuresIndirectKHR-pInfos-03760
    对于 pInfos 的每个元素,如果其 mode 成员为 VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR,则其 type 成员必须具有与上次构建 srcAccelerationStructure 时指定的值相同的值。

  • VUID-vkCmdBuildAccelerationStructuresIndirectKHR-pInfos-03761
    对于 pInfos 的每个元素,如果其 mode 成员为 VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR,那么对于其 pGeometriesppGeometries 成员引用的每个 VkAccelerationStructureGeometryKHR 结构,其 geometryType 成员必须具有与上次构建 srcAccelerationStructure 时指定的值相同的值。

  • VUID-vkCmdBuildAccelerationStructuresIndirectKHR-pInfos-03762
    对于 pInfos 的每个元素,如果其 mode 成员为 VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR,那么对于其 pGeometriesppGeometries 成员引用的每个 VkAccelerationStructureGeometryKHR 结构,其 flags 成员必须具有与上次构建 srcAccelerationStructure 时指定的值相同的值。

  • VUID-vkCmdBuildAccelerationStructuresIndirectKHR-pInfos-03763
    对于 pInfos 的每个元素,如果其 mode 成员为 VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR,那么对于其 pGeometriesppGeometries 成员引用的每个 VkAccelerationStructureGeometryKHR 结构,如果 geometryTypeVK_GEOMETRY_TYPE_TRIANGLES_KHR,则其 geometry.triangles.vertexFormat 成员必须具有与上次构建 srcAccelerationStructure 时指定的值相同的值。

  • VUID-vkCmdBuildAccelerationStructuresIndirectKHR-pInfos-03764
    对于 pInfos 的每个元素,如果其 mode 成员为 VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR,那么对于其 pGeometriesppGeometries 成员引用的每个 VkAccelerationStructureGeometryKHR 结构,如果 geometryTypeVK_GEOMETRY_TYPE_TRIANGLES_KHR,则其 geometry.triangles.maxVertex 成员必须具有与上次构建 srcAccelerationStructure 时指定的值相同的值。

  • VUID-vkCmdBuildAccelerationStructuresIndirectKHR-pInfos-03765
    对于 pInfos 的每个元素,如果其 mode 成员为 VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR,那么对于其 pGeometriesppGeometries 成员引用的每个 VkAccelerationStructureGeometryKHR 结构,如果 geometryTypeVK_GEOMETRY_TYPE_TRIANGLES_KHR,则其 geometry.triangles.indexType 成员必须具有与上次构建 srcAccelerationStructure 时指定的值相同的值。

  • VUID-vkCmdBuildAccelerationStructuresIndirectKHR-pInfos-03766
    对于 pInfos 的每个元素,如果其 mode 成员为 VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR,那么对于其 pGeometriesppGeometries 成员引用的每个 VkAccelerationStructureGeometryKHR 结构,如果 geometryTypeVK_GEOMETRY_TYPE_TRIANGLES_KHR,如果上次构建 srcAccelerationStructure 时其 geometry.triangles.transformData 地址为 NULL,则它必须NULL

  • VUID-vkCmdBuildAccelerationStructuresIndirectKHR-pInfos-03767
    对于 pInfos 中的每个元素,如果其 mode 成员为 VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR,则对于其 pGeometriesppGeometries 成员引用的每个 VkAccelerationStructureGeometryKHR 结构,如果 geometryTypeVK_GEOMETRY_TYPE_TRIANGLES_KHR,如果其 geometry.triangles.transformData 地址在上次构建 srcAccelerationStructure 时不为 NULL,则它必须不为 NULL

  • VUID-vkCmdBuildAccelerationStructuresIndirectKHR-pInfos-03768
    对于 pInfos 中的每个元素,如果其 mode 成员为 VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR,则对于其 pGeometriesppGeometries 成员引用的每个 VkAccelerationStructureGeometryKHR 结构,如果 geometryTypeVK_GEOMETRY_TYPE_TRIANGLES_KHRgeometry.triangles.indexType 不为 VK_INDEX_TYPE_NONE_KHR,则每个被引用的索引的值必须与上次构建 srcAccelerationStructure 时对应的索引值相同。

  • VUID-vkCmdBuildAccelerationStructuresIndirectKHR-primitiveCount-03769
    对于 pInfos 中的每个元素,如果其 mode 成员为 VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR,则对于其 pGeometriesppGeometries 成员引用的每个 VkAccelerationStructureGeometryKHR 结构,其对应的 VkAccelerationStructureBuildRangeInfoKHR 结构的 primitiveCount 成员必须具有与上次构建 srcAccelerationStructure 时指定的值相同的值。

  • VUID-vkCmdBuildAccelerationStructuresIndirectKHR-pInfos-03801
    对于 pInfos[i].pGeometriespInfos[i].ppGeometriesgeometryTypeVK_GEOMETRY_TYPE_INSTANCES_KHR 的每个元素,对应的 ppMaxPrimitiveCounts[i][j] 必须小于或等于 VkPhysicalDeviceAccelerationStructurePropertiesKHR::maxInstanceCount

  • VUID-vkCmdBuildAccelerationStructuresIndirectKHR-pInfos-03707
    对于 pInfos 的每个元素,用于创建其 dstAccelerationStructure 成员的 buffer 必须绑定到设备内存。

  • VUID-vkCmdBuildAccelerationStructuresIndirectKHR-pInfos-03708
    对于 pInfos 的每个元素,如果其 mode 成员为 VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR,则用于创建其 srcAccelerationStructure 成员的 buffer 必须绑定到设备内存。

  • VUID-vkCmdBuildAccelerationStructuresIndirectKHR-pInfos-03709
    对于 pInfos 的每个元素,用于创建任何 pGeometriesppGeometriesgeometryTypeVK_GEOMETRY_TYPE_INSTANCES_KHR 的元素的 geometry.instances.data 成员引用的每个加速结构的 buffer 必须绑定到设备内存。

  • VUID-vkCmdBuildAccelerationStructuresIndirectKHR-pInfos-03671
    如果 pInfos[i].modeVK_BUILD_ACCELERATION_STRUCTURE_MODE_BUILD_KHR,则 pInfos[i].scratchData.deviceAddresspInfos[i].scratchData.deviceAddress + N - 1 之间的所有地址必须位于同一缓冲区的缓冲设备地址范围内,其中 N 由调用 vkGetAccelerationStructureBuildSizesKHR 返回的 VkAccelerationStructureBuildSizesInfoKHR 结构的 buildScratchSize 成员给出,且该调用使用相同的 VkAccelerationStructureBuildGeometryInfoKHR 结构和图元计数。

  • VUID-vkCmdBuildAccelerationStructuresIndirectKHR-pInfos-03672
    如果 pInfos[i].modeVK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR,则 pInfos[i].scratchData.deviceAddresspInfos[i].scratchData.deviceAddress + N - 1 之间的所有地址必须位于同一缓冲区的缓冲设备地址范围内,其中 N 由调用 vkGetAccelerationStructureBuildSizesKHR 返回的 VkAccelerationStructureBuildSizesInfoKHR 结构的 updateScratchSize 成员给出,且该调用使用相同的 VkAccelerationStructureBuildGeometryInfoKHR 结构和图元计数。

  • VUID-vkCmdBuildAccelerationStructuresIndirectKHR-geometry-03673
    从其中查询所有 pInfos[i].pGeometriespInfos[i].ppGeometries 的所有 geometry.triangles.vertexDatageometry.triangles.indexDatageometry.triangles.transformDatageometry.aabbs.datageometry.instances.data 成员的缓冲设备地址的缓冲区必须已使用 VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_BUILD_INPUT_READ_ONLY_BIT_KHR 用法标志创建。

  • VUID-vkCmdBuildAccelerationStructuresIndirectKHR-pInfos-03674
    从中查询缓冲设备地址 pInfos[i].scratchData.deviceAddress 的缓冲区必须已使用 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT 用法标志创建。

  • VUID-vkCmdBuildAccelerationStructuresIndirectKHR-pInfos-03802
    对于 pInfos 的每个元素,其 scratchData.deviceAddress 成员必须是从 vkGetBufferDeviceAddress 获取的有效设备地址。

  • VUID-vkCmdBuildAccelerationStructuresIndirectKHR-pInfos-03803
    对于 pInfos 的每个元素,如果 scratchData.deviceAddress 是非稀疏缓冲区的地址,则它必须完全且连续地绑定到单个 VkDeviceMemory 对象。

  • VUID-vkCmdBuildAccelerationStructuresIndirectKHR-pInfos-03710
    对于 pInfos 的每个元素,其 scratchData.deviceAddress 成员必须VkPhysicalDeviceAccelerationStructurePropertiesKHR::minAccelerationStructureScratchOffsetAlignment 的倍数。

  • VUID-vkCmdBuildAccelerationStructuresIndirectKHR-pInfos-03804
    对于 pInfos[i].pGeometriespInfos[i].ppGeometriesgeometryTypeVK_GEOMETRY_TYPE_TRIANGLES_KHR 的任何元素,geometry.triangles.vertexData.deviceAddress 必须是从 vkGetBufferDeviceAddress 获取的有效设备地址。

  • VUID-vkCmdBuildAccelerationStructuresIndirectKHR-pInfos-03805
    对于 pInfos[i].pGeometriespInfos[i].ppGeometries 的任何元素,如果其 geometryTypeVK_GEOMETRY_TYPE_TRIANGLES_KHR,且 geometry.triangles.vertexData.deviceAddress 是一个非稀疏缓冲区的地址,则它必须完全且连续地绑定到一个 VkDeviceMemory 对象。

  • VUID-vkCmdBuildAccelerationStructuresIndirectKHR-pInfos-03711
    对于 pInfos[i].pGeometriespInfos[i].ppGeometries 的任何元素,如果其 geometryTypeVK_GEOMETRY_TYPE_TRIANGLES_KHR,则 geometry.triangles.vertexData.deviceAddress 必须按照 vertexFormat 中最小分量的大小(以字节为单位)进行对齐。

  • VUID-vkCmdBuildAccelerationStructuresIndirectKHR-pInfos-03806
    对于 pInfos[i].pGeometriespInfos[i].ppGeometries 的任何元素,如果其 geometryTypeVK_GEOMETRY_TYPE_TRIANGLES_KHR,且 geometry.triangles.indexType 不为 VK_INDEX_TYPE_NONE_KHR,则 geometry.triangles.indexData.deviceAddress 必须是从 vkGetBufferDeviceAddress 获取的有效设备地址。

  • VUID-vkCmdBuildAccelerationStructuresIndirectKHR-pInfos-03807
    对于 pInfos[i].pGeometriespInfos[i].ppGeometries 的任何元素,如果其 geometryTypeVK_GEOMETRY_TYPE_TRIANGLES_KHR,且 geometry.triangles.indexType 不为 VK_INDEX_TYPE_NONE_KHR,并且 geometry.triangles.indexData.deviceAddress 是一个非稀疏缓冲区的地址,则它必须完全且连续地绑定到一个 VkDeviceMemory 对象。

  • VUID-vkCmdBuildAccelerationStructuresIndirectKHR-pInfos-03712
    对于 pInfos[i].pGeometriespInfos[i].ppGeometries 的任何元素,如果其 geometryTypeVK_GEOMETRY_TYPE_TRIANGLES_KHR,且 geometry.triangles.indexType 不等于 VK_INDEX_TYPE_NONE_KHR,则 geometry.triangles.indexData.deviceAddress 必须按照 indexType 中的类型大小(以字节为单位)进行对齐。

  • VUID-vkCmdBuildAccelerationStructuresIndirectKHR-pInfos-03808
    对于 pInfos[i].pGeometriespInfos[i].ppGeometries 的任何元素,如果其 geometryTypeVK_GEOMETRY_TYPE_TRIANGLES_KHR,且 geometry.triangles.transformData.deviceAddress 不为 0,则它必须是从 vkGetBufferDeviceAddress 获取的有效设备地址。

  • VUID-vkCmdBuildAccelerationStructuresIndirectKHR-pInfos-03809
    对于 pInfos[i].pGeometriespInfos[i].ppGeometries 的任何元素,如果其 geometryTypeVK_GEOMETRY_TYPE_TRIANGLES_KHR,且 geometry.triangles.transformData.deviceAddress 是一个非稀疏缓冲区的地址,则它必须完全且连续地绑定到一个 VkDeviceMemory 对象。

  • VUID-vkCmdBuildAccelerationStructuresIndirectKHR-pInfos-03810
    对于 pInfos[i].pGeometriespInfos[i].ppGeometries 的任何元素,如果其 geometryTypeVK_GEOMETRY_TYPE_TRIANGLES_KHR,且 geometry.triangles.transformData.deviceAddress 不为 0,则它必须按照 16 字节对齐。

  • VUID-vkCmdBuildAccelerationStructuresIndirectKHR-pInfos-03811
    对于 pInfos[i].pGeometriespInfos[i].ppGeometries 的任何元素,如果其 geometryTypeVK_GEOMETRY_TYPE_AABBS_KHR,则 geometry.aabbs.data.deviceAddress 必须是从 vkGetBufferDeviceAddress 获取的有效设备地址。

  • VUID-vkCmdBuildAccelerationStructuresIndirectKHR-pInfos-03812
    对于 pInfos[i].pGeometriespInfos[i].ppGeometries 的任何元素,如果其 geometryTypeVK_GEOMETRY_TYPE_AABBS_KHR,且 geometry.aabbs.data.deviceAddress 是一个非稀疏缓冲区的地址,则它必须完全且连续地绑定到一个 VkDeviceMemory 对象。

  • VUID-vkCmdBuildAccelerationStructuresIndirectKHR-pInfos-03714
    对于 pInfos[i].pGeometriespInfos[i].ppGeometries 的任何元素,如果其 geometryTypeVK_GEOMETRY_TYPE_AABBS_KHR,则 geometry.aabbs.data.deviceAddress 必须按照 8 字节对齐。

  • VUID-vkCmdBuildAccelerationStructuresIndirectKHR-pInfos-03715
    对于 pInfos[i].pGeometriespInfos[i].ppGeometries 的任何元素,如果其 geometryTypeVK_GEOMETRY_TYPE_INSTANCES_KHR,且 geometry.arrayOfPointersVK_FALSE,则 geometry.instances.data.deviceAddress 必须按照 16 字节对齐。

  • VUID-vkCmdBuildAccelerationStructuresIndirectKHR-pInfos-03716
    对于 pInfos[i].pGeometriespInfos[i].ppGeometries 的任何元素,如果其 geometryTypeVK_GEOMETRY_TYPE_INSTANCES_KHR,且 geometry.arrayOfPointersVK_TRUE,则 geometry.instances.data.deviceAddress 必须按照 8 字节对齐。

  • VUID-vkCmdBuildAccelerationStructuresIndirectKHR-pInfos-03717
    对于 pInfos[i].pGeometriespInfos[i].ppGeometries 的任何元素,如果其 geometryTypeVK_GEOMETRY_TYPE_INSTANCES_KHR,且 geometry.arrayOfPointersVK_TRUE,则设备内存中 geometry.instances.data.deviceAddress 的每个元素必须按照 16 字节对齐。

  • VUID-vkCmdBuildAccelerationStructuresIndirectKHR-pInfos-03813
    对于 pInfos[i].pGeometriespInfos[i].ppGeometries 的任何元素,如果其 geometryTypeVK_GEOMETRY_TYPE_INSTANCES_KHR,则 geometry.instances.data.deviceAddress 必须是从 vkGetBufferDeviceAddress 获取的有效设备地址。

  • VUID-vkCmdBuildAccelerationStructuresIndirectKHR-pInfos-03814
    对于 pInfos[i].pGeometriespInfos[i].ppGeometries 中任何 geometryTypeVK_GEOMETRY_TYPE_INSTANCES_KHR 的元素,如果 geometry.instances.data.deviceAddress 是一个非稀疏缓冲区的地址,则它必须完整且连续地绑定到单个 VkDeviceMemory 对象。

  • VUID-vkCmdBuildAccelerationStructuresIndirectKHR-pInfos-06707
    对于 pInfos[i].pGeometriespInfos[i].ppGeometries 中任何 geometryTypeVK_GEOMETRY_TYPE_INSTANCES_KHR 的元素,geometry.instances.data.deviceAddress 中的每个 VkAccelerationStructureInstanceKHR::accelerationStructureReference必须是一个有效的设备地址,其中包含从 vkGetAccelerationStructureDeviceAddressKHR 获取的值或 0

  • VUID-vkCmdBuildAccelerationStructuresIndirectKHR-commandBuffer-09547
    commandBuffer **不能**是受保护的命令缓冲区。

  • VUID-vkCmdBuildAccelerationStructuresIndirectKHR-pIndirectDeviceAddresses-03645
    对于 pIndirectDeviceAddresses 的任何元素,如果从中查询该元素的缓冲区是非稀疏的,则它必须完全且连续地绑定到单个 VkDeviceMemory 对象。

  • VUID-vkCmdBuildAccelerationStructuresIndirectKHR-pIndirectDeviceAddresses-03646
    对于 pIndirectDeviceAddresses[i] 的任何元素,pIndirectDeviceAddresses[i] 和 pIndirectDeviceAddresses[i] + (pInfos[i].geometryCount × pIndirectStrides[i]) - 1 之间的所有设备地址必须在同一缓冲区的缓冲区设备地址范围内。

  • VUID-vkCmdBuildAccelerationStructuresIndirectKHR-pIndirectDeviceAddresses-03647
    对于 pIndirectDeviceAddresses 的任何元素,从中查询该元素的缓冲区必须已使用设置的 VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT 位创建。

  • VUID-vkCmdBuildAccelerationStructuresIndirectKHR-pIndirectDeviceAddresses-03648
    pIndirectDeviceAddresses 的每个元素必须4 的倍数。

  • VUID-vkCmdBuildAccelerationStructuresIndirectKHR-pIndirectStrides-03787
    pIndirectStrides 的每个元素必须4 的倍数。

  • VUID-vkCmdBuildAccelerationStructuresIndirectKHR-pIndirectDeviceAddresses-03651
    pIndirectDeviceAddresses 的任何元素引用的每个 VkAccelerationStructureBuildRangeInfoKHR 结构必须是有效的 VkAccelerationStructureBuildRangeInfoKHR 结构。

  • VUID-vkCmdBuildAccelerationStructuresIndirectKHR-pInfos-03652
    pInfos[i].dstAccelerationStructure 必须已使用大于或等于构建操作所需内存大小的 VkAccelerationStructureCreateInfoKHR::size 值创建,如使用 pBuildInfo = pInfos[i]pMaxPrimitiveCounts = ppMaxPrimitiveCounts[i]vkGetAccelerationStructureBuildSizesKHR 返回。

  • VUID-vkCmdBuildAccelerationStructuresIndirectKHR-ppMaxPrimitiveCounts-03653
    每个 ppMaxPrimitiveCounts[i][j] 必须大于或等于位于 pIndirectDeviceAddresses[i] + (j × pIndirectStrides[i])VkAccelerationStructureBuildRangeInfoKHR 结构指定的 primitiveCount 值。

有效使用(隐式)
  • VUID-vkCmdBuildAccelerationStructuresIndirectKHR-commandBuffer-parameter
    commandBuffer **必须** 是一个有效的 VkCommandBuffer 句柄。

  • VUID-vkCmdBuildAccelerationStructuresIndirectKHR-pInfos-parameter
    pInfos **必须**是指向 infoCount 个有效的 VkAccelerationStructureBuildGeometryInfoKHR 结构数组的有效指针。

  • VUID-vkCmdBuildAccelerationStructuresIndirectKHR-pIndirectDeviceAddresses-parameter
    pIndirectDeviceAddresses 必须是指向 infoCountVkDeviceAddress 值的数组的有效指针。

  • VUID-vkCmdBuildAccelerationStructuresIndirectKHR-pIndirectStrides-parameter
    pIndirectStrides 必须是指向 infoCountuint32_t 值的数组的有效指针。

  • VUID-vkCmdBuildAccelerationStructuresIndirectKHR-ppMaxPrimitiveCounts-parameter
    ppMaxPrimitiveCounts 必须是指向 infoCountuint32_t 值的数组的有效指针。

  • VUID-vkCmdBuildAccelerationStructuresIndirectKHR-commandBuffer-recording
    commandBuffer **必须** 处于记录状态

  • VUID-vkCmdBuildAccelerationStructuresIndirectKHR-commandBuffer-cmdpool
    分配 commandBufferVkCommandPool **必须** 支持计算操作。

  • VUID-vkCmdBuildAccelerationStructuresIndirectKHR-renderpass
    此命令 **必须** 仅在渲染过程实例之外调用。

  • VUID-vkCmdBuildAccelerationStructuresIndirectKHR-videocoding
    此命令 **必须** 仅在视频编码范围之外调用。

  • VUID-vkCmdBuildAccelerationStructuresIndirectKHR-infoCount-arraylength
    infoCount **必须**大于 0

主机同步
  • commandBuffer 的主机访问 **必须** 外部同步。

  • 对分配 commandBufferVkCommandPool 的主机访问 **必须** 外部同步。

命令属性
命令缓冲区级别 渲染过程范围 视频编码范围 支持的队列类型 命令类型

主要
次要

外部

外部

计算

操作

VkAccelerationStructureBuildGeometryInfoKHR 结构定义为

// Provided by VK_KHR_acceleration_structure
typedef struct VkAccelerationStructureBuildGeometryInfoKHR {
    VkStructureType                                     sType;
    const void*                                         pNext;
    VkAccelerationStructureTypeKHR                      type;
    VkBuildAccelerationStructureFlagsKHR                flags;
    VkBuildAccelerationStructureModeKHR                 mode;
    VkAccelerationStructureKHR                          srcAccelerationStructure;
    VkAccelerationStructureKHR                          dstAccelerationStructure;
    uint32_t                                            geometryCount;
    const VkAccelerationStructureGeometryKHR*           pGeometries;
    const VkAccelerationStructureGeometryKHR* const*    ppGeometries;
    VkDeviceOrHostAddressKHR                            scratchData;
} VkAccelerationStructureBuildGeometryInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • type 是一个 VkAccelerationStructureTypeKHR 值,用于指定正在构建的加速结构的类型。

  • flagsVkBuildAccelerationStructureFlagBitsKHR 的位掩码,用于指定加速结构的附加参数。

  • mode 是一个 VkBuildAccelerationStructureModeKHR 值,用于指定要执行的操作类型。

  • srcAccelerationStructure 是指向现有加速结构的指针,该结构在 modeVK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR 时用于更新 dstAccelerationStructure 加速结构。

  • dstAccelerationStructure 是指向构建的目标加速结构的指针。

  • geometryCount 指定将构建到 dstAccelerationStructure 中的几何体数量。

  • pGeometries 是指向 VkAccelerationStructureGeometryKHR 结构的数组的指针。

  • ppGeometries 是指向 VkAccelerationStructureGeometryKHR 结构的指针数组的指针。

  • scratchData 是指向将用作构建的临时内存的设备或主机地址。

pGeometriesppGeometries 中只能有一个是指向有效数据的指针,另一个必须NULL。非 NULL 数组的每个元素都描述了用于构建每个加速结构几何体的数据。

在光线遍历期间,使用 VkAccelerationStructureBuildGeometryInfoKHRpGeometriesppGeometries 成员的每个元素的索引作为 *几何体索引*。几何体索引在光线着色器中通过 RayGeometryIndexKHR 内置变量 可用,并且用于确定遍历期间执行的命中和相交着色器。几何体索引通过 OpRayQueryGetIntersectionGeometryIndexKHR 指令可用于光线查询。

flags 中设置 VK_BUILD_ACCELERATION_STRUCTURE_MOTION_BIT_NV 表示此构建是运动顶层加速结构。如果 VkAccelerationStructureGeometryInstancesDataKHR::arrayOfPointersVK_FALSE,则运动顶层使用 VkAccelerationStructureMotionInstanceNV 格式的实例。

如果 VkAccelerationStructureGeometryInstancesDataKHR::arrayOfPointersVK_TRUE,则实例指针数组中每个元素的指针由 4 位的 VkAccelerationStructureMotionInstanceTypeNV 组成,这 4 位位于指针的低 4 位,用于标识指针所指向的结构类型。访问的设备地址是数组中的值,且低 4 位设置为零。指针所指向的结构是 VkAccelerationStructureInstanceKHRVkAccelerationStructureMatrixMotionInstanceNVVkAccelerationStructureSRTMotionInstanceNV 之一,具体取决于低 4 位中编码的类型值。

在其实例中包含运动实例或顶点运动的顶层加速结构必须flags 中设置 VK_BUILD_ACCELERATION_STRUCTURE_MOTION_BIT_NV

对于更新操作(当 modeVK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR 时),成员 srcAccelerationStructuredstAccelerationStructure可以相同或不同。如果它们相同,则更新操作将就地执行。否则,将更新目标加速结构,而源结构不会被修改。

有效使用
  • VUID-VkAccelerationStructureBuildGeometryInfoKHR-type-03654
    type不得VK_ACCELERATION_STRUCTURE_TYPE_GENERIC_KHR

  • VUID-VkAccelerationStructureBuildGeometryInfoKHR-pGeometries-03788
    如果 geometryCount 不为 0,则 pGeometriesppGeometries必须恰好有一个是有效指针,另一个必须NULL

  • VUID-VkAccelerationStructureBuildGeometryInfoKHR-type-03789
    如果 typeVK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_KHR,则 pGeometriesppGeometries 的元素中的 geometryType 成员必须VK_GEOMETRY_TYPE_INSTANCES_KHR

  • VUID-VkAccelerationStructureBuildGeometryInfoKHR-type-03790
    如果 typeVK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_KHR,则 geometryCount必须1

  • VUID-VkAccelerationStructureBuildGeometryInfoKHR-type-03791
    如果 typeVK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_KHR,则 pGeometriesppGeometries 的元素中的 geometryType 成员不得VK_GEOMETRY_TYPE_INSTANCES_KHR

  • VUID-VkAccelerationStructureBuildGeometryInfoKHR-type-03792
    如果 typeVK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_KHR,则 pGeometriesppGeometries 中每个几何体的 geometryType 成员必须相同。

  • VUID-VkAccelerationStructureBuildGeometryInfoKHR-type-03793
    如果 typeVK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_KHR,则 geometryCount必须小于或等于 VkPhysicalDeviceAccelerationStructurePropertiesKHR::maxGeometryCount

  • VUID-VkAccelerationStructureBuildGeometryInfoKHR-type-03794
    如果 typeVK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_KHRpGeometriesppGeometriesgeometryType 成员为 VK_GEOMETRY_TYPE_AABBS_KHR,则所有几何体中 AABB 的总数必须小于或等于 VkPhysicalDeviceAccelerationStructurePropertiesKHR::maxPrimitiveCount

  • VUID-VkAccelerationStructureBuildGeometryInfoKHR-type-03795
    如果 typeVK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_KHRpGeometriesppGeometriesgeometryType 成员为 VK_GEOMETRY_TYPE_TRIANGLES_KHR,则所有几何体中三角形的总数必须小于或等于 VkPhysicalDeviceAccelerationStructurePropertiesKHR::maxPrimitiveCount

  • VUID-VkAccelerationStructureBuildGeometryInfoKHR-flags-03796
    如果 flags 设置了 VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_TRACE_BIT_KHR 位,则它必须没有设置 VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_BUILD_BIT_KHR 位。

  • VUID-VkAccelerationStructureBuildGeometryInfoKHR-dstAccelerationStructure-04927
    如果 dstAccelerationStructureVkAccelerationStructureCreateInfoKHR::flags 中设置了 VK_ACCELERATION_STRUCTURE_CREATE_MOTION_BIT_NV 而创建,则 flags必须设置 VK_BUILD_ACCELERATION_STRUCTURE_MOTION_BIT_NV

  • VUID-VkAccelerationStructureBuildGeometryInfoKHR-flags-04928
    如果 flags 中设置了 VK_BUILD_ACCELERATION_STRUCTURE_MOTION_BIT_NV,则 dstAccelerationStructure 的创建必须VkAccelerationStructureCreateInfoKHR::flags 中设置了 VK_ACCELERATION_STRUCTURE_CREATE_MOTION_BIT_NV

  • VUID-VkAccelerationStructureBuildGeometryInfoKHR-flags-04929
    如果 flags 中设置了 VK_BUILD_ACCELERATION_STRUCTURE_MOTION_BIT_NV,则 type不得VK_ACCELERATION_STRUCTURE_TYPE_GENERIC_KHR

  • VUID-VkAccelerationStructureBuildGeometryInfoKHR-flags-07334
    如果 flags 设置了 VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_OPACITY_MICROMAP_UPDATE_EXT 位,则它必须没有设置 VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_OPACITY_MICROMAP_DATA_UPDATE_EXT 位。

有效使用(隐式)
  • VUID-VkAccelerationStructureBuildGeometryInfoKHR-sType-sType
    sType必须VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_BUILD_GEOMETRY_INFO_KHR

  • VUID-VkAccelerationStructureBuildGeometryInfoKHR-pNext-pNext
    pNext必须NULL

  • VUID-VkAccelerationStructureBuildGeometryInfoKHR-type-parameter
    type必须为有效的 VkAccelerationStructureTypeKHR 值。

  • VUID-VkAccelerationStructureBuildGeometryInfoKHR-flags-parameter
    flags必须VkBuildAccelerationStructureFlagBitsKHR 值的有效组合。

  • VUID-VkAccelerationStructureBuildGeometryInfoKHR-pGeometries-parameter
    如果 geometryCount 不为 0,且 pGeometries 不为 NULL,则 pGeometries 必须 是指向一个包含 geometryCount 个有效 VkAccelerationStructureGeometryKHR 结构的数组的有效指针。

  • VUID-VkAccelerationStructureBuildGeometryInfoKHR-ppGeometries-parameter
    如果 geometryCount 不为 0,且 ppGeometries 不为 NULL,则 ppGeometries 必须 是指向一个包含 geometryCount 个有效指针的数组的有效指针,这些指针指向有效的 VkAccelerationStructureGeometryKHR 结构。

  • VUID-VkAccelerationStructureBuildGeometryInfoKHR-commonparent
    作为非忽略参数的有效句柄的 dstAccelerationStructuresrcAccelerationStructure必须 从同一个 VkDevice 创建、分配或检索。

VkBuildAccelerationStructureModeKHR 枚举定义如下:

// Provided by VK_KHR_acceleration_structure
typedef enum VkBuildAccelerationStructureModeKHR {
    VK_BUILD_ACCELERATION_STRUCTURE_MODE_BUILD_KHR = 0,
    VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR = 1,
} VkBuildAccelerationStructureModeKHR;
  • VK_BUILD_ACCELERATION_STRUCTURE_MODE_BUILD_KHR 指定将使用指定的几何体构建目标加速结构。

  • VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR 指定将使用源加速结构中的数据构建目标加速结构,并使用指定的几何体进行更新。

VkDeviceOrHostAddressKHR 联合体定义如下:

// Provided by VK_KHR_acceleration_structure
typedef union VkDeviceOrHostAddressKHR {
    VkDeviceAddress    deviceAddress;
    void*              hostAddress;
} VkDeviceOrHostAddressKHR;

VkDeviceOrHostAddressConstKHR 联合体定义如下:

// Provided by VK_KHR_acceleration_structure
typedef union VkDeviceOrHostAddressConstKHR {
    VkDeviceAddress    deviceAddress;
    const void*        hostAddress;
} VkDeviceOrHostAddressConstKHR;
  • deviceAddress 是由 vkGetBufferDeviceAddressKHR 命令返回的缓冲区设备地址。

  • hostAddress 是一个 const 主机内存地址。

VkAccelerationStructureGeometryKHR 结构体定义如下:

// Provided by VK_KHR_acceleration_structure
typedef struct VkAccelerationStructureGeometryKHR {
    VkStructureType                           sType;
    const void*                               pNext;
    VkGeometryTypeKHR                         geometryType;
    VkAccelerationStructureGeometryDataKHR    geometry;
    VkGeometryFlagsKHR                        flags;
} VkAccelerationStructureGeometryKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • geometryType 描述此 VkAccelerationStructureGeometryKHR 引用的几何体类型。

  • geometry 是一个 VkAccelerationStructureGeometryDataKHR 联合体,描述相关几何体类型的几何体数据。

  • flags 是一个 VkGeometryFlagBitsKHR 值的位掩码,描述如何构建几何体的其他属性。

有效使用(隐式)
  • VUID-VkAccelerationStructureGeometryKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_KHR

  • VUID-VkAccelerationStructureGeometryKHR-pNext-pNext
    pNext必须NULL

  • VUID-VkAccelerationStructureGeometryKHR-geometryType-parameter
    geometryType 必须 是一个有效的 VkGeometryTypeKHR 值。

  • VUID-VkAccelerationStructureGeometryKHR-triangles-parameter
    如果 geometryTypeVK_GEOMETRY_TYPE_TRIANGLES_KHR,则 geometrytriangles 成员 必须 是一个有效的 VkAccelerationStructureGeometryTrianglesDataKHR 结构。

  • VUID-VkAccelerationStructureGeometryKHR-aabbs-parameter
    如果 geometryTypeVK_GEOMETRY_TYPE_AABBS_KHR,则 geometryaabbs 成员 必须 是一个有效的 VkAccelerationStructureGeometryAabbsDataKHR 结构。

  • VUID-VkAccelerationStructureGeometryKHR-instances-parameter
    如果 geometryTypeVK_GEOMETRY_TYPE_INSTANCES_KHR,则 geometryinstances 成员 必须 是一个有效的 VkAccelerationStructureGeometryInstancesDataKHR 结构。

  • VUID-VkAccelerationStructureGeometryKHR-flags-parameter
    flags 必须VkGeometryFlagBitsKHR 值的有效组合。

VkAccelerationStructureGeometryDataKHR 联合体定义如下:

// Provided by VK_KHR_acceleration_structure
typedef union VkAccelerationStructureGeometryDataKHR {
    VkAccelerationStructureGeometryTrianglesDataKHR    triangles;
    VkAccelerationStructureGeometryAabbsDataKHR        aabbs;
    VkAccelerationStructureGeometryInstancesDataKHR    instances;
} VkAccelerationStructureGeometryDataKHR;

VkAccelerationStructureGeometryTrianglesDataKHR 结构体定义如下:

// Provided by VK_KHR_acceleration_structure
typedef struct VkAccelerationStructureGeometryTrianglesDataKHR {
    VkStructureType                  sType;
    const void*                      pNext;
    VkFormat                         vertexFormat;
    VkDeviceOrHostAddressConstKHR    vertexData;
    VkDeviceSize                     vertexStride;
    uint32_t                         maxVertex;
    VkIndexType                      indexType;
    VkDeviceOrHostAddressConstKHR    indexData;
    VkDeviceOrHostAddressConstKHR    transformData;
} VkAccelerationStructureGeometryTrianglesDataKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • vertexFormat 是每个顶点元素的 VkFormat

  • vertexData 是指向包含此几何体的顶点数据的内存的设备或主机地址。

  • maxVertexvertexData 中顶点数减一。

  • vertexStride 是每个顶点之间的字节步长。

  • indexType 是每个索引元素的 VkIndexType

  • indexData 是指向包含此几何体的索引数据的内存的设备或主机地址。

  • transformData 是指向内存的设备或主机地址,该内存包含指向 VkTransformMatrixKHR 结构的可选引用,该结构描述了从描述此几何体中顶点的空间到定义加速结构的空间的转换。

与图形管道中 VkVertexInputBindingDescription 的顶点缓冲区步长(不能超过 maxVertexInputBindingStride)不同,加速结构几何体的 vertexStride 被限制为 32 位值。

有效使用
  • VUID-VkAccelerationStructureGeometryTrianglesDataKHR-vertexStride-03735
    vertexStride 必须vertexFormat 的最小组件的字节大小的倍数。

  • VUID-VkAccelerationStructureGeometryTrianglesDataKHR-vertexStride-03819
    vertexStride 必须 小于或等于 232-1

  • VUID-VkAccelerationStructureGeometryTrianglesDataKHR-vertexFormat-03797
    vertexFormat格式特性 必须 包含 VK_FORMAT_FEATURE_ACCELERATION_STRUCTURE_VERTEX_BUFFER_BIT_KHR

  • VUID-VkAccelerationStructureGeometryTrianglesDataKHR-indexType-03798
    indexType 必须VK_INDEX_TYPE_UINT16VK_INDEX_TYPE_UINT32VK_INDEX_TYPE_NONE_KHR

有效使用(隐式)

VkAccelerationStructureGeometryMotionTrianglesDataNV 结构定义如下:

// Provided by VK_NV_ray_tracing_motion_blur
typedef struct VkAccelerationStructureGeometryMotionTrianglesDataNV {
    VkStructureType                  sType;
    const void*                      pNext;
    VkDeviceOrHostAddressConstKHR    vertexData;
} VkAccelerationStructureGeometryMotionTrianglesDataNV;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • vertexData 是指向此几何体在时间 1.0 的顶点数据的指针。

如果 VkAccelerationStructureGeometryMotionTrianglesDataNV 包含在 VkAccelerationStructureGeometryTrianglesDataKHR 结构的 pNext 链中,则基本顶点位置用于几何体在时间 0.0 的三角形位置,VkAccelerationStructureGeometryMotionTrianglesDataNV 中的 vertexData 用于时间 1.0 的顶点位置,中间时间的位置进行线性插值。

VkAccelerationStructureGeometryMotionTrianglesDataNVvertexData 的索引与基本顶点位置数据等效。

有效使用(隐式)
  • VUID-VkAccelerationStructureGeometryMotionTrianglesDataNV-sType-sType
    sType 必须VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_MOTION_TRIANGLES_DATA_NV

VkAccelerationStructureTrianglesOpacityMicromapEXT 结构定义如下:

// Provided by VK_EXT_opacity_micromap
typedef struct VkAccelerationStructureTrianglesOpacityMicromapEXT {
    VkStructureType                     sType;
    void*                               pNext;
    VkIndexType                         indexType;
    VkDeviceOrHostAddressConstKHR       indexBuffer;
    VkDeviceSize                        indexStride;
    uint32_t                            baseTriangle;
    uint32_t                            usageCountsCount;
    const VkMicromapUsageEXT*           pUsageCounts;
    const VkMicromapUsageEXT* const*    ppUsageCounts;
    VkMicromapEXT                       micromap;
} VkAccelerationStructureTrianglesOpacityMicromapEXT;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • indexType 是索引此微映射时使用的三角形索引的类型。

  • indexBuffer 是包含三角形索引的地址。

  • indexStride 是三角形索引之间的字节步幅。

  • baseTriangle 是添加到非负三角形索引的基值。

  • usageCountsCount 指定将用于确定此微映射大小的用法计数结构的数目。

  • pUsageCounts 是指向 VkMicromapUsageEXT 结构数组的指针。

  • ppUsageCounts 是指向 VkMicromapUsageEXT 结构指针数组的指针。

  • micromap 是要包含在此几何体中的微映射对象的句柄。

如果 VkAccelerationStructureTrianglesOpacityMicromapEXT 包含在 VkAccelerationStructureGeometryTrianglesDataKHR 结构的 pNext 链中,则该几何体将引用该微映射。

对于几何体中的每个三角形,加速结构构建使用 indexTypeindexStrideindexBuffer 中获取索引。如果该值是 VkOpacityMicromapSpecialIndexEXT 中某个值的无符号转换,则该三角形的行为与 射线不透明度微映射中该特殊值描述的行为相同。否则,该三角形使用 micromap 中该索引加上 baseTriangle 的不透明度微映射信息。

pUsageCountsppUsageCounts只能有一个是指向有效指针,另一个必须NULL。非 NULL 数组的元素描述用于构建此几何体的总计数。对于给定的 formatsubdivisionLevel,在此几何体中,与间接和特殊索引处理后匹配这些值的三角形数目必须等于提供的匹配 count 的总和。

如果 micromapVK_NULL_HANDLE,则从 indexBuffer 读取的每个值必须VkOpacityMicromapSpecialIndexEXT 中的值之一。

有效使用
  • VUID-VkAccelerationStructureTrianglesOpacityMicromapEXT-pUsageCounts-07335
    pUsageCountsppUsageCounts只能有一个是指向有效指针,另一个必须NULL

有效使用(隐式)
  • VUID-VkAccelerationStructureTrianglesOpacityMicromapEXT-sType-sType
    sType 必须VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_TRIANGLES_OPACITY_MICROMAP_EXT

  • VUID-VkAccelerationStructureTrianglesOpacityMicromapEXT-indexType-parameter
    indexType 必须是有效的 VkIndexType 值。

  • VUID-VkAccelerationStructureTrianglesOpacityMicromapEXT-pUsageCounts-parameter
    如果 usageCountsCount 不为 0pUsageCounts 不为 NULL,则 pUsageCounts 必须是指向 usageCountsCountVkMicromapUsageEXT 结构数组的有效指针。

  • VUID-VkAccelerationStructureTrianglesOpacityMicromapEXT-ppUsageCounts-parameter
    如果 usageCountsCount 不为 0ppUsageCounts 不为 NULL,则 ppUsageCounts 必须是指向 usageCountsCount 个指向 VkMicromapUsageEXT 结构的有效指针数组的有效指针。

  • VUID-VkAccelerationStructureTrianglesOpacityMicromapEXT-micromap-parameter
    如果 micromap 不是 VK_NULL_HANDLE,则 micromap 必须是有效的 VkMicromapEXT 句柄。

VkOpacityMicromapSpecialIndexEXT 枚举定义如下:

// Provided by VK_EXT_opacity_micromap
typedef enum VkOpacityMicromapSpecialIndexEXT {
    VK_OPACITY_MICROMAP_SPECIAL_INDEX_FULLY_TRANSPARENT_EXT = -1,
    VK_OPACITY_MICROMAP_SPECIAL_INDEX_FULLY_OPAQUE_EXT = -2,
    VK_OPACITY_MICROMAP_SPECIAL_INDEX_FULLY_UNKNOWN_TRANSPARENT_EXT = -3,
    VK_OPACITY_MICROMAP_SPECIAL_INDEX_FULLY_UNKNOWN_OPAQUE_EXT = -4,
} VkOpacityMicromapSpecialIndexEXT;
  • VK_OPACITY_MICROMAP_SPECIAL_INDEX_FULLY_TRANSPARENT_EXT 指定整个三角形完全透明。

  • VK_OPACITY_MICROMAP_SPECIAL_INDEX_FULLY_OPAQUE_EXT 指定整个三角形完全不透明。

  • VK_OPACITY_MICROMAP_SPECIAL_INDEX_FULLY_UNKNOWN_TRANSPARENT_EXT 指定整个三角形为未知透明。

  • VK_OPACITY_MICROMAP_SPECIAL_INDEX_FULLY_UNKNOWN_OPAQUE_EXT 指定整个三角形为未知不透明。

VkAccelerationStructureTrianglesDisplacementMicromapNV 结构定义如下:

// Provided by VK_NV_displacement_micromap
typedef struct VkAccelerationStructureTrianglesDisplacementMicromapNV {
    VkStructureType                     sType;
    void*                               pNext;
    VkFormat                            displacementBiasAndScaleFormat;
    VkFormat                            displacementVectorFormat;
    VkDeviceOrHostAddressConstKHR       displacementBiasAndScaleBuffer;
    VkDeviceSize                        displacementBiasAndScaleStride;
    VkDeviceOrHostAddressConstKHR       displacementVectorBuffer;
    VkDeviceSize                        displacementVectorStride;
    VkDeviceOrHostAddressConstKHR       displacedMicromapPrimitiveFlags;
    VkDeviceSize                        displacedMicromapPrimitiveFlagsStride;
    VkIndexType                         indexType;
    VkDeviceOrHostAddressConstKHR       indexBuffer;
    VkDeviceSize                        indexStride;
    uint32_t                            baseTriangle;
    uint32_t                            usageCountsCount;
    const VkMicromapUsageEXT*           pUsageCounts;
    const VkMicromapUsageEXT* const*    ppUsageCounts;
    VkMicromapEXT                       micromap;
} VkAccelerationStructureTrianglesDisplacementMicromapNV;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • displacementBiasAndScaleFormat 是此位移微映射参考中使用的位移偏差和缩放的格式。

  • displacementVectorFormat 是此位移微映射参考中使用的位移矢量的格式。

  • displacementBiasAndScaleBuffer 是包含偏移和缩放值的地址。

  • displacementBiasAndScaleStride 是偏移值和缩放值之间的字节步长。

  • displacementVectorBuffer 是包含位移向量值的地址。

  • displacementVectorStride 是位移向量值之间的字节步长。

  • displacedMicromapPrimitiveFlags 是包含图元标志的地址。

  • displacedMicromapPrimitiveFlagsStride 是图元标志值之间的字节步长。

  • indexType 是索引此微型贴图时使用的三角形索引的类型。

  • indexBuffer 是包含三角形索引的地址。

  • indexStride 是三角形索引之间的字节步长。

  • baseTriangle 是添加到非负三角形索引的基值。

  • usageCountsCount 指定将用于确定此微映射大小的用法计数结构的数目。

  • pUsageCounts 是指向 VkMicromapUsageEXT 结构数组的指针。

  • ppUsageCounts 是指向 VkMicromapUsageEXT 结构指针数组的指针。

  • micromap 是要包含在此几何体中的微型贴图对象的句柄。

如果 VkAccelerationStructureTrianglesDisplacementMicromapNV 包含在 VkAccelerationStructureGeometryTrianglesDataKHR 结构的 pNext 链中,则该几何体将引用该微型贴图。

对于几何体中的每个三角形,加速结构构建会使用 indexTypeindexStrideindexBuffer 中获取索引。该三角形使用来自 micromap 的位移微型贴图信息,该信息位于该索引加上 baseTriangle 处。

pUsageCountsppUsageCounts 中只能有一个是指向有效指针,另一个必须NULL。非 NULL 数组的元素描述了用于构建此几何体的总计数。对于给定的 formatsubdivisionLevel,此几何体中与间接寻址后匹配这些值的三角形数量必须等于所提供的匹配 count 的总和。

有效使用
  • VUID-VkAccelerationStructureTrianglesDisplacementMicromapNV-displacementBiasAndScaleFormat-09501
    displacementBiasAndScaleFormat 必须不是 VK_FORMAT_UNDEFINED

  • VUID-VkAccelerationStructureTrianglesDisplacementMicromapNV-displacementVectorFormat-09502
    displacementVectorFormat 必须不是 VK_FORMAT_UNDEFINED

  • VUID-VkAccelerationStructureTrianglesDisplacementMicromapNV-pUsageCounts-07992
    pUsageCountsppUsageCounts只能有一个是指向有效指针,另一个必须NULL

有效使用(隐式)
  • VUID-VkAccelerationStructureTrianglesDisplacementMicromapNV-sType-sType
    sType 必须VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_TRIANGLES_DISPLACEMENT_MICROMAP_NV

  • VUID-VkAccelerationStructureTrianglesDisplacementMicromapNV-displacementBiasAndScaleFormat-parameter
    displacementBiasAndScaleFormat 必须是有效的 VkFormat

  • VUID-VkAccelerationStructureTrianglesDisplacementMicromapNV-displacementVectorFormat-parameter
    displacementVectorFormat 必须是有效的 VkFormat

  • VUID-VkAccelerationStructureTrianglesDisplacementMicromapNV-indexType-parameter
    indexType 必须是有效的 VkIndexType 值。

  • VUID-VkAccelerationStructureTrianglesDisplacementMicromapNV-pUsageCounts-parameter
    如果 usageCountsCount 不为 0pUsageCounts 不为 NULL,则 pUsageCounts 必须是指向 usageCountsCountVkMicromapUsageEXT 结构数组的有效指针。

  • VUID-VkAccelerationStructureTrianglesDisplacementMicromapNV-ppUsageCounts-parameter
    如果 usageCountsCount 不为 0ppUsageCounts 不为 NULL,则 ppUsageCounts 必须是指向 usageCountsCount 个指向 VkMicromapUsageEXT 结构的有效指针数组的有效指针。

  • VUID-VkAccelerationStructureTrianglesDisplacementMicromapNV-micromap-parameter
    如果 micromap 不是 VK_NULL_HANDLE,则 micromap 必须是有效的 VkMicromapEXT 句柄。

VkTransformMatrixKHR 结构定义为

// Provided by VK_KHR_acceleration_structure
typedef struct VkTransformMatrixKHR {
    float    matrix[3][4];
} VkTransformMatrixKHR;

或等效的

// Provided by VK_NV_ray_tracing
typedef VkTransformMatrixKHR VkTransformMatrixNV;
  • matrix 是一个 3x4 行主仿射变换矩阵。

有效使用
  • VUID-VkTransformMatrixKHR-matrix-03799
    matrix 的前三列必须定义一个可逆的 3x3 矩阵

VkAccelerationStructureGeometryAabbsDataKHR 结构定义为

// Provided by VK_KHR_acceleration_structure
typedef struct VkAccelerationStructureGeometryAabbsDataKHR {
    VkStructureType                  sType;
    const void*                      pNext;
    VkDeviceOrHostAddressConstKHR    data;
    VkDeviceSize                     stride;
} VkAccelerationStructureGeometryAabbsDataKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • data 是指向内存的设备或主机地址,该内存包含 VkAabbPositionsKHR 结构,其中包含几何体中每个轴对齐边界框的位置数据。

  • stridedata 中每个条目之间的字节步长。步长必须8 的倍数。

有效使用
  • VUID-VkAccelerationStructureGeometryAabbsDataKHR-stride-03545
    stride 必须8 的倍数

  • VUID-VkAccelerationStructureGeometryAabbsDataKHR-stride-03820
    stride 必须小于或等于 232-1

有效使用(隐式)
  • VUID-VkAccelerationStructureGeometryAabbsDataKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_AABBS_DATA_KHR

  • VUID-VkAccelerationStructureGeometryAabbsDataKHR-pNext-pNext
    pNext必须NULL

VkAabbPositionsKHR 结构定义为

// Provided by VK_KHR_acceleration_structure
typedef struct VkAabbPositionsKHR {
    float    minX;
    float    minY;
    float    minZ;
    float    maxX;
    float    maxY;
    float    maxZ;
} VkAabbPositionsKHR;

或等效的

// Provided by VK_NV_ray_tracing
typedef VkAabbPositionsKHR VkAabbPositionsNV;
  • minX 是边界框的一个对角角的 x 位置。

  • minY 是边界框的一个对角角的 y 位置。

  • minZ 是边界框的一个对角角的 z 位置。

  • maxX 是边界框的另一个对角角的 x 位置。

  • maxY 是边界框的另一个对角角的 y 位置。

  • maxZ 是边界框的另一个对角角的 z 位置。

有效使用
  • VUID-VkAabbPositionsKHR-minX-03546
    minX 必须小于或等于 maxX

  • VUID-VkAabbPositionsKHR-minY-03547
    minY 必须小于或等于 maxY

  • VUID-VkAabbPositionsKHR-minZ-03548
    minZ 必须小于或等于 maxZ

VkAccelerationStructureGeometryInstancesDataKHR 结构定义为

// Provided by VK_KHR_acceleration_structure
typedef struct VkAccelerationStructureGeometryInstancesDataKHR {
    VkStructureType                  sType;
    const void*                      pNext;
    VkBool32                         arrayOfPointers;
    VkDeviceOrHostAddressConstKHR    data;
} VkAccelerationStructureGeometryInstancesDataKHR;
有效使用(隐式)
  • VUID-VkAccelerationStructureGeometryInstancesDataKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_INSTANCES_DATA_KHR

  • VUID-VkAccelerationStructureGeometryInstancesDataKHR-pNext-pNext
    pNext必须NULL

加速结构实例 可以 构建到顶层加速结构中。每个加速结构实例是顶层加速结构中的一个单独条目,其中包含在转换位置的底层加速结构的所有几何体。多个实例可以指向同一个底层加速结构。

加速结构实例由以下结构定义

// Provided by VK_KHR_acceleration_structure
typedef struct VkAccelerationStructureInstanceKHR {
    VkTransformMatrixKHR          transform;
    uint32_t                      instanceCustomIndex:24;
    uint32_t                      mask:8;
    uint32_t                      instanceShaderBindingTableRecordOffset:24;
    VkGeometryInstanceFlagsKHR    flags:8;
    uint64_t                      accelerationStructureReference;
} VkAccelerationStructureInstanceKHR;

或等效的

// Provided by VK_NV_ray_tracing
typedef VkAccelerationStructureInstanceKHR VkAccelerationStructureInstanceNV;
  • transform 是一个 VkTransformMatrixKHR 结构,描述要应用于加速结构的转换。

  • instanceCustomIndex 是一个 24 位的应用程序指定索引值,可以在 InstanceCustomIndexKHR 内置的射线着色器中访问。

  • mask 是一个 8 位的几何体可见性掩码。仅当 Cull Mask & instance.mask != 0 时,可能会命中实例

  • instanceShaderBindingTableRecordOffset 是一个 24 位偏移量,用于计算命中着色器绑定表索引。

  • flags 是一个 8 位的 VkGeometryInstanceFlagBitsKHR 值掩码,应用于此实例。

  • accelerationStructureReference 要么是

C 语言规范没有定义位域的顺序,但在实践中,此结构使用现有的编译器会产生正确的布局。预期的位模式如下

  • instanceCustomIndexmask 占用相同的内存,如同在它们的位置指定单个 uint32_t 一样

    • instanceCustomIndex 占用该内存的 24 个最低有效位

    • mask 占用该内存的 8 个最高有效位

  • instanceShaderBindingTableRecordOffsetflags 占用相同的内存,如同在它们的位置指定单个 uint32_t 一样

    • instanceShaderBindingTableRecordOffset 占用该内存的 24 个最低有效位

    • flags 占用该内存的 8 个最高有效位

如果编译器生成的代码与该模式不同,则应用程序必须采用其他方法来根据正确的位模式设置值。

有效使用(隐式)

实例中 flags 的可能值会修改该实例的行为,如下所示

// Provided by VK_KHR_acceleration_structure
typedef enum VkGeometryInstanceFlagBitsKHR {
    VK_GEOMETRY_INSTANCE_TRIANGLE_FACING_CULL_DISABLE_BIT_KHR = 0x00000001,
    VK_GEOMETRY_INSTANCE_TRIANGLE_FLIP_FACING_BIT_KHR = 0x00000002,
    VK_GEOMETRY_INSTANCE_FORCE_OPAQUE_BIT_KHR = 0x00000004,
    VK_GEOMETRY_INSTANCE_FORCE_NO_OPAQUE_BIT_KHR = 0x00000008,
  // Provided by VK_EXT_opacity_micromap
    VK_GEOMETRY_INSTANCE_FORCE_OPACITY_MICROMAP_2_STATE_EXT = 0x00000010,
  // Provided by VK_EXT_opacity_micromap
    VK_GEOMETRY_INSTANCE_DISABLE_OPACITY_MICROMAPS_EXT = 0x00000020,
    VK_GEOMETRY_INSTANCE_TRIANGLE_FRONT_COUNTERCLOCKWISE_BIT_KHR = VK_GEOMETRY_INSTANCE_TRIANGLE_FLIP_FACING_BIT_KHR,
  // Provided by VK_NV_ray_tracing
    VK_GEOMETRY_INSTANCE_TRIANGLE_CULL_DISABLE_BIT_NV = VK_GEOMETRY_INSTANCE_TRIANGLE_FACING_CULL_DISABLE_BIT_KHR,
  // Provided by VK_NV_ray_tracing
    VK_GEOMETRY_INSTANCE_TRIANGLE_FRONT_COUNTERCLOCKWISE_BIT_NV = VK_GEOMETRY_INSTANCE_TRIANGLE_FRONT_COUNTERCLOCKWISE_BIT_KHR,
  // Provided by VK_NV_ray_tracing
    VK_GEOMETRY_INSTANCE_FORCE_OPAQUE_BIT_NV = VK_GEOMETRY_INSTANCE_FORCE_OPAQUE_BIT_KHR,
  // Provided by VK_NV_ray_tracing
    VK_GEOMETRY_INSTANCE_FORCE_NO_OPAQUE_BIT_NV = VK_GEOMETRY_INSTANCE_FORCE_NO_OPAQUE_BIT_KHR,
} VkGeometryInstanceFlagBitsKHR;

或等效的

// Provided by VK_NV_ray_tracing
typedef VkGeometryInstanceFlagBitsKHR VkGeometryInstanceFlagBitsNV;
  • VK_GEOMETRY_INSTANCE_TRIANGLE_FACING_CULL_DISABLE_BIT_KHR 禁用此实例的面剔除。

  • VK_GEOMETRY_INSTANCE_TRIANGLE_FLIP_FACING_BIT_KHR 指定此实例中几何体的 朝向确定 被反转。由于朝向是在对象空间中确定的,因此实例变换不会更改缠绕顺序,但几何体变换会更改。

  • VK_GEOMETRY_INSTANCE_FORCE_OPAQUE_BIT_KHR 使此实例的行为如同在此实例引用的所有几何体上都指定了 VK_GEOMETRY_OPAQUE_BIT_KHR 一样。此行为可以被 SPIR-V NoOpaqueKHR 射线标志覆盖。

  • VK_GEOMETRY_INSTANCE_FORCE_NO_OPAQUE_BIT_KHR 使此实例的行为如同在此实例引用的所有几何体上都未指定 VK_GEOMETRY_OPAQUE_BIT_KHR 一样。此行为可以被 SPIR-V OpaqueKHR 射线标志覆盖。

VK_GEOMETRY_INSTANCE_FORCE_NO_OPAQUE_BIT_KHRVK_GEOMETRY_INSTANCE_FORCE_OPAQUE_BIT_KHR 不能在同一标志中使用。

// Provided by VK_KHR_acceleration_structure
typedef VkFlags VkGeometryInstanceFlagsKHR;

或等效的

// Provided by VK_NV_ray_tracing
typedef VkGeometryInstanceFlagsKHR VkGeometryInstanceFlagsNV;

VkGeometryInstanceFlagsKHR 是一个位掩码类型,用于设置零个或多个 VkGeometryInstanceFlagBitsKHR 的掩码。

加速结构运动实例 可以构建到顶层加速结构中。每个加速结构实例是顶层加速结构中的一个单独条目,其中包括在转换位置的底层加速结构的所有几何体,以及运动类型和用于确定实例随时间变化的运动的参数。

加速结构运动实例由以下结构定义

// Provided by VK_NV_ray_tracing_motion_blur
typedef struct VkAccelerationStructureMotionInstanceNV {
    VkAccelerationStructureMotionInstanceTypeNV     type;
    VkAccelerationStructureMotionInstanceFlagsNV    flags;
    VkAccelerationStructureMotionInstanceDataNV     data;
} VkAccelerationStructureMotionInstanceNV;

如果使用标准 C 编译器以外的其他编译器编写此结构,请注意最终结构应为 152 字节大小。

有效使用(隐式)
  • VUID-VkAccelerationStructureMotionInstanceNV-type-parameter
    type 必须是有效的 VkAccelerationStructureMotionInstanceTypeNV

  • VUID-VkAccelerationStructureMotionInstanceNV-flags-zerobitmask
    flags 必须0

  • VUID-VkAccelerationStructureMotionInstanceNV-staticInstance-parameter
    如果 typeVK_ACCELERATION_STRUCTURE_MOTION_INSTANCE_TYPE_STATIC_NV,则 datastaticInstance 成员必须是有效的 VkAccelerationStructureInstanceKHR 结构

  • VUID-VkAccelerationStructureMotionInstanceNV-matrixMotionInstance-parameter
    如果 typeVK_ACCELERATION_STRUCTURE_MOTION_INSTANCE_TYPE_MATRIX_MOTION_NV,则 datamatrixMotionInstance 成员必须是有效的 VkAccelerationStructureMatrixMotionInstanceNV 结构

  • VUID-VkAccelerationStructureMotionInstanceNV-srtMotionInstance-parameter
    如果 typeVK_ACCELERATION_STRUCTURE_MOTION_INSTANCE_TYPE_SRT_MOTION_NV,则 datasrtMotionInstance 成员必须是有效的 VkAccelerationStructureSRTMotionInstanceNV 结构

加速结构运动实例由联合定义

// Provided by VK_NV_ray_tracing_motion_blur
typedef union VkAccelerationStructureMotionInstanceDataNV {
    VkAccelerationStructureInstanceKHR               staticInstance;
    VkAccelerationStructureMatrixMotionInstanceNV    matrixMotionInstance;
    VkAccelerationStructureSRTMotionInstanceNV       srtMotionInstance;
} VkAccelerationStructureMotionInstanceDataNV;
// Provided by VK_NV_ray_tracing_motion_blur
typedef VkFlags VkAccelerationStructureMotionInstanceFlagsNV;

VkAccelerationStructureMotionInstanceFlagsNV 是一个位掩码类型,用于设置掩码,但目前保留供将来使用。

VkAccelerationStructureMotionInstanceTypeNV 枚举定义为

// Provided by VK_NV_ray_tracing_motion_blur
typedef enum VkAccelerationStructureMotionInstanceTypeNV {
    VK_ACCELERATION_STRUCTURE_MOTION_INSTANCE_TYPE_STATIC_NV = 0,
    VK_ACCELERATION_STRUCTURE_MOTION_INSTANCE_TYPE_MATRIX_MOTION_NV = 1,
    VK_ACCELERATION_STRUCTURE_MOTION_INSTANCE_TYPE_SRT_MOTION_NV = 2,
} VkAccelerationStructureMotionInstanceTypeNV;
  • VK_ACCELERATION_STRUCTURE_MOTION_INSTANCE_TYPE_STATIC_NV 指定实例为静态实例,没有实例运动。

  • VK_ACCELERATION_STRUCTURE_MOTION_INSTANCE_TYPE_MATRIX_MOTION_NV 指定实例为运动实例,运动由两个矩阵之间的插值指定。

  • VK_ACCELERATION_STRUCTURE_MOTION_INSTANCE_TYPE_SRT_MOTION_NV 指定实例为运动实例,运动由 SRT 分解中的插值指定。

加速结构矩阵运动实例由以下结构定义

// Provided by VK_NV_ray_tracing_motion_blur
typedef struct VkAccelerationStructureMatrixMotionInstanceNV {
    VkTransformMatrixKHR          transformT0;
    VkTransformMatrixKHR          transformT1;
    uint32_t                      instanceCustomIndex:24;
    uint32_t                      mask:8;
    uint32_t                      instanceShaderBindingTableRecordOffset:24;
    VkGeometryInstanceFlagsKHR    flags:8;
    uint64_t                      accelerationStructureReference;
} VkAccelerationStructureMatrixMotionInstanceNV;
  • transformT0 是一个 VkTransformMatrixKHR 结构,描述在时间 0 应用于加速结构的转换。

  • transformT1 是一个 VkTransformMatrixKHR 结构,描述在时间 1 应用于加速结构的转换。

  • instanceCustomIndex 是一个 24 位的应用程序指定索引值,可以在 InstanceCustomIndexKHR 内置的射线着色器中访问。

  • mask 是一个 8 位的几何体可见性掩码。仅当 Cull Mask & instance.mask != 0 时,可能会命中实例

  • instanceShaderBindingTableRecordOffset 是一个 24 位偏移量,用于计算命中着色器绑定表索引。

  • flags 是一个 8 位的 VkGeometryInstanceFlagBitsKHR 值掩码,应用于此实例。

  • accelerationStructureReference 要么是

C 语言规范没有定义位域的顺序,但在实践中,此结构使用现有的编译器会产生正确的布局。预期的位模式如下

  • instanceCustomIndexmask 占用相同的内存,如同在它们的位置指定单个 uint32_t 一样

    • instanceCustomIndex 占用该内存的 24 个最低有效位

    • mask 占用该内存的 8 个最高有效位

  • instanceShaderBindingTableRecordOffsetflags 占用相同的内存,如同在它们的位置指定单个 uint32_t 一样

    • instanceShaderBindingTableRecordOffset 占用该内存的 24 个最低有效位

    • flags 占用该内存的 8 个最高有效位

如果编译器生成的代码与该模式不同,则应用程序必须采用其他方法来根据正确的位模式设置值。

在时间点上,矩阵运动实例的变换是通过对两个变换进行逐分量线性插值得到的。也就是说,对于 [0,1] 中的 time,得到的变换是:

transformT0 × (1 - time) + transformT1 × time

有效使用(隐式)

加速结构 SRT 运动实例由以下结构定义:

// Provided by VK_NV_ray_tracing_motion_blur
typedef struct VkAccelerationStructureSRTMotionInstanceNV {
    VkSRTDataNV                   transformT0;
    VkSRTDataNV                   transformT1;
    uint32_t                      instanceCustomIndex:24;
    uint32_t                      mask:8;
    uint32_t                      instanceShaderBindingTableRecordOffset:24;
    VkGeometryInstanceFlagsKHR    flags:8;
    uint64_t                      accelerationStructureReference;
} VkAccelerationStructureSRTMotionInstanceNV;
  • transformT0 是一个 VkSRTDataNV 结构,描述在时间 0 时应用于加速结构的变换。

  • transformT1 是一个 VkSRTDataNV 结构,描述在时间 1 时应用于加速结构的变换。

  • instanceCustomIndex 是一个 24 位的应用程序指定索引值,可以在 InstanceCustomIndexKHR 内置的射线着色器中访问。

  • mask 是一个 8 位的几何体可见性掩码。仅当 Cull Mask & instance.mask != 0 时,可能会命中实例

  • instanceShaderBindingTableRecordOffset 是一个 24 位偏移量,用于计算命中着色器绑定表索引。

  • flags 是一个 8 位的 VkGeometryInstanceFlagBitsKHR 值掩码,应用于此实例。

  • accelerationStructureReference 要么是

C 语言规范没有定义位域的顺序,但在实践中,此结构使用现有的编译器会产生正确的布局。预期的位模式如下

  • instanceCustomIndexmask 占用相同的内存,如同在它们的位置指定单个 uint32_t 一样

    • instanceCustomIndex 占用该内存的 24 个最低有效位

    • mask 占用该内存的 8 个最高有效位

  • instanceShaderBindingTableRecordOffsetflags 占用相同的内存,如同在它们的位置指定单个 uint32_t 一样

    • instanceShaderBindingTableRecordOffset 占用该内存的 24 个最低有效位

    • flags 占用该内存的 8 个最高有效位

如果编译器生成的代码与该模式不同,则应用程序必须采用其他方法来根据正确的位模式设置值。

在时间点上,SRT 运动实例的变换是通过对两个 SRT 变换进行逐分量线性插值得到的。也就是说,对于 [0,1] 中的 time,得到的变换是:

transformT0 × (1 - time) + transformT1 × time

有效使用(隐式)

加速结构 SRT 变换由以下结构定义:

// Provided by VK_NV_ray_tracing_motion_blur
typedef struct VkSRTDataNV {
    float    sx;
    float    a;
    float    b;
    float    pvx;
    float    sy;
    float    c;
    float    pvy;
    float    sz;
    float    pvz;
    float    qx;
    float    qy;
    float    qz;
    float    qw;
    float    tx;
    float    ty;
    float    tz;
} VkSRTDataNV;
  • sx 是变换的缩放的 x 分量

  • a 是变换的剪切的一个分量

  • b 是变换的剪切的一个分量

  • pvx 是变换的枢轴点的 x 分量

  • sy 是变换的缩放的 y 分量

  • c 是变换的剪切的一个分量

  • pvy 是变换的枢轴点的 y 分量

  • sz 是变换的缩放的 z 分量

  • pvz 是变换的枢轴点的 z 分量

  • qx 是旋转四元数的 x 分量

  • qy 是旋转四元数的 y 分量

  • qz 是旋转四元数的 z 分量

  • qw 是旋转四元数的 w 分量

  • tx 是旋转后平移的 x 分量

  • ty 是旋转后平移的 y 分量

  • tz 是旋转后平移的 z 分量

此变换分解包含三个元素。第一个是矩阵 S,由缩放、剪切和平移组成,通常用于定义后续旋转的枢轴点。此矩阵由以下参数构造:

旋转四元数定义为:

R = [ qx, qy, qz, qw ]

这是一个围绕概念归一化轴 [ ax, ay, az ] 旋转 theta 角度的旋转,使得:

[ qx, qy, qz ] = sin(theta/2) × [ ax, ay, az ]

qw = cos(theta/2)

最后,变换有一个平移 T,由以上参数构建:

最终得到的有效变换为:

T × R × S

VkAccelerationStructureBuildRangeInfoKHR 定义为:

// Provided by VK_KHR_acceleration_structure
typedef struct VkAccelerationStructureBuildRangeInfoKHR {
    uint32_t    primitiveCount;
    uint32_t    primitiveOffset;
    uint32_t    firstVertex;
    uint32_t    transformOffset;
} VkAccelerationStructureBuildRangeInfoKHR;
  • primitiveCount 定义了对应加速结构几何体的图元数量。

  • primitiveOffset 定义了图元数据定义所在的内存中的字节偏移量。

  • firstVertex 是要构建的第一个顶点的索引(用于三角形几何体)。

  • transformOffset 定义了变换矩阵定义所在的内存中的字节偏移量。

图元计数和图元偏移量的解释方式取决于使用的 VkGeometryTypeKHR

有效使用

复制加速结构

存在一个额外的命令,用于复制加速结构而不更新其内容。加速结构对象可以被压缩以提高性能。在复制之前,应用程序必须查询生成的加速结构的大小。

要查询加速结构大小参数,请调用

// Provided by VK_KHR_acceleration_structure
void vkCmdWriteAccelerationStructuresPropertiesKHR(
    VkCommandBuffer                             commandBuffer,
    uint32_t                                    accelerationStructureCount,
    const VkAccelerationStructureKHR*           pAccelerationStructures,
    VkQueryType                                 queryType,
    VkQueryPool                                 queryPool,
    uint32_t                                    firstQuery);
  • commandBuffer 是将记录命令的命令缓冲区。

  • accelerationStructureCount 是要查询属性的加速结构的计数。

  • pAccelerationStructures 是指向先前构建的现有加速结构数组的指针。

  • queryType 是一个 VkQueryType 值,指定由池管理的查询类型。

  • queryPool 是将管理查询结果的查询池。

  • firstQuery 是查询池中第一个查询索引,其中将包含 accelerationStructureCount 个结果。

pAccelerationStructures 中列出的任何加速结构的访问必须VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_COPY_BIT_KHR 管线阶段VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR 管线阶段同步,并且具有 VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_KHR访问类型

  • 如果 queryTypeVK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR,则写入的值是压缩的加速结构所需的字节数。

  • 如果 queryTypeVK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR,则写入的值是序列化的加速结构所需的字节数。

有效使用
  • VUID-vkCmdWriteAccelerationStructuresPropertiesKHR-accelerationStructure-08924
    必须启用 VkPhysicalDeviceAccelerationStructureFeaturesKHR::accelerationStructure 功能

  • VUID-vkCmdWriteAccelerationStructuresPropertiesKHR-queryPool-02493
    queryPool 必须使用与 queryType 匹配的 queryType 创建。

  • VUID-vkCmdWriteAccelerationStructuresPropertiesKHR-queryPool-02494
    queryPoolfirstQuery 标识的查询必须不可用的。

  • VUID-vkCmdWriteAccelerationStructuresPropertiesKHR-buffer-03736
    用于创建 pAccelerationStructures 中每个加速结构的 buffer必须绑定到设备内存。

  • VUID-vkCmdWriteAccelerationStructuresPropertiesKHR-query-04880
    firstQuery 加上 accelerationStructureCount 的总和必须小于或等于 queryPool 中的查询数量。

  • VUID-vkCmdWriteAccelerationStructuresPropertiesKHR-pAccelerationStructures-04964
    pAccelerationStructures 中的所有加速结构必须在此命令执行之前构建完成。

  • VUID-vkCmdWriteAccelerationStructuresPropertiesKHR-accelerationStructures-03431
    如果 queryTypeVK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR,则 pAccelerationStructures 中的所有加速结构必须使用 VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_COMPACTION_BIT_KHR 构建。

  • VUID-vkCmdWriteAccelerationStructuresPropertiesKHR-queryType-06742
    queryType必须VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SIZE_KHRVK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_BOTTOM_LEVEL_POINTERS_KHRVK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHRVK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR

有效使用(隐式)
  • VUID-vkCmdWriteAccelerationStructuresPropertiesKHR-commandBuffer-parameter
    commandBuffer **必须** 是一个有效的 VkCommandBuffer 句柄。

  • VUID-vkCmdWriteAccelerationStructuresPropertiesKHR-pAccelerationStructures-parameter
    pAccelerationStructures 必须是指向 accelerationStructureCount 个有效的 VkAccelerationStructureKHR 句柄数组的有效指针。

  • VUID-vkCmdWriteAccelerationStructuresPropertiesKHR-queryType-parameter
    queryType必须是有效的 VkQueryType 值。

  • VUID-vkCmdWriteAccelerationStructuresPropertiesKHR-queryPool-parameter
    queryPool必须是有效的 VkQueryPool 句柄。

  • VUID-vkCmdWriteAccelerationStructuresPropertiesKHR-commandBuffer-recording
    commandBuffer **必须** 处于记录状态

  • VUID-vkCmdWriteAccelerationStructuresPropertiesKHR-commandBuffer-cmdpool
    分配 commandBufferVkCommandPool **必须** 支持计算操作。

  • VUID-vkCmdWriteAccelerationStructuresPropertiesKHR-renderpass
    此命令 **必须** 仅在渲染过程实例之外调用。

  • VUID-vkCmdWriteAccelerationStructuresPropertiesKHR-videocoding
    此命令 **必须** 仅在视频编码范围之外调用。

  • VUID-vkCmdWriteAccelerationStructuresPropertiesKHR-accelerationStructureCount-arraylength
    accelerationStructureCount必须大于 0

  • VUID-vkCmdWriteAccelerationStructuresPropertiesKHR-commonparent
    commandBufferqueryPoolpAccelerationStructures 的元素都必须从相同的 VkDevice 创建、分配或检索。

主机同步
  • commandBuffer 的主机访问 **必须** 外部同步。

  • 对分配 commandBufferVkCommandPool 的主机访问 **必须** 外部同步。

命令属性
命令缓冲区级别 渲染过程范围 视频编码范围 支持的队列类型 命令类型

主要
次要

外部

外部

计算

操作

要查询加速结构大小参数,请调用

// Provided by VK_NV_ray_tracing
void vkCmdWriteAccelerationStructuresPropertiesNV(
    VkCommandBuffer                             commandBuffer,
    uint32_t                                    accelerationStructureCount,
    const VkAccelerationStructureNV*            pAccelerationStructures,
    VkQueryType                                 queryType,
    VkQueryPool                                 queryPool,
    uint32_t                                    firstQuery);
  • commandBuffer 是将记录命令的命令缓冲区。

  • accelerationStructureCount 是要查询属性的加速结构的计数。

  • pAccelerationStructures 是指向先前构建的现有加速结构数组的指针。

  • queryType 是一个 VkQueryType 值,指定由池管理的查询类型。

  • queryPool 是将管理查询结果的查询池。

  • firstQuery 是查询池中第一个查询索引,其中将包含 accelerationStructureCount 个结果。

pAccelerationStructures 中列出的任何加速结构的访问必须VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR 管线阶段VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_KHR访问类型同步。

有效使用
  • VUID-vkCmdWriteAccelerationStructuresPropertiesNV-queryPool-03755
    queryPool 必须使用与 queryType 匹配的 queryType 创建。

  • VUID-vkCmdWriteAccelerationStructuresPropertiesNV-queryPool-03756
    queryPoolfirstQuery 标识的查询必须不可用的。

  • VUID-vkCmdWriteAccelerationStructuresPropertiesNV-accelerationStructure-03757
    accelerationStructure 必须 通过 vkBindAccelerationStructureMemoryNV 完全且连续地绑定到单个 VkDeviceMemory 对象。

  • VUID-vkCmdWriteAccelerationStructuresPropertiesNV-pAccelerationStructures-04958
    pAccelerationStructures 中的所有加速结构必须在此命令执行之前构建完成。

  • VUID-vkCmdWriteAccelerationStructuresPropertiesNV-pAccelerationStructures-06215
    如果 queryTypeVK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_NV,则 pAccelerationStructures 中的所有加速结构必须已使用 VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_COMPACTION_BIT_KHR 构建。

  • VUID-vkCmdWriteAccelerationStructuresPropertiesNV-queryType-06216
    queryType 必须VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_NV

有效使用(隐式)
  • VUID-vkCmdWriteAccelerationStructuresPropertiesNV-commandBuffer-parameter
    commandBuffer **必须** 是一个有效的 VkCommandBuffer 句柄。

  • VUID-vkCmdWriteAccelerationStructuresPropertiesNV-pAccelerationStructures-parameter
    pAccelerationStructures 必须 是指向一个包含 accelerationStructureCount 个有效 VkAccelerationStructureNV 句柄的数组的有效指针。

  • VUID-vkCmdWriteAccelerationStructuresPropertiesNV-queryType-parameter
    queryType必须是有效的 VkQueryType 值。

  • VUID-vkCmdWriteAccelerationStructuresPropertiesNV-queryPool-parameter
    queryPool必须是有效的 VkQueryPool 句柄。

  • VUID-vkCmdWriteAccelerationStructuresPropertiesNV-commandBuffer-recording
    commandBuffer **必须** 处于记录状态

  • VUID-vkCmdWriteAccelerationStructuresPropertiesNV-commandBuffer-cmdpool
    分配 commandBufferVkCommandPool **必须** 支持计算操作。

  • VUID-vkCmdWriteAccelerationStructuresPropertiesNV-renderpass
    此命令 **必须** 仅在渲染过程实例之外调用。

  • VUID-vkCmdWriteAccelerationStructuresPropertiesNV-videocoding
    此命令 **必须** 仅在视频编码范围之外调用。

  • VUID-vkCmdWriteAccelerationStructuresPropertiesNV-accelerationStructureCount-arraylength
    accelerationStructureCount必须大于 0

  • VUID-vkCmdWriteAccelerationStructuresPropertiesNV-commonparent
    commandBufferqueryPoolpAccelerationStructures 的元素都必须从相同的 VkDevice 创建、分配或检索。

主机同步
  • commandBuffer 的主机访问 **必须** 外部同步。

  • 对分配 commandBufferVkCommandPool 的主机访问 **必须** 外部同步。

命令属性
命令缓冲区级别 渲染过程范围 视频编码范围 支持的队列类型 命令类型

主要
次要

外部

外部

计算

操作

要复制加速结构,请调用

// Provided by VK_NV_ray_tracing
void vkCmdCopyAccelerationStructureNV(
    VkCommandBuffer                             commandBuffer,
    VkAccelerationStructureNV                   dst,
    VkAccelerationStructureNV                   src,
    VkCopyAccelerationStructureModeKHR          mode);
  • commandBuffer 是将记录命令的命令缓冲区。

  • dst 是复制的目标加速结构。

  • src 是复制的源加速结构。

  • mode 是一个 VkCopyAccelerationStructureModeKHR 值,指定复制期间要执行的附加操作。

srcdst 的访问必须通过 VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_COPY_BIT_KHR 管线阶段VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR 管线阶段 以及 VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_KHRVK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_KHR访问类型进行同步

有效使用
  • VUID-vkCmdCopyAccelerationStructureNV-mode-03410
    mode 必须VK_COPY_ACCELERATION_STRUCTURE_MODE_COMPACT_KHRVK_COPY_ACCELERATION_STRUCTURE_MODE_CLONE_KHR

  • VUID-vkCmdCopyAccelerationStructureNV-src-04963
    源加速结构 src 必须在此命令执行之前构建。

  • VUID-vkCmdCopyAccelerationStructureNV-src-03411
    如果 modeVK_COPY_ACCELERATION_STRUCTURE_MODE_COMPACT_KHR,则 src 必须使用构建中的 VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_COMPACTION_BIT_KHR 构建。

  • VUID-vkCmdCopyAccelerationStructureNV-buffer-03718
    用于创建 srcbuffer 必须绑定到设备内存。

  • VUID-vkCmdCopyAccelerationStructureNV-buffer-03719
    用于创建 dstbuffer 必须绑定到设备内存。

  • VUID-vkCmdCopyAccelerationStructureNV-dst-07791
    此命令访问的 dst 的内存范围必须不与此命令访问的 src 的内存范围重叠。

  • VUID-vkCmdCopyAccelerationStructureNV-dst-07792
    dst **必须** 通过 vkBindAccelerationStructureMemoryNV 完全且连续地绑定到单个 VkDeviceMemory 对象。

有效使用(隐式)
  • VUID-vkCmdCopyAccelerationStructureNV-commandBuffer-parameter
    commandBuffer **必须** 是一个有效的 VkCommandBuffer 句柄。

  • VUID-vkCmdCopyAccelerationStructureNV-dst-parameter
    dst **必须** 是有效的 VkAccelerationStructureNV 句柄。

  • VUID-vkCmdCopyAccelerationStructureNV-src-parameter
    src 必须是有效的 VkAccelerationStructureNV 句柄。

  • VUID-vkCmdCopyAccelerationStructureNV-mode-parameter
    mode 必须是有效的 VkCopyAccelerationStructureModeKHR 值。

  • VUID-vkCmdCopyAccelerationStructureNV-commandBuffer-recording
    commandBuffer **必须** 处于记录状态

  • VUID-vkCmdCopyAccelerationStructureNV-commandBuffer-cmdpool
    分配 commandBufferVkCommandPool **必须** 支持计算操作。

  • VUID-vkCmdCopyAccelerationStructureNV-renderpass
    此命令 **必须** 仅在渲染过程实例之外调用。

  • VUID-vkCmdCopyAccelerationStructureNV-videocoding
    此命令 **必须** 仅在视频编码范围之外调用。

  • VUID-vkCmdCopyAccelerationStructureNV-commonparent
    commandBufferdstsrc 中的每一个必须已从同一个 VkDevice 创建、分配或检索。

主机同步
  • commandBuffer 的主机访问 **必须** 外部同步。

  • 对分配 commandBufferVkCommandPool 的主机访问 **必须** 外部同步。

命令属性
命令缓冲区级别 渲染过程范围 视频编码范围 支持的队列类型 命令类型

主要
次要

外部

外部

计算

操作

要复制加速结构,请调用

// Provided by VK_KHR_acceleration_structure
void vkCmdCopyAccelerationStructureKHR(
    VkCommandBuffer                             commandBuffer,
    const VkCopyAccelerationStructureInfoKHR*   pInfo);

此命令按照 pInfo->mode 指定的方式将 pInfo->src 加速结构复制到 pInfo->dst 加速结构。

pInfo->srcpInfo->dst 的访问必须通过 VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_COPY_BIT_KHR 管线阶段VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR 管线阶段 以及 VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_KHRVK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_KHR访问类型进行同步

有效使用
  • VUID-vkCmdCopyAccelerationStructureKHR-accelerationStructure-08925
    必须启用 VkPhysicalDeviceAccelerationStructureFeaturesKHR::accelerationStructure 功能

  • VUID-vkCmdCopyAccelerationStructureKHR-buffer-03737
    用于创建 pInfo->srcbuffer 必须绑定到设备内存

  • VUID-vkCmdCopyAccelerationStructureKHR-buffer-03738
    用于创建 pInfo->dstbuffer 必须绑定到设备内存

有效使用(隐式)
  • VUID-vkCmdCopyAccelerationStructureKHR-commandBuffer-parameter
    commandBuffer **必须** 是一个有效的 VkCommandBuffer 句柄。

  • VUID-vkCmdCopyAccelerationStructureKHR-pInfo-parameter
    pInfo 必须是指向有效 VkCopyAccelerationStructureInfoKHR 结构的有效指针

  • VUID-vkCmdCopyAccelerationStructureKHR-commandBuffer-recording
    commandBuffer **必须** 处于记录状态

  • VUID-vkCmdCopyAccelerationStructureKHR-commandBuffer-cmdpool
    分配 commandBufferVkCommandPool **必须** 支持计算操作。

  • VUID-vkCmdCopyAccelerationStructureKHR-renderpass
    此命令 **必须** 仅在渲染过程实例之外调用。

  • VUID-vkCmdCopyAccelerationStructureKHR-videocoding
    此命令 **必须** 仅在视频编码范围之外调用。

主机同步
  • commandBuffer 的主机访问 **必须** 外部同步。

  • 对分配 commandBufferVkCommandPool 的主机访问 **必须** 外部同步。

命令属性
命令缓冲区级别 渲染过程范围 视频编码范围 支持的队列类型 命令类型

主要
次要

外部

外部

计算

操作

VkCopyAccelerationStructureInfoKHR 结构的定义如下:

// Provided by VK_KHR_acceleration_structure
typedef struct VkCopyAccelerationStructureInfoKHR {
    VkStructureType                       sType;
    const void*                           pNext;
    VkAccelerationStructureKHR            src;
    VkAccelerationStructureKHR            dst;
    VkCopyAccelerationStructureModeKHR    mode;
} VkCopyAccelerationStructureInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • src 是复制的源加速结构。

  • dst 是复制的目标加速结构。

  • mode 是一个 VkCopyAccelerationStructureModeKHR 值,指定复制期间要执行的附加操作。

有效使用
  • VUID-VkCopyAccelerationStructureInfoKHR-mode-03410
    mode 必须VK_COPY_ACCELERATION_STRUCTURE_MODE_COMPACT_KHRVK_COPY_ACCELERATION_STRUCTURE_MODE_CLONE_KHR

  • VUID-VkCopyAccelerationStructureInfoKHR-src-04963
    源加速结构 src 必须在此命令执行之前构建。

  • VUID-VkCopyAccelerationStructureInfoKHR-src-03411
    如果 modeVK_COPY_ACCELERATION_STRUCTURE_MODE_COMPACT_KHR,则 src 必须使用构建中的 VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_COMPACTION_BIT_KHR 构建。

  • VUID-VkCopyAccelerationStructureInfoKHR-buffer-03718
    用于创建 srcbuffer 必须绑定到设备内存。

  • VUID-VkCopyAccelerationStructureInfoKHR-buffer-03719
    用于创建 dstbuffer 必须绑定到设备内存。

  • VUID-VkCopyAccelerationStructureInfoKHR-dst-07791
    此命令访问的 dst 的内存范围必须不与此命令访问的 src 的内存范围重叠。

有效使用(隐式)
  • VUID-VkCopyAccelerationStructureInfoKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_COPY_ACCELERATION_STRUCTURE_INFO_KHR

  • VUID-VkCopyAccelerationStructureInfoKHR-pNext-pNext
    pNext必须NULL

  • VUID-VkCopyAccelerationStructureInfoKHR-src-parameter
    src 必须是有效的 VkAccelerationStructureKHR 句柄

  • VUID-VkCopyAccelerationStructureInfoKHR-dst-parameter
    dst 必须是有效的 VkAccelerationStructureKHR 句柄

  • VUID-VkCopyAccelerationStructureInfoKHR-mode-parameter
    mode 必须是有效的 VkCopyAccelerationStructureModeKHR 值。

  • VUID-VkCopyAccelerationStructureInfoKHR-commonparent
    dstsrc 必须已从同一 VkDevice 创建、分配或检索

mode 的可能值指定在复制期间执行的其他操作,包括:

// Provided by VK_KHR_acceleration_structure
typedef enum VkCopyAccelerationStructureModeKHR {
    VK_COPY_ACCELERATION_STRUCTURE_MODE_CLONE_KHR = 0,
    VK_COPY_ACCELERATION_STRUCTURE_MODE_COMPACT_KHR = 1,
  // Provided by VK_KHR_acceleration_structure
    VK_COPY_ACCELERATION_STRUCTURE_MODE_SERIALIZE_KHR = 2,
  // Provided by VK_KHR_acceleration_structure
    VK_COPY_ACCELERATION_STRUCTURE_MODE_DESERIALIZE_KHR = 3,
  // Provided by VK_NV_ray_tracing
    VK_COPY_ACCELERATION_STRUCTURE_MODE_CLONE_NV = VK_COPY_ACCELERATION_STRUCTURE_MODE_CLONE_KHR,
  // Provided by VK_NV_ray_tracing
    VK_COPY_ACCELERATION_STRUCTURE_MODE_COMPACT_NV = VK_COPY_ACCELERATION_STRUCTURE_MODE_COMPACT_KHR,
} VkCopyAccelerationStructureModeKHR;

或等效的

// Provided by VK_NV_ray_tracing
typedef VkCopyAccelerationStructureModeKHR VkCopyAccelerationStructureModeNV;
  • VK_COPY_ACCELERATION_STRUCTURE_MODE_CLONE_KHR 创建 src 中指定的加速结构的直接副本,并将其复制到 dst 指定的加速结构中。dst 加速结构 必须使用与 src 相同的参数创建。如果 src 包含对其他加速结构的引用,则 dst 将引用相同的加速结构。

  • VK_COPY_ACCELERATION_STRUCTURE_MODE_COMPACT_KHR 创建一个更紧凑版本的加速结构 srcdst 中。加速结构 dst 的大小 必须至少与 vkCmdWriteAccelerationStructuresPropertiesNVvkCmdWriteAccelerationStructuresPropertiesKHRvkWriteAccelerationStructuresPropertiesKHR 在构建 src 指定的加速结构后返回的大小一样大。如果 src 包含对其他加速结构的引用,则 dst 将引用相同的加速结构。

  • VK_COPY_ACCELERATION_STRUCTURE_MODE_SERIALIZE_KHR 将加速结构序列化为半透明格式,可以在兼容的实现上重新加载。

  • VK_COPY_ACCELERATION_STRUCTURE_MODE_DESERIALIZE_KHR 将缓冲区中的半透明序列化格式反序列化为加速结构。

要将加速结构复制到设备内存,请调用

// Provided by VK_KHR_acceleration_structure
void vkCmdCopyAccelerationStructureToMemoryKHR(
    VkCommandBuffer                             commandBuffer,
    const VkCopyAccelerationStructureToMemoryInfoKHR* pInfo);

pInfo->src 的访问 必须VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_COPY_BIT_KHR 管线阶段VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR 管线阶段,以及 VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_KHR访问类型 进行同步。对 pInfo->dst.deviceAddress 指示的缓冲区的访问 必须VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_COPY_BIT_KHR 管线阶段VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR 管线阶段,以及 VK_ACCESS_TRANSFER_WRITE_BIT 的访问类型进行同步。

此命令产生与 vkCopyAccelerationStructureToMemoryKHR 相同的结果,但将其结果写入设备地址,并在设备而不是主机上执行。输出 可能不一定逐位相同,但它可以同样被 vkCmdCopyMemoryToAccelerationStructureKHRvkCopyMemoryToAccelerationStructureKHR 使用。

序列化数据的定义头结构由以下组成:

  • VkPhysicalDeviceIDProperties::driverUUID 匹配的 VK_UUID_SIZE 字节的数据

  • VK_UUID_SIZE 字节的数据,用于标识使用 vkGetDeviceAccelerationStructureCompatibilityKHR 进行比较的兼容性

  • 一个 64 位整数,表示与使用 VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR 查询的值匹配的总大小

  • 一个 64 位整数,表示要传递给 VkAccelerationStructureCreateInfoKHR::size 的反序列化大小

  • 一个 64 位整数,表示后面加速结构句柄的数量。此值与使用 VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_BOTTOM_LEVEL_POINTERS_KHR 查询的值匹配。对于底层加速结构,此值将为零。对于顶层加速结构,此数字取决于实现;句柄的数量和顺序可能与用于构建加速结构的实例描述不匹配。

vkGetAccelerationStructureDeviceAddressKHRvkGetAccelerationStructureHandleNV 返回值对应的句柄,紧密排列在缓冲区中,并紧随计数之后。应用程序应存储这些句柄与原始应用程序生成的底层加速结构之间的映射,以便在反序列化时提供。序列化数据根据主机字节序写入缓冲区(或从缓冲区读取)。

有效使用
  • VUID-vkCmdCopyAccelerationStructureToMemoryKHR-accelerationStructure-08926
    必须启用 VkPhysicalDeviceAccelerationStructureFeaturesKHR::accelerationStructure 功能

  • VUID-vkCmdCopyAccelerationStructureToMemoryKHR-pInfo-03739
    pInfo->dst.deviceAddress 必须是绑定到设备内存的缓冲区的有效设备地址

  • VUID-vkCmdCopyAccelerationStructureToMemoryKHR-pInfo-03740
    pInfo->dst.deviceAddress 必须256 字节对齐

  • VUID-vkCmdCopyAccelerationStructureToMemoryKHR-pInfo-03741
    如果 pInfo->dst.deviceAddress 指向的缓冲区是非稀疏的,那么它必须完整且连续地绑定到单个 VkDeviceMemory 对象

  • VUID-vkCmdCopyAccelerationStructureToMemoryKHR-None-03559
    用于创建 pInfo->srcbuffer 必须绑定到设备内存

有效使用(隐式)
  • VUID-vkCmdCopyAccelerationStructureToMemoryKHR-commandBuffer-parameter
    commandBuffer **必须** 是一个有效的 VkCommandBuffer 句柄。

  • VUID-vkCmdCopyAccelerationStructureToMemoryKHR-pInfo-parameter
    pInfo 必须是指向有效 VkCopyAccelerationStructureToMemoryInfoKHR 结构的有效指针

  • VUID-vkCmdCopyAccelerationStructureToMemoryKHR-commandBuffer-recording
    commandBuffer **必须** 处于记录状态

  • VUID-vkCmdCopyAccelerationStructureToMemoryKHR-commandBuffer-cmdpool
    分配 commandBufferVkCommandPool **必须** 支持计算操作。

  • VUID-vkCmdCopyAccelerationStructureToMemoryKHR-renderpass
    此命令 **必须** 仅在渲染过程实例之外调用。

  • VUID-vkCmdCopyAccelerationStructureToMemoryKHR-videocoding
    此命令 **必须** 仅在视频编码范围之外调用。

主机同步
  • commandBuffer 的主机访问 **必须** 外部同步。

  • 对分配 commandBufferVkCommandPool 的主机访问 **必须** 外部同步。

命令属性
命令缓冲区级别 渲染过程范围 视频编码范围 支持的队列类型 命令类型

主要
次要

外部

外部

计算

操作

// Provided by VK_KHR_acceleration_structure
typedef struct VkCopyAccelerationStructureToMemoryInfoKHR {
    VkStructureType                       sType;
    const void*                           pNext;
    VkAccelerationStructureKHR            src;
    VkDeviceOrHostAddressKHR              dst;
    VkCopyAccelerationStructureModeKHR    mode;
} VkCopyAccelerationStructureToMemoryInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • src 是复制的源加速结构

  • dst 是设备或主机内存地址,作为复制的目标

  • mode 是一个 VkCopyAccelerationStructureModeKHR 值,指定复制期间要执行的附加操作。

有效使用
  • VUID-VkCopyAccelerationStructureToMemoryInfoKHR-src-04959
    源加速结构 src 必须在此命令执行之前构建。

  • VUID-VkCopyAccelerationStructureToMemoryInfoKHR-dst-03561
    dst 指向的内存必须至少与 src 的序列化大小一样大,如 vkWriteAccelerationStructuresPropertiesKHRvkCmdWriteAccelerationStructuresPropertiesKHR 报告的那样,查询类型为 VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR

  • VUID-VkCopyAccelerationStructureToMemoryInfoKHR-mode-03412
    mode 必须VK_COPY_ACCELERATION_STRUCTURE_MODE_SERIALIZE_KHR

有效使用(隐式)
  • VUID-VkCopyAccelerationStructureToMemoryInfoKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_COPY_ACCELERATION_STRUCTURE_TO_MEMORY_INFO_KHR

  • VUID-VkCopyAccelerationStructureToMemoryInfoKHR-pNext-pNext
    pNext必须NULL

  • VUID-VkCopyAccelerationStructureToMemoryInfoKHR-src-parameter
    src 必须是有效的 VkAccelerationStructureKHR 句柄

  • VUID-VkCopyAccelerationStructureToMemoryInfoKHR-mode-parameter
    mode 必须是有效的 VkCopyAccelerationStructureModeKHR 值。

要将设备内存复制到加速结构,请调用

// Provided by VK_KHR_acceleration_structure
void vkCmdCopyMemoryToAccelerationStructureKHR(
    VkCommandBuffer                             commandBuffer,
    const VkCopyMemoryToAccelerationStructureInfoKHR* pInfo);

pInfo->dst 的访问必须VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_COPY_BIT_KHR 管线阶段VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR 管线阶段 以及 VK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_KHR访问类型 同步。 对 pInfo->src.deviceAddress 指示的缓冲区的访问必须VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_COPY_BIT_KHR 管线阶段VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR 管线阶段 以及 VK_ACCESS_TRANSFER_READ_BIT 的访问类型同步。

此命令可以接受由 vkCmdCopyAccelerationStructureToMemoryKHRvkCopyAccelerationStructureToMemoryKHR 生成的加速结构。

反序列化的输入结构如 vkCmdCopyAccelerationStructureToMemoryKHR 中所述,其中任何加速结构句柄都填充了在反序列化之前创建的底层加速结构的新查询句柄。这些句柄在反序列化时不需要构建,但必须创建。

有效使用
  • VUID-vkCmdCopyMemoryToAccelerationStructureKHR-accelerationStructure-08927
    必须启用 VkPhysicalDeviceAccelerationStructureFeaturesKHR::accelerationStructure 功能

  • VUID-vkCmdCopyMemoryToAccelerationStructureKHR-pInfo-03742
    pInfo->src.deviceAddress 必须是绑定到设备内存的缓冲区的有效设备地址

  • VUID-vkCmdCopyMemoryToAccelerationStructureKHR-pInfo-03743
    pInfo->src.deviceAddress 必须256 字节对齐

  • VUID-vkCmdCopyMemoryToAccelerationStructureKHR-pInfo-03744
    如果 pInfo->src.deviceAddress 指向的缓冲区是非稀疏的,那么它必须完整且连续地绑定到单个 VkDeviceMemory 对象

  • VUID-vkCmdCopyMemoryToAccelerationStructureKHR-buffer-03745
    用于创建 pInfo->dstbuffer 必须绑定到设备内存

有效使用(隐式)
  • VUID-vkCmdCopyMemoryToAccelerationStructureKHR-commandBuffer-parameter
    commandBuffer **必须** 是一个有效的 VkCommandBuffer 句柄。

  • VUID-vkCmdCopyMemoryToAccelerationStructureKHR-pInfo-parameter
    pInfo 必须是指向有效 VkCopyMemoryToAccelerationStructureInfoKHR 结构的有效指针。

  • VUID-vkCmdCopyMemoryToAccelerationStructureKHR-commandBuffer-recording
    commandBuffer **必须** 处于记录状态

  • VUID-vkCmdCopyMemoryToAccelerationStructureKHR-commandBuffer-cmdpool
    分配 commandBufferVkCommandPool **必须** 支持计算操作。

  • VUID-vkCmdCopyMemoryToAccelerationStructureKHR-renderpass
    此命令 **必须** 仅在渲染过程实例之外调用。

  • VUID-vkCmdCopyMemoryToAccelerationStructureKHR-videocoding
    此命令 **必须** 仅在视频编码范围之外调用。

主机同步
  • commandBuffer 的主机访问 **必须** 外部同步。

  • 对分配 commandBufferVkCommandPool 的主机访问 **必须** 外部同步。

命令属性
命令缓冲区级别 渲染过程范围 视频编码范围 支持的队列类型 命令类型

主要
次要

外部

外部

计算

操作

VkCopyMemoryToAccelerationStructureInfoKHR 结构定义如下:

// Provided by VK_KHR_acceleration_structure
typedef struct VkCopyMemoryToAccelerationStructureInfoKHR {
    VkStructureType                       sType;
    const void*                           pNext;
    VkDeviceOrHostAddressConstKHR         src;
    VkAccelerationStructureKHR            dst;
    VkCopyAccelerationStructureModeKHR    mode;
} VkCopyMemoryToAccelerationStructureInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • src 是指向包含复制源数据的内存的设备或主机地址。

  • dst 是复制的目标加速结构。

  • mode 是一个 VkCopyAccelerationStructureModeKHR 值,指定复制期间要执行的附加操作。

有效使用
  • VUID-VkCopyMemoryToAccelerationStructureInfoKHR-src-04960
    src 指向的源内存必须包含先前使用 vkCmdCopyAccelerationStructureToMemoryKHR 序列化的数据,该数据可能经过修改以重新定位加速结构引用,如该命令所述。

  • VUID-VkCopyMemoryToAccelerationStructureInfoKHR-mode-03413
    mode 必须VK_COPY_ACCELERATION_STRUCTURE_MODE_DESERIALIZE_KHR

  • VUID-VkCopyMemoryToAccelerationStructureInfoKHR-pInfo-03414
    src 中的数据必须具有与目标物理设备兼容的格式,由 vkGetDeviceAccelerationStructureCompatibilityKHR 返回。

  • VUID-VkCopyMemoryToAccelerationStructureInfoKHR-dst-03746
    dst 的创建所用的 size 必须大于或等于用于序列化 src 中数据的大小。

有效使用(隐式)
  • VUID-VkCopyMemoryToAccelerationStructureInfoKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_COPY_MEMORY_TO_ACCELERATION_STRUCTURE_INFO_KHR

  • VUID-VkCopyMemoryToAccelerationStructureInfoKHR-pNext-pNext
    pNext必须NULL

  • VUID-VkCopyMemoryToAccelerationStructureInfoKHR-dst-parameter
    dst 必须是有效的 VkAccelerationStructureKHR 句柄

  • VUID-VkCopyMemoryToAccelerationStructureInfoKHR-mode-parameter
    mode 必须是有效的 VkCopyAccelerationStructureModeKHR 值。

要检查序列化的加速结构是否与当前设备兼容,请调用:

// Provided by VK_KHR_acceleration_structure
void vkGetDeviceAccelerationStructureCompatibilityKHR(
    VkDevice                                    device,
    const VkAccelerationStructureVersionInfoKHR* pVersionInfo,
    VkAccelerationStructureCompatibilityKHR*    pCompatibility);
有效使用
有效使用(隐式)
  • VUID-vkGetDeviceAccelerationStructureCompatibilityKHR-device-parameter
    device 必须是有效的 VkDevice 句柄。

  • VUID-vkGetDeviceAccelerationStructureCompatibilityKHR-pVersionInfo-parameter
    pVersionInfo 必须是指向有效的 VkAccelerationStructureVersionInfoKHR 结构的有效指针。

  • VUID-vkGetDeviceAccelerationStructureCompatibilityKHR-pCompatibility-parameter
    pCompatibility 必须是指向 VkAccelerationStructureCompatibilityKHR 值的有效指针。

VkAccelerationStructureVersionInfoKHR 结构定义如下:

// Provided by VK_KHR_acceleration_structure
typedef struct VkAccelerationStructureVersionInfoKHR {
    VkStructureType    sType;
    const void*        pNext;
    const uint8_t*     pVersionData;
} VkAccelerationStructureVersionInfoKHR;

pVersionData 是指向 2 × VK_UUID_SIZEuint8_t 值数组的指针,而不是两个 VK_UUID_SIZE 数组,因为此成员的预期用例是指向先前序列化的加速结构(通过 vkCmdCopyAccelerationStructureToMemoryKHRvkCopyAccelerationStructureToMemoryKHR)的头部,该结构已加载到内存中。 使用数组将需要额外复制 UUID 的内存。

有效使用(隐式)
  • VUID-VkAccelerationStructureVersionInfoKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_VERSION_INFO_KHR

  • VUID-VkAccelerationStructureVersionInfoKHR-pNext-pNext
    pNext必须NULL

  • VUID-VkAccelerationStructureVersionInfoKHR-pVersionData-parameter
    pVersionData 必须是指向 uint8_t 值的有效指针数组。

vkGetDeviceAccelerationStructureCompatibilityKHR 返回的 pCompatibility 可能的值为:

// Provided by VK_KHR_acceleration_structure
typedef enum VkAccelerationStructureCompatibilityKHR {
    VK_ACCELERATION_STRUCTURE_COMPATIBILITY_COMPATIBLE_KHR = 0,
    VK_ACCELERATION_STRUCTURE_COMPATIBILITY_INCOMPATIBLE_KHR = 1,
} VkAccelerationStructureCompatibilityKHR;
  • 如果 pVersionData 版本加速结构与 device 兼容,则为 VK_ACCELERATION_STRUCTURE_COMPATIBILITY_COMPATIBLE_KHR

  • 如果 pVersionData 版本加速结构与 device 不兼容,则为 VK_ACCELERATION_STRUCTURE_COMPATIBILITY_INCOMPATIBLE_KHR

主机加速结构操作

如果启用了 accelerationStructureHostCommands 功能,则实现还必须提供加速结构操作的主机实现。

这些命令在功能上与其设备对应项相同,只是它们是在主机时间线上执行,而不是排队到命令缓冲区中。

主机命令使用的所有加速结构必须绑定到主机可见内存,并且加速结构构建的所有输入数据必须使用主机地址而不是设备地址引用。应用程序在使用主机命令时不需要映射加速结构内存。

vkBuildAccelerationStructuresKHRvkCmdBuildAccelerationStructuresKHR 可能使用不同的算法,因此不要求生成相同的结构。这两个命令生成的结构可能表现出不同的内存占用或遍历性能,但应尽可能相似。

除了这些细节之外,主机和设备操作是可互换的。例如,应用程序可以使用 vkBuildAccelerationStructuresKHR 构建结构,使用 vkCmdCopyAccelerationStructureKHR 在设备上压缩它,并使用 vkCopyAccelerationStructureToMemoryKHR 序列化结果。

为了高效执行,使用这些命令操作的加速结构应始终绑定到主机缓存内存,因为实现可能需要在命令执行期间重复读取和写入此内存。

要在主机上构建加速结构,请调用

// Provided by VK_KHR_acceleration_structure
VkResult vkBuildAccelerationStructuresKHR(
    VkDevice                                    device,
    VkDeferredOperationKHR                      deferredOperation,
    uint32_t                                    infoCount,
    const VkAccelerationStructureBuildGeometryInfoKHR* pInfos,
    const VkAccelerationStructureBuildRangeInfoKHR* const* ppBuildRangeInfos);
  • device 是正在构建加速结构的 VkDevice

  • deferredOperation 是一个可选的 VkDeferredOperationKHR,用于请求延迟此命令。

  • infoCount 是要构建的加速结构的数目。它指定必须提供的 pInfos 结构和 ppBuildRangeInfos 指针的数量。

  • pInfos 是指向 infoCountVkAccelerationStructureBuildGeometryInfoKHR 结构数组的指针,这些结构定义了用于构建每个加速结构的几何图形。

  • ppBuildRangeInfos 是指向 infoCount 个指针数组的指针,这些指针数组指向 VkAccelerationStructureBuildRangeInfoKHR 结构。每个 ppBuildRangeInfos[i] 是指向 pInfos[i].geometryCountVkAccelerationStructureBuildRangeInfoKHR 结构数组的指针,这些结构定义了指向存储几何数据的地址的动态偏移,如 pInfos[i] 所定义。

此命令执行与 vkCmdBuildAccelerationStructuresKHR 相同的任务,但由主机执行。

vkBuildAccelerationStructuresKHR 命令提供了启动多个加速结构构建的能力,但是任何单独的加速结构构建之间都没有隐含的排序或同步。

这意味着应用程序不能在同一个 vkBuildAccelerationStructuresKHR 调用中构建顶层加速结构,同时构建相关的底层或实例加速结构。任何构建使用的任何加速结构内存或临时内存之间也不能有任何内存别名。

有效使用
  • VUID-vkBuildAccelerationStructuresKHR-mode-04628
    pInfos 的每个元素的 mode 成员必须是有效的 VkBuildAccelerationStructureModeKHR

  • VUID-vkBuildAccelerationStructuresKHR-srcAccelerationStructure-04629
    如果 pInfos 的任何元素的 srcAccelerationStructure 成员不是 VK_NULL_HANDLE,则 srcAccelerationStructure 成员必须是有效的 VkAccelerationStructureKHR 句柄

  • VUID-vkBuildAccelerationStructuresKHR-pInfos-04630
    对于 pInfos 的每个元素,如果其 mode 成员为 VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR,则其 srcAccelerationStructure 成员必须不是 VK_NULL_HANDLE

  • VUID-vkBuildAccelerationStructuresKHR-pInfos-03403
    pInfos 的任何元素的 srcAccelerationStructure 成员必须pInfos 的任何其他元素的 dstAccelerationStructure 成员不是同一个加速结构

  • VUID-vkBuildAccelerationStructuresKHR-dstAccelerationStructure-03698
    pInfos 的任何元素的 dstAccelerationStructure 成员必须pInfos 的任何其他元素的 dstAccelerationStructure 成员不是同一个加速结构

  • VUID-vkBuildAccelerationStructuresKHR-dstAccelerationStructure-03800
    pInfos 的任何元素的 dstAccelerationStructure 成员必须是有效的 VkAccelerationStructureKHR 句柄

  • VUID-vkBuildAccelerationStructuresKHR-pInfos-03699
    对于 pInfos 的每个元素,如果其 type 成员为 VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_KHR,则其 dstAccelerationStructure 成员必须已使用等于 VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_KHRVK_ACCELERATION_STRUCTURE_TYPE_GENERIC_KHRVkAccelerationStructureCreateInfoKHR::type 值创建

  • VUID-vkBuildAccelerationStructuresKHR-pInfos-03700
    对于 pInfos 的每个元素,如果其 type 成员为 VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_KHR,则其 dstAccelerationStructure 成员必须已使用等于 VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_KHRVK_ACCELERATION_STRUCTURE_TYPE_GENERIC_KHRVkAccelerationStructureCreateInfoKHR::type 值创建

  • VUID-vkBuildAccelerationStructuresKHR-pInfos-03663
    对于 pInfos 的每个元素,如果其 mode 成员为 VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR,则其 srcAccelerationStructure 成员中的非活动图元必须不能变为活动状态

  • VUID-vkBuildAccelerationStructuresKHR-pInfos-03664
    对于 pInfos 的每个元素,如果其 mode 成员为 VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR,则其 srcAccelerationStructure 成员中的活动图元必须不能变为非活动状态

  • VUID-vkBuildAccelerationStructuresKHR-None-03407
    pInfos 的任何元素的 dstAccelerationStructure 成员必须不由 pInfos 的任何其他元素的 pGeometriesppGeometries 中具有 geometryTypeVK_GEOMETRY_TYPE_INSTANCES_KHR 的元素的 geometry.instances.data 成员引用

  • VUID-vkBuildAccelerationStructuresKHR-dstAccelerationStructure-03701
    此命令访问的 pInfos 的任何元素的 dstAccelerationStructure 成员所支持的内存范围必须不与此命令访问的具有 mode 等于 VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHRpInfos 的任何其他元素的 srcAccelerationStructure 成员所支持的内存重叠

  • VUID-vkBuildAccelerationStructuresKHR-dstAccelerationStructure-03702
    此命令访问的 pInfos 的任何元素的 dstAccelerationStructure 成员所支持的内存范围必须不与此命令访问的 pInfos 的任何其他元素的 dstAccelerationStructure 成员所支持的内存重叠

  • VUID-vkBuildAccelerationStructuresKHR-dstAccelerationStructure-03703
    此命令访问的 pInfos 的任何元素的 dstAccelerationStructure 成员所支持的内存范围必须不与此命令访问的 pInfos 的任何元素的 scratchData 成员(包括同一元素)所支持的内存重叠

  • VUID-vkBuildAccelerationStructuresKHR-scratchData-03704
    此命令访问的 pInfos 中任何元素的 scratchData 成员所指向的内存范围,不得与此命令访问的 pInfos 中任何其他元素的 scratchData 成员所指向的内存范围重叠。

  • VUID-vkBuildAccelerationStructuresKHR-scratchData-03705
    此命令访问的 pInfos 中任何元素的 scratchData 成员所指向的内存范围,不得与此命令访问的,且 mode 等于 VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHRpInfos 中任何元素的 srcAccelerationStructure 成员(包括同一元素)所指向的内存范围重叠。

  • VUID-vkBuildAccelerationStructuresKHR-dstAccelerationStructure-03706
    此命令访问的 pInfos 中任何元素的 dstAccelerationStructure 成员所指向的内存范围,不得与此命令访问的,且 pInfos 中任何其他元素的 geometry.instances.data 成员或 ppGeometries 成员所引用的,并且 geometryTypeVK_GEOMETRY_TYPE_INSTANCES_KHR 的任何加速结构所指向的内存范围重叠。

  • VUID-vkBuildAccelerationStructuresKHR-pInfos-03667
    对于 pInfos 的每个元素,如果其 mode 成员为 VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR,则其 srcAccelerationStructure 成员必须先前已使用 VkAccelerationStructureBuildGeometryInfoKHR::flags 中的 VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_UPDATE_BIT_KHR 位进行构造。

  • VUID-vkBuildAccelerationStructuresKHR-pInfos-03668
    对于 pInfos 的每个元素,如果其 mode 成员为 VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR,则其 srcAccelerationStructuredstAccelerationStructure 成员必须是相同的 VkAccelerationStructureKHR,或不具有任何内存别名

  • VUID-vkBuildAccelerationStructuresKHR-pInfos-03758
    对于 pInfos 的每个元素,如果其 mode 成员为 VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR,则其 geometryCount 成员必须具有与上次构建 srcAccelerationStructure 时指定的值相同的值。

  • VUID-vkBuildAccelerationStructuresKHR-pInfos-03759
    对于 pInfos 的每个元素,如果其 mode 成员为 VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR,则其 flags 成员必须具有与上次构建 srcAccelerationStructure 时指定的值相同的值。

  • VUID-vkBuildAccelerationStructuresKHR-pInfos-03760
    对于 pInfos 的每个元素,如果其 mode 成员为 VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR,则其 type 成员必须具有与上次构建 srcAccelerationStructure 时指定的值相同的值。

  • VUID-vkBuildAccelerationStructuresKHR-pInfos-03761
    对于 pInfos 的每个元素,如果其 mode 成员为 VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR,那么对于其 pGeometriesppGeometries 成员引用的每个 VkAccelerationStructureGeometryKHR 结构,其 geometryType 成员必须具有与上次构建 srcAccelerationStructure 时指定的值相同的值。

  • VUID-vkBuildAccelerationStructuresKHR-pInfos-03762
    对于 pInfos 的每个元素,如果其 mode 成员为 VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR,那么对于其 pGeometriesppGeometries 成员引用的每个 VkAccelerationStructureGeometryKHR 结构,其 flags 成员必须具有与上次构建 srcAccelerationStructure 时指定的值相同的值。

  • VUID-vkBuildAccelerationStructuresKHR-pInfos-03763
    对于 pInfos 的每个元素,如果其 mode 成员为 VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR,那么对于其 pGeometriesppGeometries 成员引用的每个 VkAccelerationStructureGeometryKHR 结构,如果 geometryTypeVK_GEOMETRY_TYPE_TRIANGLES_KHR,则其 geometry.triangles.vertexFormat 成员必须具有与上次构建 srcAccelerationStructure 时指定的值相同的值。

  • VUID-vkBuildAccelerationStructuresKHR-pInfos-03764
    对于 pInfos 的每个元素,如果其 mode 成员为 VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR,那么对于其 pGeometriesppGeometries 成员引用的每个 VkAccelerationStructureGeometryKHR 结构,如果 geometryTypeVK_GEOMETRY_TYPE_TRIANGLES_KHR,则其 geometry.triangles.maxVertex 成员必须具有与上次构建 srcAccelerationStructure 时指定的值相同的值。

  • VUID-vkBuildAccelerationStructuresKHR-pInfos-03765
    对于 pInfos 的每个元素,如果其 mode 成员为 VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR,那么对于其 pGeometriesppGeometries 成员引用的每个 VkAccelerationStructureGeometryKHR 结构,如果 geometryTypeVK_GEOMETRY_TYPE_TRIANGLES_KHR,则其 geometry.triangles.indexType 成员必须具有与上次构建 srcAccelerationStructure 时指定的值相同的值。

  • VUID-vkBuildAccelerationStructuresKHR-pInfos-03766
    对于 pInfos 的每个元素,如果其 mode 成员为 VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR,那么对于其 pGeometriesppGeometries 成员引用的每个 VkAccelerationStructureGeometryKHR 结构,如果 geometryTypeVK_GEOMETRY_TYPE_TRIANGLES_KHR,如果上次构建 srcAccelerationStructure 时其 geometry.triangles.transformData 地址为 NULL,则它必须NULL

  • VUID-vkBuildAccelerationStructuresKHR-pInfos-03767
    对于 pInfos 中的每个元素,如果其 mode 成员为 VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR,则对于其 pGeometriesppGeometries 成员引用的每个 VkAccelerationStructureGeometryKHR 结构,如果 geometryTypeVK_GEOMETRY_TYPE_TRIANGLES_KHR,如果其 geometry.triangles.transformData 地址在上次构建 srcAccelerationStructure 时不为 NULL,则它必须不为 NULL

  • VUID-vkBuildAccelerationStructuresKHR-pInfos-03768
    对于 pInfos 中的每个元素,如果其 mode 成员为 VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR,则对于其 pGeometriesppGeometries 成员引用的每个 VkAccelerationStructureGeometryKHR 结构,如果 geometryTypeVK_GEOMETRY_TYPE_TRIANGLES_KHRgeometry.triangles.indexType 不为 VK_INDEX_TYPE_NONE_KHR,则每个被引用的索引的值必须与上次构建 srcAccelerationStructure 时对应的索引值相同。

  • VUID-vkBuildAccelerationStructuresKHR-primitiveCount-03769
    对于 pInfos 中的每个元素,如果其 mode 成员为 VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR,则对于其 pGeometriesppGeometries 成员引用的每个 VkAccelerationStructureGeometryKHR 结构,其对应的 VkAccelerationStructureBuildRangeInfoKHR 结构的 primitiveCount 成员必须具有与上次构建 srcAccelerationStructure 时指定的值相同的值。

  • VUID-vkBuildAccelerationStructuresKHR-pInfos-03801
    对于 pInfos[i].pGeometriespInfos[i].ppGeometriesgeometryTypeVK_GEOMETRY_TYPE_INSTANCES_KHR 的每个元素,对应的 ppBuildRangeInfos[i][j].primitiveCount 必须小于或等于 VkPhysicalDeviceAccelerationStructurePropertiesKHR::maxInstanceCount

  • VUID-vkBuildAccelerationStructuresKHR-pInfos-10126
    对于每个 pInfos[i],dstAccelerationStructure **必须**已使用 VkAccelerationStructureCreateInfoKHR::size 值创建,该值大于或等于以下两者之一:

    • 构建操作所需的内存大小,如 vkGetAccelerationStructureBuildSizesKHR 返回,其中 pBuildInfo = pInfos[i] 并且 pMaxPrimitiveCounts 数组的每个元素大于或等于 ppBuildRangeInfos[i][j].primitiveCount 的等效值,其中 j[0,pInfos[i].geometryCount) 中;或者,

    • 如果更新压缩的加速结构,则查询相应的 VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR 的结果。

  • VUID-vkBuildAccelerationStructuresKHR-ppBuildRangeInfos-03676
    ppBuildRangeInfos[i] 的每个元素**必须**是指向 pInfos[i].geometryCountVkAccelerationStructureBuildRangeInfoKHR 结构数组的有效指针。

  • VUID-vkBuildAccelerationStructuresKHR-deferredOperation-03678
    deferredOperation 关联的任何先前的延迟操作必须已完成

  • VUID-vkBuildAccelerationStructuresKHR-pInfos-03722
    对于 pInfos 的每个元素,用于创建其 dstAccelerationStructure 成员的 buffer 必须绑定到主机可见的设备内存

  • VUID-vkBuildAccelerationStructuresKHR-pInfos-03723
    对于 pInfos 的每个元素,如果其 mode 成员为 VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR,则用于创建其 srcAccelerationStructure 成员的 buffer **必须**绑定到主机可见的设备内存。

  • VUID-vkBuildAccelerationStructuresKHR-pInfos-03724
    对于 pInfos 的每个元素,用于创建 pGeometriesppGeometries 的任何元素的 geometry.instances.data 成员引用的每个加速结构的 buffer,且该元素的 geometryTypeVK_GEOMETRY_TYPE_INSTANCES_KHR,**必须**绑定到主机可见的设备内存。

  • VUID-vkBuildAccelerationStructuresKHR-pInfos-03725
    如果 pInfos[i].modeVK_BUILD_ACCELERATION_STRUCTURE_MODE_BUILD_KHR,则 pInfos[i].scratchData.hostAddresspInfos[i].scratchData.hostAddress + N - 1 之间的所有地址**必须**是有效的主机内存,其中 N 由调用 vkGetAccelerationStructureBuildSizesKHR 返回的 VkAccelerationStructureBuildSizesInfoKHR 结构的 buildScratchSize 成员给出,该调用使用相同的 VkAccelerationStructureBuildGeometryInfoKHR 结构和图元计数。

  • VUID-vkBuildAccelerationStructuresKHR-pInfos-03726
    如果 pInfos[i].modeVK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR,则 pInfos[i].scratchData.hostAddresspInfos[i].scratchData.hostAddress + N - 1 之间的所有地址**必须**是有效的主机内存,其中 N 由调用 vkGetAccelerationStructureBuildSizesKHR 返回的 VkAccelerationStructureBuildSizesInfoKHR 结构的 updateScratchSize 成员给出,该调用使用相同的 VkAccelerationStructureBuildGeometryInfoKHR 结构和图元计数。

  • VUID-vkBuildAccelerationStructuresKHR-pInfos-03771
    对于 pInfos[i].pGeometriespInfos[i].ppGeometries 的任何元素,如果其 geometryTypeVK_GEOMETRY_TYPE_TRIANGLES_KHR,则 geometry.triangles.vertexData.hostAddress **必须**是有效的主机地址。

  • VUID-vkBuildAccelerationStructuresKHR-pInfos-03772
    对于 pInfos[i].pGeometriespInfos[i].ppGeometries 的任何元素,如果其 geometryTypeVK_GEOMETRY_TYPE_TRIANGLES_KHR,且 geometry.triangles.indexType 不是 VK_INDEX_TYPE_NONE_KHR,则 geometry.triangles.indexData.hostAddress **必须**是有效的主机地址。

  • VUID-vkBuildAccelerationStructuresKHR-pInfos-03773
    对于 pInfos[i].pGeometriespInfos[i].ppGeometries 的任何元素,如果其 geometryTypeVK_GEOMETRY_TYPE_TRIANGLES_KHR,且 geometry.triangles.transformData.hostAddress 不为 0,则它**必须**是有效的主机地址。

  • VUID-vkBuildAccelerationStructuresKHR-pInfos-03774
    对于 pInfos[i].pGeometriespInfos[i].ppGeometries 的任何元素,如果其 geometryTypeVK_GEOMETRY_TYPE_AABBS_KHR,则 geometry.aabbs.data.hostAddress **必须**是有效的主机地址。

  • VUID-vkBuildAccelerationStructuresKHR-pInfos-03775
    对于 pInfos 的每个元素,用于创建其 dstAccelerationStructure 成员的 buffer **必须**绑定到未使用多个实例分配的内存。

  • VUID-vkBuildAccelerationStructuresKHR-pInfos-03776
    对于 pInfos 的每个元素,如果其 mode 成员为 VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR,则用于创建其 srcAccelerationStructure 成员的 buffer **必须**绑定到未使用多个实例分配的内存。

  • VUID-vkBuildAccelerationStructuresKHR-pInfos-03777
    对于 pInfos 的每个元素,用于创建 pGeometriesppGeometries 的任何元素的 geometry.instances.data 成员引用的每个加速结构的 buffer,且该元素的 geometryTypeVK_GEOMETRY_TYPE_INSTANCES_KHR,**必须**绑定到未使用多个实例分配的内存。

  • VUID-vkBuildAccelerationStructuresKHR-pInfos-03778
    对于 pInfos[i].pGeometriespInfos[i].ppGeometries 的任何元素,如果其 geometryTypeVK_GEOMETRY_TYPE_INSTANCES_KHR,则 geometry.instances.data.hostAddress **必须**是有效的主机地址。

  • VUID-vkBuildAccelerationStructuresKHR-pInfos-03779
    对于 pInfos[i].pGeometriespInfos[i].ppGeometries 的任何元素,如果其 geometryTypeVK_GEOMETRY_TYPE_INSTANCES_KHR,则 geometry.instances.data.hostAddress 中的每个 VkAccelerationStructureInstanceKHR::accelerationStructureReference 值**必须**是有效的 VkAccelerationStructureKHR 对象。

  • VUID-vkBuildAccelerationStructuresKHR-pInfos-04930
    对于 pInfos[i].pGeometriespInfos[i].ppGeometries 的任何元素,如果其 geometryTypeVK_GEOMETRY_TYPE_INSTANCES_KHR 且设置了 VK_BUILD_ACCELERATION_STRUCTURE_MOTION_BIT_NV,则 VkAccelerationStructureMotionInstanceNVgeometry.instances.data.hostAddress 的任何结构的每个 accelerationStructureReference **必须**是有效的 VkAccelerationStructureKHR 对象。

有效使用(隐式)
  • VUID-vkBuildAccelerationStructuresKHR-device-parameter
    device 必须是有效的 VkDevice 句柄。

  • VUID-vkBuildAccelerationStructuresKHR-deferredOperation-parameter
    如果 deferredOperation 不是 VK_NULL_HANDLE,则 deferredOperation **必须**是有效的 VkDeferredOperationKHR 句柄。

  • VUID-vkBuildAccelerationStructuresKHR-pInfos-parameter
    pInfos **必须**是指向 infoCount 个有效的 VkAccelerationStructureBuildGeometryInfoKHR 结构数组的有效指针。

  • VUID-vkBuildAccelerationStructuresKHR-ppBuildRangeInfos-parameter
    ppBuildRangeInfos **必须**是指向 infoCountVkAccelerationStructureBuildRangeInfoKHR 结构数组的有效指针。

  • VUID-vkBuildAccelerationStructuresKHR-infoCount-arraylength
    infoCount **必须**大于 0

  • VUID-vkBuildAccelerationStructuresKHR-deferredOperation-parent
    如果 deferredOperation 是有效句柄,则它**必须**已从 device 创建、分配或检索。

返回码
成功
  • VK_SUCCESS

  • VK_OPERATION_DEFERRED_KHR

  • VK_OPERATION_NOT_DEFERRED_KHR

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_OUT_OF_DEVICE_MEMORY

要在主机上复制或压缩加速结构,请调用

// Provided by VK_KHR_acceleration_structure
VkResult vkCopyAccelerationStructureKHR(
    VkDevice                                    device,
    VkDeferredOperationKHR                      deferredOperation,
    const VkCopyAccelerationStructureInfoKHR*   pInfo);

此命令执行与 vkCmdCopyAccelerationStructureKHR 相同的任务,但由主机执行。

有效使用
  • VUID-vkCopyAccelerationStructureKHR-deferredOperation-03678
    deferredOperation 关联的任何先前的延迟操作必须已完成

  • VUID-vkCopyAccelerationStructureKHR-buffer-03727
    用于创建 pInfo->srcbuffer 必须绑定到主机可见的设备内存。

  • VUID-vkCopyAccelerationStructureKHR-buffer-03728
    用于创建 pInfo->dstbuffer 必须绑定到主机可见的设备内存。

  • VUID-vkCopyAccelerationStructureKHR-buffer-03780
    用于创建 pInfo->srcbuffer 必须绑定到未使用多个实例分配的内存。

  • VUID-vkCopyAccelerationStructureKHR-buffer-03781
    用于创建 pInfo->dstbuffer 必须绑定到未使用多个实例分配的内存。

有效使用(隐式)
  • VUID-vkCopyAccelerationStructureKHR-device-parameter
    device 必须是有效的 VkDevice 句柄。

  • VUID-vkCopyAccelerationStructureKHR-deferredOperation-parameter
    如果 deferredOperation 不是 VK_NULL_HANDLE,则 deferredOperation **必须**是有效的 VkDeferredOperationKHR 句柄。

  • VUID-vkCopyAccelerationStructureKHR-pInfo-parameter
    pInfo 必须是指向有效 VkCopyAccelerationStructureInfoKHR 结构的有效指针

  • VUID-vkCopyAccelerationStructureKHR-deferredOperation-parent
    如果 deferredOperation 是有效句柄,则它**必须**已从 device 创建、分配或检索。

返回码
成功
  • VK_SUCCESS

  • VK_OPERATION_DEFERRED_KHR

  • VK_OPERATION_NOT_DEFERRED_KHR

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_OUT_OF_DEVICE_MEMORY

要将主机可访问内存复制到加速结构,请调用

// Provided by VK_KHR_acceleration_structure
VkResult vkCopyMemoryToAccelerationStructureKHR(
    VkDevice                                    device,
    VkDeferredOperationKHR                      deferredOperation,
    const VkCopyMemoryToAccelerationStructureInfoKHR* pInfo);

此命令执行与 vkCmdCopyMemoryToAccelerationStructureKHR 相同的任务,但由主机执行。

此命令可以接受由 vkCmdCopyAccelerationStructureToMemoryKHRvkCopyAccelerationStructureToMemoryKHR 生成的加速结构。

有效使用
  • VUID-vkCopyMemoryToAccelerationStructureKHR-deferredOperation-03678
    deferredOperation 关联的任何先前的延迟操作必须已完成

  • VUID-vkCopyMemoryToAccelerationStructureKHR-pInfo-03729
    pInfo->src.hostAddress 必须是一个有效的主机指针。

  • VUID-vkCopyMemoryToAccelerationStructureKHR-pInfo-03750
    pInfo->src.hostAddress 必须对齐到 16 字节。

  • VUID-vkCopyMemoryToAccelerationStructureKHR-buffer-03730
    用于创建 pInfo->dstbuffer 必须绑定到主机可见的设备内存。

  • VUID-vkCopyMemoryToAccelerationStructureKHR-buffer-03782
    用于创建 pInfo->dstbuffer 必须绑定到未使用多个实例分配的内存。

有效使用(隐式)
  • VUID-vkCopyMemoryToAccelerationStructureKHR-device-parameter
    device 必须是有效的 VkDevice 句柄。

  • VUID-vkCopyMemoryToAccelerationStructureKHR-deferredOperation-parameter
    如果 deferredOperation 不是 VK_NULL_HANDLE,则 deferredOperation **必须**是有效的 VkDeferredOperationKHR 句柄。

  • VUID-vkCopyMemoryToAccelerationStructureKHR-pInfo-parameter
    pInfo 必须是指向有效 VkCopyMemoryToAccelerationStructureInfoKHR 结构的有效指针。

  • VUID-vkCopyMemoryToAccelerationStructureKHR-deferredOperation-parent
    如果 deferredOperation 是有效句柄,则它**必须**已从 device 创建、分配或检索。

返回码
成功
  • VK_SUCCESS

  • VK_OPERATION_DEFERRED_KHR

  • VK_OPERATION_NOT_DEFERRED_KHR

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_OUT_OF_DEVICE_MEMORY

要将加速结构复制到主机可访问内存,请调用

// Provided by VK_KHR_acceleration_structure
VkResult vkCopyAccelerationStructureToMemoryKHR(
    VkDevice                                    device,
    VkDeferredOperationKHR                      deferredOperation,
    const VkCopyAccelerationStructureToMemoryInfoKHR* pInfo);

此命令执行与 vkCmdCopyAccelerationStructureToMemoryKHR 相同的任务,但由主机执行。

此命令产生与 vkCmdCopyAccelerationStructureToMemoryKHR 相同的结果,但将其结果直接写入主机指针,并在主机而不是设备上执行。输出可能不一定完全逐位相同,但它可以被 vkCmdCopyMemoryToAccelerationStructureKHRvkCopyMemoryToAccelerationStructureKHR 同等使用。

有效使用
  • VUID-vkCopyAccelerationStructureToMemoryKHR-deferredOperation-03678
    deferredOperation 关联的任何先前的延迟操作必须已完成

  • VUID-vkCopyAccelerationStructureToMemoryKHR-buffer-03731
    用于创建 pInfo->srcbuffer 必须绑定到主机可见的设备内存。

  • VUID-vkCopyAccelerationStructureToMemoryKHR-pInfo-03732
    pInfo->dst.hostAddress 必须是一个有效的主机指针。

  • VUID-vkCopyAccelerationStructureToMemoryKHR-pInfo-03751
    pInfo->dst.hostAddress 必须对齐到 16 字节。

  • VUID-vkCopyAccelerationStructureToMemoryKHR-buffer-03783
    用于创建 pInfo->srcbuffer 必须绑定到未使用多个实例分配的内存。

有效使用(隐式)
  • VUID-vkCopyAccelerationStructureToMemoryKHR-device-parameter
    device 必须是有效的 VkDevice 句柄。

  • VUID-vkCopyAccelerationStructureToMemoryKHR-deferredOperation-parameter
    如果 deferredOperation 不是 VK_NULL_HANDLE,则 deferredOperation **必须**是有效的 VkDeferredOperationKHR 句柄。

  • VUID-vkCopyAccelerationStructureToMemoryKHR-pInfo-parameter
    pInfo 必须是指向有效 VkCopyAccelerationStructureToMemoryInfoKHR 结构的有效指针

  • VUID-vkCopyAccelerationStructureToMemoryKHR-deferredOperation-parent
    如果 deferredOperation 是有效句柄,则它**必须**已从 device 创建、分配或检索。

返回码
成功
  • VK_SUCCESS

  • VK_OPERATION_DEFERRED_KHR

  • VK_OPERATION_NOT_DEFERRED_KHR

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_OUT_OF_DEVICE_MEMORY

要在主机上查询加速结构大小参数,请调用

// Provided by VK_KHR_acceleration_structure
VkResult vkWriteAccelerationStructuresPropertiesKHR(
    VkDevice                                    device,
    uint32_t                                    accelerationStructureCount,
    const VkAccelerationStructureKHR*           pAccelerationStructures,
    VkQueryType                                 queryType,
    size_t                                      dataSize,
    void*                                       pData,
    size_t                                      stride);
  • device 是拥有 pAccelerationStructures 中加速结构的设备。

  • accelerationStructureCount 是要查询属性的加速结构的计数。

  • pAccelerationStructures 是指向先前构建的现有加速结构数组的指针。

  • queryType 是一个 VkQueryType 值,指定要查询的属性。

  • dataSizepData 指向的缓冲区的大小(以字节为单位)。

  • pData 是一个指向应用程序分配的缓冲区的指针,结果将写入其中。

  • stridepData 中各个查询结果之间的步幅(以字节为单位)。

此命令执行与 vkCmdWriteAccelerationStructuresPropertiesKHR 相同的任务,但由主机执行。

有效使用
  • VUID-vkWriteAccelerationStructuresPropertiesKHR-pAccelerationStructures-04964
    pAccelerationStructures 中的所有加速结构必须在此命令执行之前构建完成。

  • VUID-vkWriteAccelerationStructuresPropertiesKHR-accelerationStructures-03431
    如果 queryTypeVK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR,则 pAccelerationStructures 中的所有加速结构必须使用 VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_COMPACTION_BIT_KHR 构建。

  • VUID-vkWriteAccelerationStructuresPropertiesKHR-queryType-06742
    queryType必须VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SIZE_KHRVK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_BOTTOM_LEVEL_POINTERS_KHRVK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHRVK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR

  • VUID-vkWriteAccelerationStructuresPropertiesKHR-queryType-03448
    如果 queryTypeVK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR,则 stride **必须**是 VkDeviceSize 大小的倍数。

  • VUID-vkWriteAccelerationStructuresPropertiesKHR-queryType-03449
    如果 queryTypeVK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR,则 pData **必须**指向一个 VkDeviceSize

  • VUID-vkWriteAccelerationStructuresPropertiesKHR-queryType-03450
    如果 queryTypeVK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR,则 stride **必须**是 VkDeviceSize 大小的倍数。

  • VUID-vkWriteAccelerationStructuresPropertiesKHR-queryType-03451
    如果 queryTypeVK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR,则 pData **必须**指向一个 VkDeviceSize

  • VUID-vkWriteAccelerationStructuresPropertiesKHR-queryType-06731
    如果 queryTypeVK_QUERY_TYPE_ACCELERATION_STRUCTURE_SIZE_KHR,则 stride **必须**是 VkDeviceSize 大小的倍数。

  • VUID-vkWriteAccelerationStructuresPropertiesKHR-queryType-06732
    如果 queryTypeVK_QUERY_TYPE_ACCELERATION_STRUCTURE_SIZE_KHR,则 pData **必须**指向一个 VkDeviceSize

  • VUID-vkWriteAccelerationStructuresPropertiesKHR-queryType-06733
    如果 queryTypeVK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_BOTTOM_LEVEL_POINTERS_KHR,则 stride **必须**是 VkDeviceSize 大小的倍数。

  • VUID-vkWriteAccelerationStructuresPropertiesKHR-queryType-06734
    如果 queryTypeVK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_BOTTOM_LEVEL_POINTERS_KHR,则 pData **必须**指向一个 VkDeviceSize

  • VUID-vkWriteAccelerationStructuresPropertiesKHR-dataSize-03452
    dataSize **必须**大于或等于 accelerationStructureCount*stride

  • VUID-vkWriteAccelerationStructuresPropertiesKHR-buffer-03733
    用于创建 pAccelerationStructures 中每个加速结构的 buffer **必须**绑定到主机可见的设备内存。

  • VUID-vkWriteAccelerationStructuresPropertiesKHR-buffer-03784
    用于创建 pAccelerationStructures 中每个加速结构的 buffer **必须**绑定到未使用多个实例分配的内存。

有效使用(隐式)
  • VUID-vkWriteAccelerationStructuresPropertiesKHR-device-parameter
    device 必须是有效的 VkDevice 句柄。

  • VUID-vkWriteAccelerationStructuresPropertiesKHR-pAccelerationStructures-parameter
    pAccelerationStructures 必须是指向 accelerationStructureCount 个有效的 VkAccelerationStructureKHR 句柄数组的有效指针。

  • VUID-vkWriteAccelerationStructuresPropertiesKHR-queryType-parameter
    queryType必须是有效的 VkQueryType 值。

  • VUID-vkWriteAccelerationStructuresPropertiesKHR-pData-parameter
    pData **必须**是指向 dataSize 字节数组的有效指针。

  • VUID-vkWriteAccelerationStructuresPropertiesKHR-accelerationStructureCount-arraylength
    accelerationStructureCount必须大于 0

  • VUID-vkWriteAccelerationStructuresPropertiesKHR-dataSize-arraylength
    dataSize **必须**大于 0

  • VUID-vkWriteAccelerationStructuresPropertiesKHR-pAccelerationStructures-parent
    pAccelerationStructures 的每个元素**必须**已创建、分配或从 device 中检索。

返回码
成功
  • VK_SUCCESS

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_OUT_OF_DEVICE_MEMORY