执行图

执行图 提供了一种让应用程序从主机上的单个初始命令动态分派多个操作的方法。为了实现这一点,提供了一个新的执行图管线,它将多个着色器或管线链接在一起,每个着色器或管线都描述了可以在执行图中分派的一个或多个操作。每个链接的管线或着色器都描述了图中的一个执行节点,该节点可以从同一图中的另一个着色器动态分派。这允许应用程序以比通常仅使用 API 命令可能实现的更精细的粒度来描述更丰富的执行拓扑。

管线创建

要创建执行图管线,请调用

// Provided by VK_AMDX_shader_enqueue
VkResult vkCreateExecutionGraphPipelinesAMDX(
    VkDevice                                    device,
    VkPipelineCache                             pipelineCache,
    uint32_t                                    createInfoCount,
    const VkExecutionGraphPipelineCreateInfoAMDX* pCreateInfos,
    const VkAllocationCallbacks*                pAllocator,
    VkPipeline*                                 pPipelines);
  • device 是创建执行图管线的逻辑设备。

  • pipelineCache 要么是 VK_NULL_HANDLE,表示禁用管线缓存;要么是有效的 管线缓存 对象的句柄,在这种情况下,在该命令的持续时间内启用该缓存的使用。

  • createInfoCountpCreateInfospPipelines 数组的长度。

  • pCreateInfos 是指向 VkExecutionGraphPipelineCreateInfoAMDX 结构数组的指针。

  • pAllocator 控制主机内存分配,如内存分配章节中所述。

  • pPipelines 是指向 VkPipeline 句柄数组的指针,其中返回生成的执行图管线对象。

管线的创建和返回方式与 多管线创建 所述相同。

有效用法
  • VUID-vkCreateExecutionGraphPipelinesAMDX-shaderEnqueue-09124
    必须启用 shaderEnqueue 特性

  • VUID-vkCreateExecutionGraphPipelinesAMDX-flags-09125
    如果 pCreateInfos 的任何元素的 flags 成员包含 VK_PIPELINE_CREATE_DERIVATIVE_BIT 标志,并且该元素的 basePipelineIndex 成员不是 -1,则 basePipelineIndex 必须小于 pCreateInfos 中与该元素对应的索引

  • VUID-vkCreateExecutionGraphPipelinesAMDX-flags-09126
    如果 pCreateInfos 的任何元素的 flags 成员包含 VK_PIPELINE_CREATE_DERIVATIVE_BIT 标志,则基本管线必须已使用 VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT 标志创建

  • VUID-vkCreateExecutionGraphPipelinesAMDX-pipelineCache-09127
    如果 pipelineCache 是使用 VK_PIPELINE_CACHE_CREATE_EXTERNALLY_SYNCHRONIZED_BIT 创建的,则对 pipelineCache 的主机访问必须进行外部同步

  • VUID-vkCreateExecutionGraphPipelinesAMDX-pNext-09616
    如果 VkPipelineBinaryInfoKHR::binaryCount 对于 pCreateInfos 的任何元素都不是 0,则 pipelineCache 必须VK_NULL_HANDLE

  • VUID-vkCreateExecutionGraphPipelinesAMDX-pNext-09617
    如果在 pCreateInfos 的任何元素的 pNext 链中包含设置了 VK_PIPELINE_CREATE_2_CAPTURE_DATA_BIT_KHR 标志的 VkPipelineCreateFlags2CreateInfoKHR 结构,则 pipelineCache 必须VK_NULL_HANDLE

  • VUID-vkCreateExecutionGraphPipelinesAMDX-binaryCount-09620
    如果 VkPipelineBinaryInfoKHR::binaryCount 对于 pCreateInfos 的任何元素都不是 0,则该元素的 flags不能设置 VK_PIPELINE_CREATION_FEEDBACK_APPLICATION_PIPELINE_CACHE_HIT_BIT

  • VUID-vkCreateExecutionGraphPipelinesAMDX-binaryCount-09621
    如果 VkPipelineBinaryInfoKHR::binaryCount 对于 pCreateInfos 的任何元素不为 0,则该元素的 flags必须未设置 VK_PIPELINE_CREATION_FEEDBACK_BASE_PIPELINE_ACCELERATION_BIT

  • VUID-vkCreateExecutionGraphPipelinesAMDX-binaryCount-09622
    如果 VkPipelineBinaryInfoKHR::binaryCount 对于 pCreateInfos 的任何元素不为 0,则该元素的 flags必须未设置 VK_PIPELINE_CREATE_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT_EXT

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

  • VUID-vkCreateExecutionGraphPipelinesAMDX-pipelineCache-parameter
    如果 pipelineCache 不是 VK_NULL_HANDLE,则 pipelineCache 必须是有效的 VkPipelineCache 句柄。

  • VUID-vkCreateExecutionGraphPipelinesAMDX-pCreateInfos-parameter
    pCreateInfos 必须是指向 createInfoCount 个有效 VkExecutionGraphPipelineCreateInfoAMDX 结构的数组的有效指针。

  • VUID-vkCreateExecutionGraphPipelinesAMDX-pAllocator-parameter
    如果 pAllocator 不是 NULL,则 pAllocator 必须是指向有效的 VkAllocationCallbacks 结构的有效指针。

  • VUID-vkCreateExecutionGraphPipelinesAMDX-pPipelines-parameter
    pPipelines 必须是指向 createInfoCountVkPipeline 句柄的数组的有效指针。

  • VUID-vkCreateExecutionGraphPipelinesAMDX-createInfoCount-arraylength
    createInfoCount 必须大于 0

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

返回值
成功
  • VK_SUCCESS

  • VK_PIPELINE_COMPILE_REQUIRED_EXT

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_OUT_OF_DEVICE_MEMORY

VkExecutionGraphPipelineCreateInfoAMDX 结构定义为:

// Provided by VK_AMDX_shader_enqueue
typedef struct VkExecutionGraphPipelineCreateInfoAMDX {
    VkStructureType                           sType;
    const void*                               pNext;
    VkPipelineCreateFlags                     flags;
    uint32_t                                  stageCount;
    const VkPipelineShaderStageCreateInfo*    pStages;
    const VkPipelineLibraryCreateInfoKHR*     pLibraryInfo;
    VkPipelineLayout                          layout;
    VkPipeline                                basePipelineHandle;
    int32_t                                   basePipelineIndex;
} VkExecutionGraphPipelineCreateInfoAMDX;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • flags 是一个 VkPipelineCreateFlagBits 的位掩码,指定如何生成管线。

  • stageCountpStages 数组中的条目数。

  • pStages 是指向 stageCountVkPipelineShaderStageCreateInfo 结构的数组的指针,描述了要包含在执行图管线中的着色器阶段集合。

  • pLibraryInfo 是指向 VkPipelineLibraryCreateInfoKHR 结构的指针,该结构定义要包含的管线库。

  • layout 是管线以及与管线一起使用的描述符集所使用的绑定位置的描述。

  • basePipelineHandle 是要从中派生的管线。

  • basePipelineIndex 是一个索引,指向要用作从中派生的管线的 pCreateInfos 参数。

参数 basePipelineHandlebasePipelineIndex管线派生 中有更详细的描述。

创建执行图管线时提供的每个着色器阶段(包括库中的着色器阶段)都与一个名称和一个索引相关联,该名称和索引由其 pNext 链中是否包含 VkPipelineShaderStageNodeCreateInfoAMDX 结构来决定。对于任何图形管线库,只有顶点或网格着色器阶段的名称和索引直接链接到图中作为节点 - 管线中的其他着色器阶段将在这些着色器阶段之后正常执行。任务着色器不能包含在用于绘制节点的图形管线中。

除了着色器名称和索引之外,还会为每个节点生成一个内部“节点索引”,可以使用 vkGetExecutionGraphPipelineNodeIndexAMDX 查询该索引,并且该索引专门用于执行图的初始调度。

有效用法
  • VUID-VkExecutionGraphPipelineCreateInfoAMDX-None-09497
    如果 pNext 链不包含 VkPipelineCreateFlags2CreateInfo 结构,则 flags 必须VkPipelineCreateFlagBits 值的有效组合。

  • VUID-VkExecutionGraphPipelineCreateInfoAMDX-flags-07984
    如果 flags 包含 VK_PIPELINE_CREATE_DERIVATIVE_BIT 标志,并且 basePipelineIndex 为 -1,则 basePipelineHandle 必须是有效的执行图 VkPipeline 句柄。

  • VUID-VkExecutionGraphPipelineCreateInfoAMDX-flags-07985
    如果 flags 包含 VK_PIPELINE_CREATE_DERIVATIVE_BIT 标志,并且 basePipelineHandleVK_NULL_HANDLE,则 basePipelineIndex 必须是调用命令的 pCreateInfos 参数中的有效索引。

  • VUID-VkExecutionGraphPipelineCreateInfoAMDX-flags-07986
    如果 flags 包含 VK_PIPELINE_CREATE_DERIVATIVE_BIT 标志,则 basePipelineIndex 必须为 -1 或 basePipelineHandle 必须VK_NULL_HANDLE

  • VUID-VkExecutionGraphPipelineCreateInfoAMDX-layout-07987
    如果着色器中声明了推送常量块,则 layout 中的推送常量范围必须与着色器阶段匹配。

  • VUID-VkExecutionGraphPipelineCreateInfoAMDX-layout-10069
    如果着色器中声明了推送常量块,则该块必须包含在 layout 中与该阶段匹配的推送常量范围之内。

  • VUID-VkExecutionGraphPipelineCreateInfoAMDX-layout-07988
    如果着色器中声明了资源变量,则 layout 中对应的描述符集必须与着色器阶段匹配

  • VUID-VkExecutionGraphPipelineCreateInfoAMDX-layout-07990
    如果着色器中声明了资源变量,且描述符类型不是 VK_DESCRIPTOR_TYPE_MUTABLE_EXT,则 layout 中对应的描述符集必须与描述符类型匹配

  • VUID-VkExecutionGraphPipelineCreateInfoAMDX-layout-07991
    如果着色器中声明了资源变量为数组,则 layout 中对应的描述符集必须与描述符计数匹配

  • VUID-VkExecutionGraphPipelineCreateInfoAMDX-None-10391
    如果着色器中声明资源变量为描述符数组,则该变量的描述符类型不得VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK

  • VUID-VkExecutionGraphPipelineCreateInfoAMDX-flags-03365
    flags 必须不包含 VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_ANY_HIT_SHADERS_BIT_KHR

  • VUID-VkExecutionGraphPipelineCreateInfoAMDX-flags-03366
    flags 必须不包含 VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_BIT_KHR

  • VUID-VkExecutionGraphPipelineCreateInfoAMDX-flags-03367
    flags 必须不包含 VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_MISS_SHADERS_BIT_KHR

  • VUID-VkExecutionGraphPipelineCreateInfoAMDX-flags-03368
    flags 必须不包含 VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_INTERSECTION_SHADERS_BIT_KHR

  • VUID-VkExecutionGraphPipelineCreateInfoAMDX-flags-03369
    flags 必须不包含 VK_PIPELINE_CREATE_RAY_TRACING_SKIP_TRIANGLES_BIT_KHR

  • VUID-VkExecutionGraphPipelineCreateInfoAMDX-flags-03370
    flags 必须不包含 VK_PIPELINE_CREATE_RAY_TRACING_SKIP_AABBS_BIT_KHR

  • VUID-VkExecutionGraphPipelineCreateInfoAMDX-flags-03576
    flags 必须不包含 VK_PIPELINE_CREATE_RAY_TRACING_SHADER_GROUP_HANDLE_CAPTURE_REPLAY_BIT_KHR

  • VUID-VkExecutionGraphPipelineCreateInfoAMDX-flags-04945
    flags 必须不包含 VK_PIPELINE_CREATE_RAY_TRACING_ALLOW_MOTION_BIT_NV

  • VUID-VkExecutionGraphPipelineCreateInfoAMDX-flags-09007
    如果VkPhysicalDeviceDeviceGeneratedCommandsComputeFeaturesNV::deviceGeneratedComputePipelines 功能未启用,则 flags 必须不包含 VK_PIPELINE_CREATE_INDIRECT_BINDABLE_BIT_NV

  • VUID-VkExecutionGraphPipelineCreateInfoAMDX-flags-09008
    如果 flags 包含 VK_PIPELINE_CREATE_INDIRECT_BINDABLE_BIT_NV,则 pNext必须包含指向 VkComputePipelineIndirectBufferInfoNV 的有效实例的指针,该实例指定将保存管道元数据的地址

  • VUID-VkExecutionGraphPipelineCreateInfoAMDX-flags-11007
    如果 flags 包含 VK_PIPELINE_CREATE_2_INDIRECT_BINDABLE_BIT_EXT,则必须启用 VkPhysicalDeviceDeviceGeneratedCommandsFeaturesEXT::deviceGeneratedCommands 功能

  • VUID-VkExecutionGraphPipelineCreateInfoAMDX-pipelineCreationCacheControl-02875
    如果未启用 pipelineCreationCacheControl 功能,则 flags 必须不包含 VK_PIPELINE_CREATE_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BITVK_PIPELINE_CREATE_EARLY_RETURN_ON_FAILURE_BIT

  • VUID-VkExecutionGraphPipelineCreateInfoAMDX-stage-09128
    pStages 的任何元素的 stage 成员必须VK_SHADER_STAGE_COMPUTE_BIT

  • VUID-VkExecutionGraphPipelineCreateInfoAMDX-pStages-09129
    pStages 的每个元素标识的入口点的着色器代码和由此结构标识的其余状态必须遵守着色器接口章节中描述的管道链接规则

  • VUID-VkExecutionGraphPipelineCreateInfoAMDX-layout-09130
    layout 必须pStages 中指定的着色器的布局一致

  • VUID-VkExecutionGraphPipelineCreateInfoAMDX-pLibraryInfo-09131
    如果 pLibraryInfo 不是 NULL,则其 pLibraries 成员的每个元素必须已使用与此管道中的 layout 兼容的 layout 创建

  • VUID-VkExecutionGraphPipelineCreateInfoAMDX-layout-09132
    管道使用的每个着色器阶段可访问的 layout 中的资源数量必须小于或等于 VkPhysicalDeviceLimits::maxPerStageResources

  • VUID-VkExecutionGraphPipelineCreateInfoAMDX-pLibraryInfo-09133
    如果 pLibraryInfo 不是 NULL,则 pLibraryInfo->pLibraries 的每个元素必须是计算管道、执行图管道或图形管道

  • VUID-VkExecutionGraphPipelineCreateInfoAMDX-pLibraryInfo-10181
    如果 pLibraryInfo 不是 NULL,则 pLibraryInfo->pLibraries 的每个元素(计算管道或图形管道)必须已使用设置的 VK_PIPELINE_CREATE_2_EXECUTION_GRAPH_BIT_AMDX 创建

  • VUID-VkExecutionGraphPipelineCreateInfoAMDX-shaderMeshEnqueue-10182
    如果未启用 shaderMeshEnqueue 功能,并且 pLibraryInfo->pLibraries 不是 NULL,则 pLibraryInfo->pLibraries 必须不包含任何图形管道

  • VUID-VkExecutionGraphPipelineCreateInfoAMDX-pLibraryInfo-10183
    pLibraryInfo->pLibraries 的任何元素,如果标识的是图形管线,必须使用所有可能的状态子集创建。

  • VUID-VkExecutionGraphPipelineCreateInfoAMDX-None-09134
    管线中不能有两个节点共享相同的着色器名称和索引,如 VkPipelineShaderStageNodeCreateInfoAMDX 所指定。

  • VUID-VkExecutionGraphPipelineCreateInfoAMDX-None-09135
    管线中不能有两个节点共享相同的着色器名称,并且具有不同大小的输入有效负载声明。

  • VUID-VkExecutionGraphPipelineCreateInfoAMDX-None-09136
    管线中不能有两个节点共享相同的名称,但具有不同的执行模型。

  • VUID-VkExecutionGraphPipelineCreateInfoAMDX-CoalescedInputCountAMDX-09137
    管线中不能有两个节点共享相同的名称,其中一个包含 CoalescedInputCountAMDX 而另一个不包含。

  • VUID-VkExecutionGraphPipelineCreateInfoAMDX-StaticNumWorkgroupsAMDX-09138
    管线中不能有两个节点共享相同的名称,其中一个包含 StaticNumWorkgroupsAMDX 而另一个不包含。

  • VUID-VkExecutionGraphPipelineCreateInfoAMDX-PayloadNodeNameAMDX-09139
    如果管线中任何着色器中声明的输出有效负载具有一个 PayloadNodeNameAMDX 修饰符,其 Node Name 与图中任何其他节点的着色器名称匹配,则输出有效负载的大小必须与匹配节点中的输入有效负载大小匹配。

  • VUID-VkExecutionGraphPipelineCreateInfoAMDX-flags-10184
    如果 flags 不包含 VK_PIPELINE_CREATE_LIBRARY_BIT_KHR,并且管线中任何着色器中声明的输出有效负载没有 PayloadNodeSparseArrayAMDX 修饰符,则图中必须存在一个节点,对应于从 0 到其 PayloadNodeArraySizeAMDX 修饰符的每个索引。

有效使用(隐式)
  • VUID-VkExecutionGraphPipelineCreateInfoAMDX-sType-sType
    sType 必须VK_STRUCTURE_TYPE_EXECUTION_GRAPH_PIPELINE_CREATE_INFO_AMDX

  • VUID-VkExecutionGraphPipelineCreateInfoAMDX-pNext-pNext
    pNext 链中任何结构(包括此结构)的每个 pNext 成员必须NULL 或指向 VkPipelineCompilerControlCreateInfoAMDVkPipelineCreationFeedbackCreateInfo 的有效实例的指针。

  • VUID-VkExecutionGraphPipelineCreateInfoAMDX-sType-unique
    pNext 链中每个结构的 sType必须是唯一的。

  • VUID-VkExecutionGraphPipelineCreateInfoAMDX-pStages-parameter
    如果 stageCount 不为 0,并且 pStages 不为 NULL,则 pStages 必须是指向 stageCount 个有效 VkPipelineShaderStageCreateInfo 结构体数组的有效指针。

  • VUID-VkExecutionGraphPipelineCreateInfoAMDX-pLibraryInfo-parameter
    如果 pLibraryInfo 不为 NULL,则 pLibraryInfo 必须是指向有效 VkPipelineLibraryCreateInfoKHR 结构体的有效指针。

  • VUID-VkExecutionGraphPipelineCreateInfoAMDX-layout-parameter
    layout 必须是有效的 VkPipelineLayout 句柄。

  • VUID-VkExecutionGraphPipelineCreateInfoAMDX-commonparent
    basePipelineHandlelayout 这两个非忽略参数的有效句柄必须是从同一个 VkDevice 创建、分配或检索的。

VK_SHADER_INDEX_UNUSED_AMDX 是一个特殊的着色器索引,用于指示创建的节点不覆盖索引。在这种情况下,着色器索引通过其他方式确定。它被定义为

#define VK_SHADER_INDEX_UNUSED_AMDX       (~0U)

VkPipelineShaderStageNodeCreateInfoAMDX 结构定义如下:

// Provided by VK_AMDX_shader_enqueue
typedef struct VkPipelineShaderStageNodeCreateInfoAMDX {
      VkStructureType    sType;
    const void*          pNext;
    const char*          pName;
    uint32_t             index;
} VkPipelineShaderStageNodeCreateInfoAMDX;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • pName 是在执行图中创建节点时使用的着色器名称。如果 pNameNULL,则使用 SPIR-V 中指定的入口点名称作为着色器名称。

  • index 是在执行图中创建节点时使用的着色器索引。如果 indexVK_SHADER_INDEX_UNUSED_AMDX,则使用原始索引,或者如 ShaderIndexAMDX 执行模式所指定,或者如果也未指定,则使用 0

当包含在 VkPipelineShaderStageCreateInfo 结构的 pNext 链中时,此结构在创建执行图管线时指定节点的着色器名称和着色器索引。如果省略此结构,则着色器名称设置为 SPIR-V 中入口点的名称,着色器索引设置为 0

当从另一个着色器分派节点时,名称在管线创建时固定,但索引可以动态设置。通过将多个着色器与相同的名称但不同的索引关联,应用程序可以动态选择要执行的不同节点。应用程序必须确保每个节点都有唯一的名称和索引。

具有相同名称的着色器必须具有相同的类型,例如,计算着色器和图形着色器,或者甚至两个计算着色器,其中一个正在合并,而另一个没有,不能共享相同的名称。

有效使用(隐式)
  • VUID-VkPipelineShaderStageNodeCreateInfoAMDX-sType-sType
    sType 必须VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_NODE_CREATE_INFO_AMDX

  • VUID-VkPipelineShaderStageNodeCreateInfoAMDX-pName-parameter
    如果 pName 不为 NULL,则 pName 必须是以 null 结尾的 UTF-8 字符串。

要查询执行图中特定节点的内部节点索引,请调用

// Provided by VK_AMDX_shader_enqueue
VkResult vkGetExecutionGraphPipelineNodeIndexAMDX(
    VkDevice                                    device,
    VkPipeline                                  executionGraph,
    const VkPipelineShaderStageNodeCreateInfoAMDX* pNodeInfo,
    uint32_t*                                   pNodeIndex);
  • device 是创建 executionGraph 的逻辑设备。

  • executionGraph 是要查询内部节点索引的执行图管线。

  • pNodeInfo 是指向 VkPipelineShaderStageNodeCreateInfoAMDX 结构的指针,该结构标识要查询的节点的名称和索引。

  • pNodeIndex 是返回的已标识节点的内部节点索引。

一旦此函数返回,pNodeIndex 的内容将包含已标识节点的内部节点索引。

有效用法
  • VUID-vkGetExecutionGraphPipelineNodeIndexAMDX-pNodeInfo-09140
    pNodeInfo->pName 不能NULL

  • VUID-vkGetExecutionGraphPipelineNodeIndexAMDX-pNodeInfo-09141
    pNodeInfo->index 必须 不能为 VK_SHADER_INDEX_UNUSED_AMDX

  • VUID-vkGetExecutionGraphPipelineNodeIndexAMDX-executionGraph-09142
    executionGraph必须存在一个着色器名称和索引分别等于 pNodeInfo->pNamepNodeInfo->index 的节点

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

  • VUID-vkGetExecutionGraphPipelineNodeIndexAMDX-executionGraph-parameter
    executionGraph 必须 是一个有效的 VkPipeline 句柄

  • VUID-vkGetExecutionGraphPipelineNodeIndexAMDX-pNodeInfo-parameter
    pNodeInfo 必须 是指向有效 VkPipelineShaderStageNodeCreateInfoAMDX 结构的有效指针

  • VUID-vkGetExecutionGraphPipelineNodeIndexAMDX-pNodeIndex-parameter
    pNodeIndex 必须 是指向 uint32_t 值的有效指针

  • VUID-vkGetExecutionGraphPipelineNodeIndexAMDX-executionGraph-parent
    executionGraph 必须 是从 device 创建、分配或检索的

返回值
成功
  • VK_SUCCESS

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

初始化暂存内存

在执行管线图时,实现可能需要暂存内存来管理调度队列或类似内容,这由应用程序显式管理。

要查询调度执行图所需的暂存空间,请调用

// Provided by VK_AMDX_shader_enqueue
VkResult vkGetExecutionGraphPipelineScratchSizeAMDX(
    VkDevice                                    device,
    VkPipeline                                  executionGraph,
    VkExecutionGraphPipelineScratchSizeAMDX*    pSizeInfo);
  • device 是创建 executionGraph 的逻辑设备。

  • executionGraph 是要查询暂存空间的执行图管线。

  • pSizeInfo 是指向 VkExecutionGraphPipelineScratchSizeAMDX 结构的指针,该结构将包含所需的暂存大小。

此函数返回后,有关所需暂存空间的信息将在 pSizeInfo 中返回。

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

  • VUID-vkGetExecutionGraphPipelineScratchSizeAMDX-executionGraph-parameter
    executionGraph 必须 是一个有效的 VkPipeline 句柄

  • VUID-vkGetExecutionGraphPipelineScratchSizeAMDX-pSizeInfo-parameter
    pSizeInfo 必须 是指向 VkExecutionGraphPipelineScratchSizeAMDX 结构的有效指针

  • VUID-vkGetExecutionGraphPipelineScratchSizeAMDX-executionGraph-parent
    executionGraph 必须 是从 device 创建、分配或检索的

返回值
成功
  • VK_SUCCESS

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

VkExecutionGraphPipelineScratchSizeAMDX 结构定义为

// Provided by VK_AMDX_shader_enqueue
typedef struct VkExecutionGraphPipelineScratchSizeAMDX {
    VkStructureType    sType;
    void*              pNext;
    VkDeviceSize       minSize;
    VkDeviceSize       maxSize;
    VkDeviceSize       sizeGranularity;
} VkExecutionGraphPipelineScratchSizeAMDX;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • minSize 表示调度查询的执行图所需的最小暂存空间。

  • maxSize 表示调度查询的执行图可使用的最大暂存空间。

  • sizeGranularity 表示暂存空间可以从 minSize 增加的粒度。

应用程序可以使用大于 minSize 的任意大小的暂存内存来调度图,但是只会使用等于 minSize + sizeGranularity 的整数倍的值。更大的值可能会带来更高的性能,最大值为 maxSize,表示实现可以有效使用的最大内存量。

有效使用(隐式)
  • VUID-VkExecutionGraphPipelineScratchSizeAMDX-sType-sType
    sType 必须VK_STRUCTURE_TYPE_EXECUTION_GRAPH_PIPELINE_SCRATCH_SIZE_AMDX

要初始化特定执行图的暂存内存,请调用

// Provided by VK_AMDX_shader_enqueue
void vkCmdInitializeGraphScratchMemoryAMDX(
    VkCommandBuffer                             commandBuffer,
    VkPipeline                                  executionGraph,
    VkDeviceAddress                             scratch,
    VkDeviceSize                                scratchSize);
  • commandBuffer 是将记录命令的命令缓冲区。

  • executionGraph 是要初始化暂存内存的执行图管线。

  • scratch 是要初始化的暂存内存的地址。

  • scratchSize 是要初始化的暂存内存的字节范围。

在调度绑定的执行图管线之前,必须先调用此命令以使用 scratch

执行此命令可能会修改范围 [scratch, scratch + scratchSize) 中的任何内存位置。对该内存范围的访问在具有 VK_ACCESS_2_SHADER_STORAGE_READ_BITVK_ACCESS_2_SHADER_STORAGE_WRITE_BIT 访问标志的 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT 管线阶段中执行。

如果 scratch 的任何部分被除了 vkCmdDispatchGraphAMDXvkCmdDispatchGraphIndirectAMDXvkCmdDispatchGraphIndirectCountAMDX 或具有相同执行图的 vkCmdInitializeGraphScratchMemoryAMDX 之外的任何命令修改,则在再次对其进行调度之前,必须再次为执行图重新初始化。

有效用法
  • VUID-vkCmdInitializeGraphScratchMemoryAMDX-scratch-10185
    scratch 必须 是至少与 scratchSize 一样大的已分配内存范围的设备地址

  • VUID-vkCmdInitializeGraphScratchMemoryAMDX-scratchSize-10186
    scratchSize 必须 大于或等于 vkGetExecutionGraphPipelineScratchSizeAMDX 为绑定的执行图管线返回的 VkExecutionGraphPipelineScratchSizeAMDX::minSize

  • VUID-vkCmdInitializeGraphScratchMemoryAMDX-scratch-09144
    scratch 必须 是 64 的倍数

有效使用(隐式)
  • VUID-vkCmdInitializeGraphScratchMemoryAMDX-commandBuffer-parameter
    commandBuffer 必须 是有效的 VkCommandBuffer 句柄

  • VUID-vkCmdInitializeGraphScratchMemoryAMDX-executionGraph-parameter
    executionGraph 必须 是一个有效的 VkPipeline 句柄

  • VUID-vkCmdInitializeGraphScratchMemoryAMDX-commandBuffer-recording
    commandBuffer 必须处于录制状态

  • VUID-vkCmdInitializeGraphScratchMemoryAMDX-commandBuffer-cmdpool
    commandBuffer 分配自的 VkCommandPool 必须支持图形或计算操作

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

  • VUID-vkCmdInitializeGraphScratchMemoryAMDX-bufferlevel
    commandBuffer 必须是一个主 VkCommandBuffer

  • VUID-vkCmdInitializeGraphScratchMemoryAMDX-commonparent
    commandBufferexecutionGraph必须已从同一个 VkDevice 创建、分配或检索

主机同步
  • commandBuffer 分配自的 VkCommandPool 的主机访问必须进行外部同步

调度图

执行图的初始调度从主机以与其他任何命令相同的方式完成,并且可以以类似于计算调度命令的方式使用,并提供间接变体。

要记录执行图调度,请调用

// Provided by VK_AMDX_shader_enqueue
void vkCmdDispatchGraphAMDX(
    VkCommandBuffer                             commandBuffer,
    VkDeviceAddress                             scratch,
    VkDeviceSize                                scratchSize,
    const VkDispatchGraphCountInfoAMDX*         pCountInfo);
  • commandBuffer 是将记录命令的命令缓冲区。

  • scratch 是要使用的暂存内存的地址。

  • scratchSize 是要使用的暂存内存的字节范围。

  • pCountInfo 是指向 VkDispatchGraphCountInfoAMDX 结构的主机指针,该结构定义了将初始执行的节点。

执行此命令时,将执行 pCountInfo 中指定的节点。作为此命令一部分执行的节点在调度后不会以任何方式相互隐式同步。单独调度的图形节点之间没有光栅化顺序保证,尽管单个调度中的各个图元确实遵守光栅化顺序。在执行图之前或之后执行的绘制调用也相对于光栅化顺序的每个图形节点执行。

对于此命令,子结构中的所有设备/主机指针都被视为主机指针,并且在此命令的主机执行期间只读。此命令返回后,不会保留对原始指针的任何引用。

执行此命令可能会修改范围 [scratch, scratch + scratchSize) 中的任何内存位置。对该内存范围的访问在具有 VK_ACCESS_2_SHADER_STORAGE_READ_BITVK_ACCESS_2_SHADER_STORAGE_WRITE_BIT 访问标志的 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT 管线阶段中执行。

此命令捕获网格节点的命令缓冲区状态,类似于绘制命令。

有效用法
  • VUID-vkCmdDispatchGraphAMDX-magFilter-04553
    如果使用 magFilterminFilter 等于 VK_FILTER_LINEARreductionMode 等于 VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGEcompareEnable 等于 VK_FALSE 创建的 VkSampler 来采样 VkImageView 作为此命令的结果,则图像视图的格式特征必须包含 VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT

  • VUID-vkCmdDispatchGraphAMDX-magFilter-09598
    如果使用 magFilterminFilter 等于 VK_FILTER_LINEARreductionMode 等于 VK_SAMPLER_REDUCTION_MODE_MINVK_SAMPLER_REDUCTION_MODE_MAX 创建的 VkSampler 来采样 VkImageView 作为此命令的结果,则图像视图的格式特征必须包含 VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_MINMAX_BIT

  • VUID-vkCmdDispatchGraphAMDX-mipmapMode-04770
    如果使用 mipmapMode 等于 VK_SAMPLER_MIPMAP_MODE_LINEARreductionMode 等于 VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGEcompareEnable 等于 VK_FALSE 创建的 VkSampler 来采样 VkImageView 作为此命令的结果,则图像视图的格式特征必须包含 VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT

  • VUID-vkCmdDispatchGraphAMDX-mipmapMode-09599
    如果使用 mipmapMode 等于 VK_SAMPLER_MIPMAP_MODE_LINEARreductionMode 等于 VK_SAMPLER_REDUCTION_MODE_MINVK_SAMPLER_REDUCTION_MODE_MAX 创建的 VkSampler 来采样 VkImageView 作为此命令的结果,则图像视图的格式特征必须包含 VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_MINMAX_BIT

  • VUID-vkCmdDispatchGraphAMDX-unnormalizedCoordinates-09635
    如果使用 unnormalizedCoordinates 等于 VK_TRUE 创建的 VkSampler 来采样 VkImageView 作为此命令的结果,则图像视图的 levelCountlayerCount 必须为 1

  • VUID-vkCmdDispatchGraphAMDX-None-08609
    如果使用 unnormalizedCoordinates 等于 VK_TRUE 创建的 VkSampler 来采样 VkImageView 作为此命令的结果,则图像视图的 viewType 必须VK_IMAGE_VIEW_TYPE_1DVK_IMAGE_VIEW_TYPE_2D

  • VUID-vkCmdDispatchGraphAMDX-None-08610
    如果使用 unnormalizedCoordinates 等于 VK_TRUE 创建的 VkSampler 来采样 VkImageView 作为此命令的结果,则采样器必须不能与任何 SPIR-V OpImageSample*OpImageSparseSample* 指令一起使用,这些指令的名称中包含 ImplicitLodDrefProj

  • VUID-vkCmdDispatchGraphAMDX-None-08611
    如果使用 unnormalizedCoordinates 等于 VK_TRUE 创建的 VkSampler 来采样 VkImageView 作为此命令的结果,则采样器必须不能与任何包含 LOD 偏差或任何偏移值的 SPIR-V OpImageSample*OpImageSparseSample* 指令一起使用

  • VUID-vkCmdDispatchGraphAMDX-None-06479
    如果使用深度比较采样 VkImageView,则图像视图的格式特征必须包含 VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_DEPTH_COMPARISON_BIT

  • VUID-vkCmdDispatchGraphAMDX-None-02691
    如果使用原子操作访问 VkImageView 作为此命令的结果,则图像视图的格式特征必须包含 VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT

  • VUID-vkCmdDispatchGraphAMDX-None-07888
    如果使用原子操作访问 VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER 描述符作为此命令的结果,则存储纹理缓冲区视图的格式特征必须包含 VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT

  • VUID-vkCmdDispatchGraphAMDX-None-02692
    如果此命令导致使用 VK_FILTER_CUBIC_EXT 采样 VkImageView,则该图像视图的格式特性必须包含 VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT

  • VUID-vkCmdDispatchGraphAMDX-None-02693
    如果未启用 VK_EXT_filter_cubic 扩展,并且任何 VkImageView 因此命令导致使用 VK_FILTER_CUBIC_EXT 进行采样,则它必须不具有 VK_IMAGE_VIEW_TYPE_3DVK_IMAGE_VIEW_TYPE_CUBEVK_IMAGE_VIEW_TYPE_CUBE_ARRAYVkImageViewType

  • VUID-vkCmdDispatchGraphAMDX-filterCubic-02694
    任何因此命令导致使用 VK_FILTER_CUBIC_EXT 采样的 VkImageView必须具有支持立方体滤波的 VkImageViewType 和格式,如 VkFilterCubicImageViewImageFormatPropertiesEXT::filterCubic 中指定,由 vkGetPhysicalDeviceImageFormatProperties2 返回。

  • VUID-vkCmdDispatchGraphAMDX-filterCubicMinmax-02695
    任何因此命令导致使用 VK_FILTER_CUBIC_EXT 采样,且缩减模式为 VK_SAMPLER_REDUCTION_MODE_MINVK_SAMPLER_REDUCTION_MODE_MAXVkImageView必须具有支持立方体滤波以及最小值/最大值滤波的 VkImageViewType 和格式,如 VkFilterCubicImageViewImageFormatPropertiesEXT::filterCubicMinmax 中指定,由 vkGetPhysicalDeviceImageFormatProperties2 返回。

  • VUID-vkCmdDispatchGraphAMDX-cubicRangeClamp-09212
    如果未启用 cubicRangeClamp 特性,则任何因此命令导致使用 VK_FILTER_CUBIC_EXT 采样的 VkImageView必须不具有等于 VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE_RANGECLAMP_QCOMVkSamplerReductionModeCreateInfo::reductionMode

  • VUID-vkCmdDispatchGraphAMDX-reductionMode-09213
    任何因此命令导致使用等于 VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE_RANGECLAMP_QCOMVkSamplerReductionModeCreateInfo::reductionMode 采样的 VkImageView必须使用 VK_FILTER_CUBIC_EXT 进行采样。

  • VUID-vkCmdDispatchGraphAMDX-selectableCubicWeights-09214
    如果未启用 selectableCubicWeights 特性,则任何因此命令导致使用 VK_FILTER_CUBIC_EXT 采样的 VkImageView必须使 VkSamplerCubicWeightsCreateInfoQCOM::cubicWeights 等于 VK_CUBIC_FILTER_WEIGHTS_CATMULL_ROM_QCOM

  • VUID-vkCmdDispatchGraphAMDX-flags-02696
    任何使用包含 VK_IMAGE_CREATE_CORNER_SAMPLED_BIT_NVVkImageCreateInfo::flags 创建,并且因此命令采样的 VkImage必须仅使用 VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGEVkSamplerAddressMode 进行采样。

  • VUID-vkCmdDispatchGraphAMDX-OpTypeImage-07027
    对于作为存储图像写入的任何 VkImageView,如果 OpTypeImage 的图像格式字段为 Unknown,则该视图的格式特性必须包含 VK_FORMAT_FEATURE_2_STORAGE_WRITE_WITHOUT_FORMAT_BIT

  • VUID-vkCmdDispatchGraphAMDX-OpTypeImage-07028
    对于作为存储图像读取的任何 VkImageView,如果 OpTypeImage 的图像格式字段为 Unknown,则该视图的格式特性必须包含 VK_FORMAT_FEATURE_2_STORAGE_READ_WITHOUT_FORMAT_BIT

  • VUID-vkCmdDispatchGraphAMDX-OpTypeImage-07029
    对于作为存储纹理缓冲写入的任何 VkBufferView,如果 OpTypeImage 的图像格式字段为 Unknown,则该视图的缓冲特性必须包含 VK_FORMAT_FEATURE_2_STORAGE_WRITE_WITHOUT_FORMAT_BIT

  • VUID-vkCmdDispatchGraphAMDX-OpTypeImage-07030
    任何作为存储纹理缓冲读取的 VkBufferView,如果 OpTypeImage 的图像格式字段为 Unknown,则该视图的 缓冲特性必须包含 VK_FORMAT_FEATURE_2_STORAGE_READ_WITHOUT_FORMAT_BIT

  • VUID-vkCmdDispatchGraphAMDX-None-08600
    对于 绑定的着色器 静态使用的每个集合 *n*,必须在同一管线绑定点将描述符集合绑定到 *n*,并且 VkPipelineLayout 必须与集合 *n* 兼容,且 VkPipelineLayout 用于创建当前的 VkPipeline,或者 VkDescriptorSetLayout 数组用于创建当前的 VkShaderEXT,如 管线布局兼容性 中所述。

  • VUID-vkCmdDispatchGraphAMDX-None-08601
    对于 绑定的着色器 静态使用的每个推送常量,必须为相同的管线绑定点设置推送常量值,并且 VkPipelineLayout 必须与推送常量兼容,且 VkPipelineLayout 用于创建当前的 VkPipeline,或者 VkDescriptorSetLayout 数组用于创建当前的 VkShaderEXT,如 管线布局兼容性 中所述。

  • VUID-vkCmdDispatchGraphAMDX-None-10068
    对于绑定的着色器使用的每个资源数组,用于访问数组元素的索引必须小于此命令使用的描述符集中标识的绑定的描述符计数

  • VUID-vkCmdDispatchGraphAMDX-maintenance4-08602
    如果未启用maintenance4特性,则对于绑定的着色器静态使用的每个推送常量,必须已为同一管线绑定点设置推送常量值,并且其VkPipelineLayout 对于推送常量是兼容的,与用于创建当前VkPipelineVkPipelineLayout 或用于创建当前VkShaderEXTVkDescriptorSetLayoutVkPushConstantRange数组,如管线布局兼容性中所述

  • VUID-vkCmdDispatchGraphAMDX-None-08114
    通过vkCmdBindDescriptorSets指定的每个绑定描述符集中的描述符,如果它们被绑定到此命令所用管线绑定点的VkPipeline静态使用,且绑定的VkPipeline不是使用VK_PIPELINE_CREATE_DESCRIPTOR_BUFFER_BIT_EXT创建的,则必须描述符有效性中所述有效

  • VUID-vkCmdDispatchGraphAMDX-None-08115
    如果绑定到管线绑定点的VkPipeline使用的描述符是通过vkCmdBindDescriptorSets指定的,则绑定的VkPipeline必须已在没有VK_PIPELINE_CREATE_DESCRIPTOR_BUFFER_BIT_EXT的情况下创建

  • VUID-vkCmdDispatchGraphAMDX-None-08116
    通过vkCmdSetDescriptorBufferOffsetsEXT指定的绑定描述符缓冲区中的描述符,如果它们被绑定到此命令所用管线绑定点的VkPipeline动态使用,且绑定的VkPipeline是使用VK_PIPELINE_CREATE_DESCRIPTOR_BUFFER_BIT_EXT创建的,则必须有效

  • VUID-vkCmdDispatchGraphAMDX-None-08604
    如果绑定到与此命令所用管线绑定点对应的阶段的任何VkShaderEXT动态使用,通过vkCmdSetDescriptorBufferOffsetsEXT指定的绑定描述符缓冲区中的描述符,必须有效

  • VUID-vkCmdDispatchGraphAMDX-None-08117
    如果绑定到管线绑定点的VkPipeline使用的描述符是通过vkCmdSetDescriptorBufferOffsetsEXT指定的,则绑定的VkPipeline必须已使用VK_PIPELINE_CREATE_DESCRIPTOR_BUFFER_BIT_EXT创建

  • VUID-vkCmdDispatchGraphAMDX-None-08119
    如果描述符被使用VK_PIPELINE_CREATE_DESCRIPTOR_BUFFER_BIT_EXT创建的VkPipeline动态使用,则描述符内存必须驻留

  • VUID-vkCmdDispatchGraphAMDX-None-08605
    如果描述符被使用通过使用VK_DESCRIPTOR_SET_LAYOUT_CREATE_DESCRIPTOR_BUFFER_BIT_EXT创建的VkDescriptorSetLayout 创建的VkShaderEXT动态使用,则描述符内存必须驻留

  • VUID-vkCmdDispatchGraphAMDX-None-08606
    如果未启用shaderObject特性,则必须将有效的管线绑定到此命令所用的管线绑定点

  • VUID-vkCmdDispatchGraphAMDX-None-08608
    如果将管线绑定到此命令使用的管线绑定点,则自该管线绑定以来,必须没有对绑定到此命令使用的管线绑定点的VkPipeline对象中静态指定的任何状态调用动态状态设置命令

  • VUID-vkCmdDispatchGraphAMDX-None-08607
    如果启用了shaderObject特性,则必须将有效的管线绑定到此命令所用的管线绑定点,或者将有效且VK_NULL_HANDLE着色器对象的有效组合绑定到与此命令所用的管线绑定点对应的每个受支持的着色器阶段

  • VUID-vkCmdDispatchGraphAMDX-uniformBuffers-06935
    如果绑定到此命令所用的管线绑定点的VkPipeline对象的任何阶段访问统一缓冲区,且该阶段的创建未启用uniformBuffersVK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESSVK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS_2,且未启用robustBufferAccess特性,则该阶段必须不访问缓冲区范围之外的值,如绑定到同一管线绑定点的描述符集中所指定

  • VUID-vkCmdDispatchGraphAMDX-None-08612
    如果未启用robustBufferAccess特性,且绑定到与此命令所用管线绑定点对应的阶段的任何VkShaderEXT访问统一缓冲区,则它必须不访问缓冲区范围之外的值,如绑定到同一管线绑定点的描述符集中所指定

  • VUID-vkCmdDispatchGraphAMDX-storageBuffers-06936
    如果绑定到此命令所用管线绑定点的 VkPipeline 对象的任何阶段访问存储缓冲区,并且该阶段的创建未启用 storageBuffersVK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESSVK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS_2,并且未启用 robustBufferAccess 功能,则该阶段必须不访问描述符集中指定的缓冲区范围之外的值(该描述符集绑定到同一管线绑定点)。

  • VUID-vkCmdDispatchGraphAMDX-None-08613
    如果未启用 robustBufferAccess 功能,并且绑定到与此命令所用管线绑定点对应的阶段的任何 VkShaderEXT 访问存储缓冲区,则它必须不访问描述符集中指定的缓冲区范围之外的值(该描述符集绑定到同一管线绑定点)。

  • VUID-vkCmdDispatchGraphAMDX-commandBuffer-02707
    如果 commandBuffer 是一个未受保护的命令缓冲区,并且不支持 protectedNoFault,则 绑定的着色器 访问的任何资源必须不是受保护的资源。

  • VUID-vkCmdDispatchGraphAMDX-None-06550
    如果 绑定的着色器 访问启用了 采样器 Y′CBCR 转换VkSamplerVkImageView 对象,则该对象必须仅与 OpImageSample*OpImageSparseSample* 指令一起使用。

  • VUID-vkCmdDispatchGraphAMDX-ConstOffset-06551
    如果 绑定的着色器 访问启用了 采样器 Y′CBCR 转换VkSamplerVkImageView 对象,则该对象必须不使用 ConstOffsetOffset 操作数。

  • VUID-vkCmdDispatchGraphAMDX-viewType-07752
    如果此命令导致访问 VkImageView,则图像视图的 viewType 必须SPIR-V 图像维度和 Vulkan ImageView 类型之间的兼容性中所述的 OpTypeImageDim 操作数匹配。

  • VUID-vkCmdDispatchGraphAMDX-format-07753
    如果此命令导致访问 VkImageView,则图像视图的 format数值类型OpTypeImageSampled Type 操作数必须匹配。

  • VUID-vkCmdDispatchGraphAMDX-OpImageWrite-08795
    如果使用 OpImageWrite 作为此命令的结果访问以 VK_FORMAT_A8_UNORM 以外的格式创建的 VkImageView,则该指令的 Texel 操作数的 Type 必须至少具有与图像视图格式一样多的组件。

  • VUID-vkCmdDispatchGraphAMDX-OpImageWrite-08796
    如果使用 OpImageWrite 作为此命令的结果访问以 VK_FORMAT_A8_UNORM 格式创建的 VkImageView,则该指令的 Texel 操作数的 Type 必须具有四个组件。

  • VUID-vkCmdDispatchGraphAMDX-OpImageWrite-04469
    如果使用 OpImageWrite 作为此命令的结果访问 VkBufferView,则该指令的 Texel 操作数的 Type 必须至少具有与缓冲区视图格式一样多的组件。

  • VUID-vkCmdDispatchGraphAMDX-SampledType-04470
    如果此命令导致访问具有 64 位组件宽度的 VkFormatVkImageView,则该指令的 OpTypeImage 操作数的 SampledType 必须具有 64 的 Width

  • VUID-vkCmdDispatchGraphAMDX-SampledType-04471
    如果此命令导致访问具有小于 64 位组件宽度的 VkFormatVkImageView,则该指令的 OpTypeImage 操作数的 SampledType 必须具有 32 的 Width

  • VUID-vkCmdDispatchGraphAMDX-SampledType-04472
    如果此命令导致访问具有 64 位组件宽度的 VkFormatVkBufferView,则该指令的 OpTypeImage 操作数的 SampledType 必须具有 64 的 Width

  • VUID-vkCmdDispatchGraphAMDX-SampledType-04473
    如果此命令导致访问具有小于 64 位组件宽度的 VkFormatVkBufferView,则该指令的 OpTypeImage 操作数的 SampledType 必须具有 32 的 Width

  • VUID-vkCmdDispatchGraphAMDX-sparseImageInt64Atomics-04474
    如果未启用 sparseImageInt64Atomics 功能,则通过此命令,具有 VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT 标志创建的 VkImage 对象必须不通过 SampledTypeWidth 为 64 的 OpTypeImage 以原子指令访问。

  • VUID-vkCmdDispatchGraphAMDX-sparseImageInt64Atomics-04475
    如果未启用 sparseImageInt64Atomics 功能,则使用 VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT 标志创建的 VkBuffer 对象必须不能通过具有 Width 为 64 的 SampledTypeOpTypeImage,通过原子指令访问。

  • VUID-vkCmdDispatchGraphAMDX-OpImageWeightedSampleQCOM-06971
    如果使用 OpImageWeightedSampleQCOM 对此命令的结果 VkImageView 进行采样,则图像视图的格式特性必须包含 VK_FORMAT_FEATURE_2_WEIGHT_SAMPLED_IMAGE_BIT_QCOM

  • VUID-vkCmdDispatchGraphAMDX-OpImageWeightedSampleQCOM-06972
    如果 OpImageWeightedSampleQCOM 使用 VkImageView 作为此命令结果的采样权重图像,则该图像视图的格式特性必须包含 VK_FORMAT_FEATURE_2_WEIGHT_IMAGE_BIT_QCOM

  • VUID-vkCmdDispatchGraphAMDX-OpImageBoxFilterQCOM-06973
    如果使用 OpImageBoxFilterQCOM 对此命令的结果 VkImageView 进行采样,则该图像视图的格式特性必须包含 VK_FORMAT_FEATURE_2_BOX_FILTER_SAMPLED_BIT_QCOM

  • VUID-vkCmdDispatchGraphAMDX-OpImageBlockMatchSSDQCOM-06974
    如果使用 OpImageBlockMatchSSDQCOM 从此命令的结果 VkImageView 中读取,则该图像视图的格式特性必须包含 VK_FORMAT_FEATURE_2_BLOCK_MATCHING_BIT_QCOM

  • VUID-vkCmdDispatchGraphAMDX-OpImageBlockMatchSADQCOM-06975
    如果使用 OpImageBlockMatchSADQCOM 从此命令的结果 VkImageView 中读取,则该图像视图的格式特性必须包含 VK_FORMAT_FEATURE_2_BLOCK_MATCHING_BIT_QCOM

  • VUID-vkCmdDispatchGraphAMDX-OpImageBlockMatchSADQCOM-06976
    如果使用 OpImageBlockMatchSADQCOM 或 OpImageBlockMatchSSDQCOM 从此命令结果的参考图像中读取,则指定的参考坐标必须通过整数纹素坐标验证

  • VUID-vkCmdDispatchGraphAMDX-OpImageWeightedSampleQCOM-06977
    如果 OpImageWeightedSampleQCOMOpImageBoxFilterQCOMOpImageBlockMatchWindowSSDQCOMOpImageBlockMatchWindowSADQCOMOpImageBlockMatchGatherSSDQCOMOpImageBlockMatchGatherSADQCOMOpImageBlockMatchSSDQCOMOpImageBlockMatchSADQCOM 使用 VkSampler 作为此命令的结果,则该采样器必须使用 VK_SAMPLER_CREATE_IMAGE_PROCESSING_BIT_QCOM 创建。

  • VUID-vkCmdDispatchGraphAMDX-OpImageWeightedSampleQCOM-06978
    如果除 OpImageWeightedSampleQCOMOpImageBoxFilterQCOMOpImageBlockMatchWindowSSDQCOMOpImageBlockMatchWindowSADQCOMOpImageBlockMatchGatherSSDQCOMOpImageBlockMatchGatherSADQCOMOpImageBlockMatchSSDQCOMOpImageBlockMatchSADQCOM 之外的任何命令使用 VkSampler 作为此命令的结果,则该采样器必须未使用 VK_SAMPLER_CREATE_IMAGE_PROCESSING_BIT_QCOM 创建。

  • VUID-vkCmdDispatchGraphAMDX-OpImageBlockMatchWindow-09215
    如果使用 OpImageBlockMatchWindow*QCOMOpImageBlockMatchGather*QCOM 指令从此命令的结果 VkImageView 中读取,则该图像视图的格式特性必须包含 VK_FORMAT_FEATURE_2_BLOCK_MATCHING_BIT_QCOM

  • VUID-vkCmdDispatchGraphAMDX-OpImageBlockMatchWindow-09216
    如果使用 OpImageBlockMatchWindow*QCOMOpImageBlockMatchGather*QCOM 指令从此命令的结果 VkImageView 中读取,则该图像视图的格式必须是单分量格式。

  • VUID-vkCmdDispatchGraphAMDX-OpImageBlockMatchWindow-09217
    如果 OpImageBlockMatchWindow*QCOMOpImageBlockMatchGather*QCOM 从此命令结果的参考图像中读取,则指定的参考坐标必须通过整数纹素坐标验证

  • VUID-vkCmdDispatchGraphAMDX-None-07288
    此命令执行的任何着色器调用必须终止

  • VUID-vkCmdDispatchGraphAMDX-None-09600
    如果访问类型等于 VK_DESCRIPTOR_TYPE_SAMPLE_WEIGHT_IMAGE_QCOMVK_DESCRIPTOR_TYPE_BLOCK_MATCH_IMAGE_QCOMVK_DESCRIPTOR_TYPE_SAMPLED_IMAGEVK_DESCRIPTOR_TYPE_STORAGE_IMAGEVK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT 的描述符作为此命令的结果,则该描述符标识的所有图像子资源必须位于写入描述符时标识的图像布局中。

  • VUID-vkCmdDispatchGraphAMDX-commandBuffer-09181
    commandBuffer必须不是受保护的命令缓冲区。

  • VUID-vkCmdDispatchGraphAMDX-commandBuffer-09182
    commandBuffer必须是主命令缓冲区。

  • VUID-vkCmdDispatchGraphAMDX-scratch-10192
    scratch 必须 是至少与 scratchSize 一样大的已分配内存范围的设备地址

  • VUID-vkCmdDispatchGraphAMDX-scratchSize-10193
    scratchSize 必须 大于或等于 vkGetExecutionGraphPipelineScratchSizeAMDX 为绑定的执行图管线返回的 VkExecutionGraphPipelineScratchSizeAMDX::minSize

  • VUID-vkCmdDispatchGraphAMDX-scratch-09184
    scratch必须是使用 VK_BUFFER_USAGE_EXECUTION_GRAPH_SCRATCH_BIT_AMDXVK_BUFFER_USAGE_2_EXECUTION_GRAPH_SCRATCH_BIT_AMDX 标志创建的 VkBuffer 中的设备地址。

  • VUID-vkCmdDispatchGraphAMDX-scratch-10194
    设备内存范围 [scratch,scratch
    scratchSize]必须已使用 vkCmdInitializeGraphScratchMemoryAMDX 使用绑定的执行图管线初始化,并且之后没有被其他任何东西修改,除了另一个执行图分派命令。

  • VUID-vkCmdDispatchGraphAMDX-maxComputeWorkGroupCount-09186
    此命令的执行必须不会导致节点分派的工作组数量大于已分派节点中的 MaxNumWorkgroupsAMDX 装饰或 maxComputeWorkGroupCount 指定的数量。

  • VUID-vkCmdDispatchGraphAMDX-maxExecutionGraphShaderPayloadCount-09187
    执行此命令必须不会导致任何着色器初始化超过 maxExecutionGraphShaderPayloadCount 个输出负载。

  • VUID-vkCmdDispatchGraphAMDX-NodeMaxPayloadsAMDX-09188
    执行此命令必须不会导致任何声明了 NodeMaxPayloadsAMDX 的着色器初始化的输出负载数量超过该装饰的最大负载数量。 此要求分别适用于每个 NodeMaxPayloadsAMDX 装饰。

  • VUID-vkCmdDispatchGraphAMDX-None-10195
    如果绑定的执行图管线包含绘制节点,则此命令必须在与用于创建每个节点的图形管线兼容的渲染通道实例中调用。

  • VUID-vkCmdDispatchGraphAMDX-pCountInfo-09145
    pCountInfo->infos 必须是指向至少为 countstride 的乘积大小的内存分配的主机指针。

  • VUID-vkCmdDispatchGraphAMDX-infos-09146
    索引范围在 [infos, infos + (count*stride)) 的主机内存位置,粒度为 stride 必须在前 24 个字节中包含有效的 VkDispatchGraphInfoAMDX 结构。

  • VUID-vkCmdDispatchGraphAMDX-pCountInfo-09147
    对于 pCountInfo->infos 中的每个 VkDispatchGraphInfoAMDX 结构,payloads 必须是指向至少为 payloadCountpayloadStride 的乘积大小的内存分配的主机指针。

  • VUID-vkCmdDispatchGraphAMDX-pCountInfo-09148
    对于 pCountInfo->infos 中的每个 VkDispatchGraphInfoAMDX 结构,nodeIndex 必须是绑定执行图管线中的有效节点索引,由 vkGetExecutionGraphPipelineNodeIndexAMDX 返回。

  • VUID-vkCmdDispatchGraphAMDX-pCountInfo-09149
    对于 pCountInfo->infos 中的每个 VkDispatchGraphInfoAMDX 结构,索引范围在 [payloads, payloads + (payloadCount * payloadStride)) 的主机内存位置,粒度为 payloadStride 必须在前几个字节中包含一个与 nodeIndex 中节点期望的输入负载大小匹配的负载。

有效使用(隐式)
  • VUID-vkCmdDispatchGraphAMDX-commandBuffer-parameter
    commandBuffer 必须 是有效的 VkCommandBuffer 句柄

  • VUID-vkCmdDispatchGraphAMDX-pCountInfo-parameter
    pCountInfo 必须是指向有效 VkDispatchGraphCountInfoAMDX 结构的有效指针。

  • VUID-vkCmdDispatchGraphAMDX-commandBuffer-recording
    commandBuffer 必须处于录制状态

  • VUID-vkCmdDispatchGraphAMDX-commandBuffer-cmdpool
    commandBuffer 分配自的 VkCommandPool 必须支持图形或计算操作

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

  • VUID-vkCmdDispatchGraphAMDX-bufferlevel
    commandBuffer 必须是一个主 VkCommandBuffer

主机同步
  • commandBuffer 分配自的 VkCommandPool 的主机访问必须进行外部同步

要记录使用在设备上读取的节点和负载参数的执行图调度,请调用

// Provided by VK_AMDX_shader_enqueue
void vkCmdDispatchGraphIndirectAMDX(
    VkCommandBuffer                             commandBuffer,
    VkDeviceAddress                             scratch,
    VkDeviceSize                                scratchSize,
    const VkDispatchGraphCountInfoAMDX*         pCountInfo);
  • commandBuffer 是将记录命令的命令缓冲区。

  • scratch 是要使用的暂存内存的地址。

  • scratchSize 是要使用的暂存内存的字节范围。

  • pCountInfo 是指向 VkDispatchGraphCountInfoAMDX 结构的主机指针,该结构定义了将初始执行的节点。

执行此命令时,将执行 pCountInfo 中指定的节点。作为此命令一部分执行的节点在调度后不会以任何方式相互隐式同步。单独调度的图形节点之间没有光栅化顺序保证,尽管单个调度中的各个图元确实遵守光栅化顺序。在执行图之前或之后执行的绘制调用也相对于光栅化顺序的每个图形节点执行。

对于此命令,子结构中的所有设备/主机指针都视为设备指针,并在设备执行此命令期间读取。这些指针的分配和内容仅需要在设备执行期间有效。所有这些地址都将在 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT 管线阶段使用 VK_ACCESS_2_SHADER_STORAGE_READ_BIT 访问标志读取。

执行此命令可能会修改范围 [scratch, scratch + scratchSize) 中的任何内存位置。对该内存范围的访问在具有 VK_ACCESS_2_SHADER_STORAGE_READ_BITVK_ACCESS_2_SHADER_STORAGE_WRITE_BIT 访问标志的 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT 管线阶段中执行。

此命令捕获网格节点的命令缓冲区状态,类似于绘制命令。

有效用法
  • VUID-vkCmdDispatchGraphIndirectAMDX-magFilter-04553
    如果使用 magFilterminFilter 等于 VK_FILTER_LINEARreductionMode 等于 VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGEcompareEnable 等于 VK_FALSE 创建的 VkSampler 来采样 VkImageView 作为此命令的结果,则图像视图的格式特征必须包含 VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT

  • VUID-vkCmdDispatchGraphIndirectAMDX-magFilter-09598
    如果使用 magFilterminFilter 等于 VK_FILTER_LINEARreductionMode 等于 VK_SAMPLER_REDUCTION_MODE_MINVK_SAMPLER_REDUCTION_MODE_MAX 创建的 VkSampler 来采样 VkImageView 作为此命令的结果,则图像视图的格式特征必须包含 VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_MINMAX_BIT

  • VUID-vkCmdDispatchGraphIndirectAMDX-mipmapMode-04770
    如果使用 mipmapMode 等于 VK_SAMPLER_MIPMAP_MODE_LINEARreductionMode 等于 VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGEcompareEnable 等于 VK_FALSE 创建的 VkSampler 来采样 VkImageView 作为此命令的结果,则图像视图的格式特征必须包含 VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT

  • VUID-vkCmdDispatchGraphIndirectAMDX-mipmapMode-09599
    如果使用 mipmapMode 等于 VK_SAMPLER_MIPMAP_MODE_LINEARreductionMode 等于 VK_SAMPLER_REDUCTION_MODE_MINVK_SAMPLER_REDUCTION_MODE_MAX 创建的 VkSampler 来采样 VkImageView 作为此命令的结果,则图像视图的格式特征必须包含 VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_MINMAX_BIT

  • VUID-vkCmdDispatchGraphIndirectAMDX-unnormalizedCoordinates-09635
    如果使用 unnormalizedCoordinates 等于 VK_TRUE 创建的 VkSampler 来采样 VkImageView 作为此命令的结果,则图像视图的 levelCountlayerCount 必须为 1

  • VUID-vkCmdDispatchGraphIndirectAMDX-None-08609
    如果使用 unnormalizedCoordinates 等于 VK_TRUE 创建的 VkSampler 来采样 VkImageView 作为此命令的结果,则图像视图的 viewType 必须VK_IMAGE_VIEW_TYPE_1DVK_IMAGE_VIEW_TYPE_2D

  • VUID-vkCmdDispatchGraphIndirectAMDX-None-08610
    如果使用 unnormalizedCoordinates 等于 VK_TRUE 创建的 VkSampler 来采样 VkImageView 作为此命令的结果,则采样器必须不能与任何 SPIR-V OpImageSample*OpImageSparseSample* 指令一起使用,这些指令的名称中包含 ImplicitLodDrefProj

  • VUID-vkCmdDispatchGraphIndirectAMDX-None-08611
    如果使用 unnormalizedCoordinates 等于 VK_TRUE 创建的 VkSampler 来采样 VkImageView 作为此命令的结果,则采样器必须不能与任何包含 LOD 偏差或任何偏移值的 SPIR-V OpImageSample*OpImageSparseSample* 指令一起使用

  • VUID-vkCmdDispatchGraphIndirectAMDX-None-06479
    如果使用深度比较采样 VkImageView,则图像视图的格式特征必须包含 VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_DEPTH_COMPARISON_BIT

  • VUID-vkCmdDispatchGraphIndirectAMDX-None-02691
    如果使用原子操作访问 VkImageView 作为此命令的结果,则图像视图的格式特征必须包含 VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT

  • VUID-vkCmdDispatchGraphIndirectAMDX-None-07888
    如果使用原子操作访问 VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER 描述符作为此命令的结果,则存储纹理缓冲区视图的格式特征必须包含 VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT

  • VUID-vkCmdDispatchGraphIndirectAMDX-None-02692
    如果此命令导致使用 VK_FILTER_CUBIC_EXT 采样 VkImageView,则该图像视图的格式特性必须包含 VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT

  • VUID-vkCmdDispatchGraphIndirectAMDX-None-02693
    如果未启用 VK_EXT_filter_cubic 扩展,并且任何 VkImageView 因此命令导致使用 VK_FILTER_CUBIC_EXT 进行采样,则它必须不具有 VK_IMAGE_VIEW_TYPE_3DVK_IMAGE_VIEW_TYPE_CUBEVK_IMAGE_VIEW_TYPE_CUBE_ARRAYVkImageViewType

  • VUID-vkCmdDispatchGraphIndirectAMDX-filterCubic-02694
    任何因此命令导致使用 VK_FILTER_CUBIC_EXT 采样的 VkImageView必须具有支持立方体滤波的 VkImageViewType 和格式,如 VkFilterCubicImageViewImageFormatPropertiesEXT::filterCubic 中指定,由 vkGetPhysicalDeviceImageFormatProperties2 返回。

  • VUID-vkCmdDispatchGraphIndirectAMDX-filterCubicMinmax-02695
    任何因此命令导致使用 VK_FILTER_CUBIC_EXT 采样,且缩减模式为 VK_SAMPLER_REDUCTION_MODE_MINVK_SAMPLER_REDUCTION_MODE_MAXVkImageView必须具有支持立方体滤波以及最小值/最大值滤波的 VkImageViewType 和格式,如 VkFilterCubicImageViewImageFormatPropertiesEXT::filterCubicMinmax 中指定,由 vkGetPhysicalDeviceImageFormatProperties2 返回。

  • VUID-vkCmdDispatchGraphIndirectAMDX-cubicRangeClamp-09212
    如果未启用 cubicRangeClamp 特性,则任何因此命令导致使用 VK_FILTER_CUBIC_EXT 采样的 VkImageView必须不具有等于 VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE_RANGECLAMP_QCOMVkSamplerReductionModeCreateInfo::reductionMode

  • VUID-vkCmdDispatchGraphIndirectAMDX-reductionMode-09213
    任何因此命令导致使用等于 VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE_RANGECLAMP_QCOMVkSamplerReductionModeCreateInfo::reductionMode 采样的 VkImageView必须使用 VK_FILTER_CUBIC_EXT 进行采样。

  • VUID-vkCmdDispatchGraphIndirectAMDX-selectableCubicWeights-09214
    如果未启用 selectableCubicWeights 特性,则任何因此命令导致使用 VK_FILTER_CUBIC_EXT 采样的 VkImageView必须使 VkSamplerCubicWeightsCreateInfoQCOM::cubicWeights 等于 VK_CUBIC_FILTER_WEIGHTS_CATMULL_ROM_QCOM

  • VUID-vkCmdDispatchGraphIndirectAMDX-flags-02696
    任何使用包含 VK_IMAGE_CREATE_CORNER_SAMPLED_BIT_NVVkImageCreateInfo::flags 创建,并且因此命令采样的 VkImage必须仅使用 VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGEVkSamplerAddressMode 进行采样。

  • VUID-vkCmdDispatchGraphIndirectAMDX-OpTypeImage-07027
    对于作为存储图像写入的任何 VkImageView,如果 OpTypeImage 的图像格式字段为 Unknown,则该视图的格式特性必须包含 VK_FORMAT_FEATURE_2_STORAGE_WRITE_WITHOUT_FORMAT_BIT

  • VUID-vkCmdDispatchGraphIndirectAMDX-OpTypeImage-07028
    对于作为存储图像读取的任何 VkImageView,如果 OpTypeImage 的图像格式字段为 Unknown,则该视图的格式特性必须包含 VK_FORMAT_FEATURE_2_STORAGE_READ_WITHOUT_FORMAT_BIT

  • VUID-vkCmdDispatchGraphIndirectAMDX-OpTypeImage-07029
    对于作为存储纹理缓冲写入的任何 VkBufferView,如果 OpTypeImage 的图像格式字段为 Unknown,则该视图的缓冲特性必须包含 VK_FORMAT_FEATURE_2_STORAGE_WRITE_WITHOUT_FORMAT_BIT

  • VUID-vkCmdDispatchGraphIndirectAMDX-OpTypeImage-07030
    任何作为存储纹理缓冲读取的 VkBufferView,如果 OpTypeImage 的图像格式字段为 Unknown,则该视图的 缓冲特性必须包含 VK_FORMAT_FEATURE_2_STORAGE_READ_WITHOUT_FORMAT_BIT

  • VUID-vkCmdDispatchGraphIndirectAMDX-None-08600
    对于 绑定的着色器 静态使用的每个集合 *n*,必须在同一管线绑定点将描述符集合绑定到 *n*,并且 VkPipelineLayout 必须与集合 *n* 兼容,且 VkPipelineLayout 用于创建当前的 VkPipeline,或者 VkDescriptorSetLayout 数组用于创建当前的 VkShaderEXT,如 管线布局兼容性 中所述。

  • VUID-vkCmdDispatchGraphIndirectAMDX-None-08601
    对于 绑定的着色器 静态使用的每个推送常量,必须为相同的管线绑定点设置推送常量值,并且 VkPipelineLayout 必须与推送常量兼容,且 VkPipelineLayout 用于创建当前的 VkPipeline,或者 VkDescriptorSetLayout 数组用于创建当前的 VkShaderEXT,如 管线布局兼容性 中所述。

  • VUID-vkCmdDispatchGraphIndirectAMDX-None-10068
    对于绑定的着色器使用的每个资源数组,用于访问数组元素的索引必须小于此命令使用的描述符集中标识的绑定的描述符计数

  • VUID-vkCmdDispatchGraphIndirectAMDX-maintenance4-08602
    如果未启用maintenance4特性,则对于绑定的着色器静态使用的每个推送常量,必须已为同一管线绑定点设置推送常量值,并且其VkPipelineLayout 对于推送常量是兼容的,与用于创建当前VkPipelineVkPipelineLayout 或用于创建当前VkShaderEXTVkDescriptorSetLayoutVkPushConstantRange数组,如管线布局兼容性中所述

  • VUID-vkCmdDispatchGraphIndirectAMDX-None-08114
    通过vkCmdBindDescriptorSets指定的每个绑定描述符集中的描述符,如果它们被绑定到此命令所用管线绑定点的VkPipeline静态使用,且绑定的VkPipeline不是使用VK_PIPELINE_CREATE_DESCRIPTOR_BUFFER_BIT_EXT创建的,则必须描述符有效性中所述有效

  • VUID-vkCmdDispatchGraphIndirectAMDX-None-08115
    如果绑定到管线绑定点的VkPipeline使用的描述符是通过vkCmdBindDescriptorSets指定的,则绑定的VkPipeline必须已在没有VK_PIPELINE_CREATE_DESCRIPTOR_BUFFER_BIT_EXT的情况下创建

  • VUID-vkCmdDispatchGraphIndirectAMDX-None-08116
    通过vkCmdSetDescriptorBufferOffsetsEXT指定的绑定描述符缓冲区中的描述符,如果它们被绑定到此命令所用管线绑定点的VkPipeline动态使用,且绑定的VkPipeline是使用VK_PIPELINE_CREATE_DESCRIPTOR_BUFFER_BIT_EXT创建的,则必须有效

  • VUID-vkCmdDispatchGraphIndirectAMDX-None-08604
    如果绑定到与此命令所用管线绑定点对应的阶段的任何VkShaderEXT动态使用,通过vkCmdSetDescriptorBufferOffsetsEXT指定的绑定描述符缓冲区中的描述符,必须有效

  • VUID-vkCmdDispatchGraphIndirectAMDX-None-08117
    如果绑定到管线绑定点的VkPipeline使用的描述符是通过vkCmdSetDescriptorBufferOffsetsEXT指定的,则绑定的VkPipeline必须已使用VK_PIPELINE_CREATE_DESCRIPTOR_BUFFER_BIT_EXT创建

  • VUID-vkCmdDispatchGraphIndirectAMDX-None-08119
    如果描述符被使用VK_PIPELINE_CREATE_DESCRIPTOR_BUFFER_BIT_EXT创建的VkPipeline动态使用,则描述符内存必须驻留

  • VUID-vkCmdDispatchGraphIndirectAMDX-None-08605
    如果描述符被使用通过使用VK_DESCRIPTOR_SET_LAYOUT_CREATE_DESCRIPTOR_BUFFER_BIT_EXT创建的VkDescriptorSetLayout 创建的VkShaderEXT动态使用,则描述符内存必须驻留

  • VUID-vkCmdDispatchGraphIndirectAMDX-None-08606
    如果未启用shaderObject特性,则必须将有效的管线绑定到此命令所用的管线绑定点

  • VUID-vkCmdDispatchGraphIndirectAMDX-None-08608
    如果将管线绑定到此命令使用的管线绑定点,则自该管线绑定以来,必须没有对绑定到此命令使用的管线绑定点的VkPipeline对象中静态指定的任何状态调用动态状态设置命令

  • VUID-vkCmdDispatchGraphIndirectAMDX-None-08607
    如果启用了shaderObject特性,则必须将有效的管线绑定到此命令所用的管线绑定点,或者将有效且VK_NULL_HANDLE着色器对象的有效组合绑定到与此命令所用的管线绑定点对应的每个受支持的着色器阶段

  • VUID-vkCmdDispatchGraphIndirectAMDX-uniformBuffers-06935
    如果绑定到此命令所用的管线绑定点的VkPipeline对象的任何阶段访问统一缓冲区,且该阶段的创建未启用uniformBuffersVK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESSVK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS_2,且未启用robustBufferAccess特性,则该阶段必须不访问缓冲区范围之外的值,如绑定到同一管线绑定点的描述符集中所指定

  • VUID-vkCmdDispatchGraphIndirectAMDX-None-08612
    如果未启用robustBufferAccess特性,且绑定到与此命令所用管线绑定点对应的阶段的任何VkShaderEXT访问统一缓冲区,则它必须不访问缓冲区范围之外的值,如绑定到同一管线绑定点的描述符集中所指定

  • VUID-vkCmdDispatchGraphIndirectAMDX-storageBuffers-06936
    如果绑定到此命令所用管线绑定点的 VkPipeline 对象的任何阶段访问存储缓冲区,并且该阶段的创建未启用 storageBuffersVK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESSVK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS_2,并且未启用 robustBufferAccess 功能,则该阶段必须不访问描述符集中指定的缓冲区范围之外的值(该描述符集绑定到同一管线绑定点)。

  • VUID-vkCmdDispatchGraphIndirectAMDX-None-08613
    如果未启用 robustBufferAccess 功能,并且绑定到与此命令所用管线绑定点对应的阶段的任何 VkShaderEXT 访问存储缓冲区,则它必须不访问描述符集中指定的缓冲区范围之外的值(该描述符集绑定到同一管线绑定点)。

  • VUID-vkCmdDispatchGraphIndirectAMDX-commandBuffer-02707
    如果 commandBuffer 是一个未受保护的命令缓冲区,并且不支持 protectedNoFault,则 绑定的着色器 访问的任何资源必须不是受保护的资源。

  • VUID-vkCmdDispatchGraphIndirectAMDX-None-06550
    如果 绑定的着色器 访问启用了 采样器 Y′CBCR 转换VkSamplerVkImageView 对象,则该对象必须仅与 OpImageSample*OpImageSparseSample* 指令一起使用。

  • VUID-vkCmdDispatchGraphIndirectAMDX-ConstOffset-06551
    如果 绑定的着色器 访问启用了 采样器 Y′CBCR 转换VkSamplerVkImageView 对象,则该对象必须不使用 ConstOffsetOffset 操作数。

  • VUID-vkCmdDispatchGraphIndirectAMDX-viewType-07752
    如果此命令导致访问 VkImageView,则图像视图的 viewType 必须SPIR-V 图像维度和 Vulkan ImageView 类型之间的兼容性中所述的 OpTypeImageDim 操作数匹配。

  • VUID-vkCmdDispatchGraphIndirectAMDX-format-07753
    如果此命令导致访问 VkImageView,则图像视图的 format数值类型OpTypeImageSampled Type 操作数必须匹配。

  • VUID-vkCmdDispatchGraphIndirectAMDX-OpImageWrite-08795
    如果使用 OpImageWrite 作为此命令的结果访问以 VK_FORMAT_A8_UNORM 以外的格式创建的 VkImageView,则该指令的 Texel 操作数的 Type 必须至少具有与图像视图格式一样多的组件。

  • VUID-vkCmdDispatchGraphIndirectAMDX-OpImageWrite-08796
    如果使用 OpImageWrite 作为此命令的结果访问以 VK_FORMAT_A8_UNORM 格式创建的 VkImageView,则该指令的 Texel 操作数的 Type 必须具有四个组件。

  • VUID-vkCmdDispatchGraphIndirectAMDX-OpImageWrite-04469
    如果使用 OpImageWrite 作为此命令的结果访问 VkBufferView,则该指令的 Texel 操作数的 Type 必须至少具有与缓冲区视图格式一样多的组件。

  • VUID-vkCmdDispatchGraphIndirectAMDX-SampledType-04470
    如果此命令导致访问具有 64 位组件宽度的 VkFormatVkImageView,则该指令的 OpTypeImage 操作数的 SampledType 必须具有 64 的 Width

  • VUID-vkCmdDispatchGraphIndirectAMDX-SampledType-04471
    如果此命令导致访问具有小于 64 位组件宽度的 VkFormatVkImageView,则该指令的 OpTypeImage 操作数的 SampledType 必须具有 32 的 Width

  • VUID-vkCmdDispatchGraphIndirectAMDX-SampledType-04472
    如果此命令导致访问具有 64 位组件宽度的 VkFormatVkBufferView,则该指令的 OpTypeImage 操作数的 SampledType 必须具有 64 的 Width

  • VUID-vkCmdDispatchGraphIndirectAMDX-SampledType-04473
    如果此命令导致访问具有小于 64 位组件宽度的 VkFormatVkBufferView,则该指令的 OpTypeImage 操作数的 SampledType 必须具有 32 的 Width

  • VUID-vkCmdDispatchGraphIndirectAMDX-sparseImageInt64Atomics-04474
    如果未启用 sparseImageInt64Atomics 功能,则通过此命令,具有 VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT 标志创建的 VkImage 对象必须不通过 SampledTypeWidth 为 64 的 OpTypeImage 以原子指令访问。

  • VUID-vkCmdDispatchGraphIndirectAMDX-sparseImageInt64Atomics-04475
    如果未启用 sparseImageInt64Atomics 功能,则使用 VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT 标志创建的 VkBuffer 对象必须不能通过具有 Width 为 64 的 SampledTypeOpTypeImage,通过原子指令访问。

  • VUID-vkCmdDispatchGraphIndirectAMDX-OpImageWeightedSampleQCOM-06971
    如果使用 OpImageWeightedSampleQCOM 对此命令的结果 VkImageView 进行采样,则图像视图的格式特性必须包含 VK_FORMAT_FEATURE_2_WEIGHT_SAMPLED_IMAGE_BIT_QCOM

  • VUID-vkCmdDispatchGraphIndirectAMDX-OpImageWeightedSampleQCOM-06972
    如果 OpImageWeightedSampleQCOM 使用 VkImageView 作为此命令结果的采样权重图像,则该图像视图的格式特性必须包含 VK_FORMAT_FEATURE_2_WEIGHT_IMAGE_BIT_QCOM

  • VUID-vkCmdDispatchGraphIndirectAMDX-OpImageBoxFilterQCOM-06973
    如果使用 OpImageBoxFilterQCOM 对此命令的结果 VkImageView 进行采样,则该图像视图的格式特性必须包含 VK_FORMAT_FEATURE_2_BOX_FILTER_SAMPLED_BIT_QCOM

  • VUID-vkCmdDispatchGraphIndirectAMDX-OpImageBlockMatchSSDQCOM-06974
    如果使用 OpImageBlockMatchSSDQCOM 从此命令的结果 VkImageView 中读取,则该图像视图的格式特性必须包含 VK_FORMAT_FEATURE_2_BLOCK_MATCHING_BIT_QCOM

  • VUID-vkCmdDispatchGraphIndirectAMDX-OpImageBlockMatchSADQCOM-06975
    如果使用 OpImageBlockMatchSADQCOM 从此命令的结果 VkImageView 中读取,则该图像视图的格式特性必须包含 VK_FORMAT_FEATURE_2_BLOCK_MATCHING_BIT_QCOM

  • VUID-vkCmdDispatchGraphIndirectAMDX-OpImageBlockMatchSADQCOM-06976
    如果使用 OpImageBlockMatchSADQCOM 或 OpImageBlockMatchSSDQCOM 从此命令结果的参考图像中读取,则指定的参考坐标必须通过整数纹素坐标验证

  • VUID-vkCmdDispatchGraphIndirectAMDX-OpImageWeightedSampleQCOM-06977
    如果 OpImageWeightedSampleQCOMOpImageBoxFilterQCOMOpImageBlockMatchWindowSSDQCOMOpImageBlockMatchWindowSADQCOMOpImageBlockMatchGatherSSDQCOMOpImageBlockMatchGatherSADQCOMOpImageBlockMatchSSDQCOMOpImageBlockMatchSADQCOM 使用 VkSampler 作为此命令的结果,则该采样器必须使用 VK_SAMPLER_CREATE_IMAGE_PROCESSING_BIT_QCOM 创建。

  • VUID-vkCmdDispatchGraphIndirectAMDX-OpImageWeightedSampleQCOM-06978
    如果除 OpImageWeightedSampleQCOMOpImageBoxFilterQCOMOpImageBlockMatchWindowSSDQCOMOpImageBlockMatchWindowSADQCOMOpImageBlockMatchGatherSSDQCOMOpImageBlockMatchGatherSADQCOMOpImageBlockMatchSSDQCOMOpImageBlockMatchSADQCOM 之外的任何命令使用 VkSampler 作为此命令的结果,则该采样器必须未使用 VK_SAMPLER_CREATE_IMAGE_PROCESSING_BIT_QCOM 创建。

  • VUID-vkCmdDispatchGraphIndirectAMDX-OpImageBlockMatchWindow-09215
    如果使用 OpImageBlockMatchWindow*QCOMOpImageBlockMatchGather*QCOM 指令从此命令的结果 VkImageView 中读取,则该图像视图的格式特性必须包含 VK_FORMAT_FEATURE_2_BLOCK_MATCHING_BIT_QCOM

  • VUID-vkCmdDispatchGraphIndirectAMDX-OpImageBlockMatchWindow-09216
    如果使用 OpImageBlockMatchWindow*QCOMOpImageBlockMatchGather*QCOM 指令从此命令的结果 VkImageView 中读取,则该图像视图的格式必须是单分量格式。

  • VUID-vkCmdDispatchGraphIndirectAMDX-OpImageBlockMatchWindow-09217
    如果 OpImageBlockMatchWindow*QCOMOpImageBlockMatchGather*QCOM 从此命令结果的参考图像中读取,则指定的参考坐标必须通过整数纹素坐标验证

  • VUID-vkCmdDispatchGraphIndirectAMDX-None-07288
    此命令执行的任何着色器调用必须终止

  • VUID-vkCmdDispatchGraphIndirectAMDX-None-09600
    如果访问类型等于 VK_DESCRIPTOR_TYPE_SAMPLE_WEIGHT_IMAGE_QCOMVK_DESCRIPTOR_TYPE_BLOCK_MATCH_IMAGE_QCOMVK_DESCRIPTOR_TYPE_SAMPLED_IMAGEVK_DESCRIPTOR_TYPE_STORAGE_IMAGEVK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT 的描述符作为此命令的结果,则该描述符标识的所有图像子资源必须位于写入描述符时标识的图像布局中。

  • VUID-vkCmdDispatchGraphIndirectAMDX-commandBuffer-09181
    commandBuffer必须不是受保护的命令缓冲区。

  • VUID-vkCmdDispatchGraphIndirectAMDX-commandBuffer-09182
    commandBuffer必须是主命令缓冲区。

  • VUID-vkCmdDispatchGraphIndirectAMDX-scratch-10192
    scratch 必须 是至少与 scratchSize 一样大的已分配内存范围的设备地址

  • VUID-vkCmdDispatchGraphIndirectAMDX-scratchSize-10193
    scratchSize 必须 大于或等于 vkGetExecutionGraphPipelineScratchSizeAMDX 为绑定的执行图管线返回的 VkExecutionGraphPipelineScratchSizeAMDX::minSize

  • VUID-vkCmdDispatchGraphIndirectAMDX-scratch-09184
    scratch必须是使用 VK_BUFFER_USAGE_EXECUTION_GRAPH_SCRATCH_BIT_AMDXVK_BUFFER_USAGE_2_EXECUTION_GRAPH_SCRATCH_BIT_AMDX 标志创建的 VkBuffer 中的设备地址。

  • VUID-vkCmdDispatchGraphIndirectAMDX-scratch-10194
    设备内存范围 [scratch,scratch
    scratchSize]必须已使用 vkCmdInitializeGraphScratchMemoryAMDX 使用绑定的执行图管线初始化,并且之后没有被其他任何东西修改,除了另一个执行图分派命令。

  • VUID-vkCmdDispatchGraphIndirectAMDX-maxComputeWorkGroupCount-09186
    此命令的执行必须不会导致节点分派的工作组数量大于已分派节点中的 MaxNumWorkgroupsAMDX 装饰或 maxComputeWorkGroupCount 指定的数量。

  • VUID-vkCmdDispatchGraphIndirectAMDX-maxExecutionGraphShaderPayloadCount-09187
    执行此命令必须不会导致任何着色器初始化超过 maxExecutionGraphShaderPayloadCount 个输出负载。

  • VUID-vkCmdDispatchGraphIndirectAMDX-NodeMaxPayloadsAMDX-09188
    执行此命令必须不会导致任何声明了 NodeMaxPayloadsAMDX 的着色器初始化的输出负载数量超过该装饰的最大负载数量。 此要求分别适用于每个 NodeMaxPayloadsAMDX 装饰。

  • VUID-vkCmdDispatchGraphIndirectAMDX-None-10195
    如果绑定的执行图管线包含绘制节点,则此命令必须在与用于创建每个节点的图形管线兼容的渲染通道实例中调用。

  • VUID-vkCmdDispatchGraphIndirectAMDX-pCountInfo-09150
    当此命令在设备上执行时,pCountInfo->infos 必须是指向内存分配的设备指针,该内存分配的大小至少为 countstride 的乘积。

  • VUID-vkCmdDispatchGraphIndirectAMDX-pCountInfo-09151
    pCountInfo->infos 必须是使用 VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT 标志创建的 VkBuffer 中的设备地址。

  • VUID-vkCmdDispatchGraphIndirectAMDX-pCountInfo-09152
    pCountInfo->infos 必须 executionGraphDispatchAddressAlignment 的倍数

  • VUID-vkCmdDispatchGraphIndirectAMDX-infos-09153
    当此命令在设备上执行时,索引范围 [infos, infos + (count*stride)) 内,以 stride 为粒度的设备内存位置必须在头 24 个字节中包含有效的 VkDispatchGraphInfoAMDX 结构。

  • VUID-vkCmdDispatchGraphIndirectAMDX-pCountInfo-09154
    对于 pCountInfo->infos 中的每个 VkDispatchGraphInfoAMDX 结构,当此命令在设备上执行时,payloads 必须是一个指向至少为 payloadCountpayloadStride 的乘积大小的内存分配的设备指针。

  • VUID-vkCmdDispatchGraphIndirectAMDX-pCountInfo-09155
    对于 pCountInfo->infos 中的每个 VkDispatchGraphInfoAMDX 结构,payloads 必须是使用 VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT 标志创建的 VkBuffer 内的设备地址。

  • VUID-vkCmdDispatchGraphIndirectAMDX-pCountInfo-09156
    对于 pCountInfo->infos 中的每个 VkDispatchGraphInfoAMDX 结构,payloads 必须 executionGraphDispatchAddressAlignment 的倍数。

  • VUID-vkCmdDispatchGraphIndirectAMDX-pCountInfo-09157
    对于 pCountInfo->infos 中的每个 VkDispatchGraphInfoAMDX 结构,当此命令在设备上执行时,nodeIndex 必须是绑定执行图管线中的有效节点索引,由 vkGetExecutionGraphPipelineNodeIndexAMDX 返回。

  • VUID-vkCmdDispatchGraphIndirectAMDX-pCountInfo-09158
    对于 pCountInfo->infos 中的每个 VkDispatchGraphInfoAMDX 结构,当此命令在设备上执行时,索引范围 [payloads, payloads + (payloadCount * payloadStride)) 内,以 payloadStride 为粒度的设备内存位置必须在头几个字节中包含与 nodeIndex 中节点预期的输入有效负载大小匹配的有效负载。

有效使用(隐式)
  • VUID-vkCmdDispatchGraphIndirectAMDX-commandBuffer-parameter
    commandBuffer 必须 是有效的 VkCommandBuffer 句柄

  • VUID-vkCmdDispatchGraphIndirectAMDX-pCountInfo-parameter
    pCountInfo 必须是指向有效 VkDispatchGraphCountInfoAMDX 结构的有效指针。

  • VUID-vkCmdDispatchGraphIndirectAMDX-commandBuffer-recording
    commandBuffer 必须处于录制状态

  • VUID-vkCmdDispatchGraphIndirectAMDX-commandBuffer-cmdpool
    commandBuffer 分配自的 VkCommandPool 必须支持图形或计算操作

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

  • VUID-vkCmdDispatchGraphIndirectAMDX-bufferlevel
    commandBuffer 必须是一个主 VkCommandBuffer

主机同步
  • commandBuffer 分配自的 VkCommandPool 的主机访问必须进行外部同步

要记录所有参数都在设备上读取的执行图调度,请调用

// Provided by VK_AMDX_shader_enqueue
void vkCmdDispatchGraphIndirectCountAMDX(
    VkCommandBuffer                             commandBuffer,
    VkDeviceAddress                             scratch,
    VkDeviceSize                                scratchSize,
    VkDeviceAddress                             countInfo);
  • commandBuffer 是将记录命令的命令缓冲区。

  • scratch 是要使用的暂存内存的地址。

  • scratchSize 是要使用的暂存内存的字节范围。

  • countInfoVkDispatchGraphCountInfoAMDX 结构的设备地址,用于定义将初始执行的节点。

当此命令执行时,会执行 countInfo 中指定的节点。一旦调度,作为此命令一部分执行的节点之间不会以任何方式进行隐式同步。

对于此命令,子结构中的所有指针都将被视为设备指针,并在设备执行此命令期间读取。这些指针的分配和内容仅需要在设备执行期间有效。所有这些地址都将在 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT 管线阶段以 VK_ACCESS_2_SHADER_STORAGE_READ_BIT 访问标志读取。

执行此命令可能会修改范围 [scratch, scratch + scratchSize) 中的任何内存位置。对该内存范围的访问在具有 VK_ACCESS_2_SHADER_STORAGE_READ_BITVK_ACCESS_2_SHADER_STORAGE_WRITE_BIT 访问标志的 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT 管线阶段中执行。

有效用法
  • VUID-vkCmdDispatchGraphIndirectCountAMDX-magFilter-04553
    如果使用 magFilterminFilter 等于 VK_FILTER_LINEARreductionMode 等于 VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGEcompareEnable 等于 VK_FALSE 创建的 VkSampler 来采样 VkImageView 作为此命令的结果,则图像视图的格式特征必须包含 VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT

  • VUID-vkCmdDispatchGraphIndirectCountAMDX-magFilter-09598
    如果使用 magFilterminFilter 等于 VK_FILTER_LINEARreductionMode 等于 VK_SAMPLER_REDUCTION_MODE_MINVK_SAMPLER_REDUCTION_MODE_MAX 创建的 VkSampler 来采样 VkImageView 作为此命令的结果,则图像视图的格式特征必须包含 VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_MINMAX_BIT

  • VUID-vkCmdDispatchGraphIndirectCountAMDX-mipmapMode-04770
    如果使用 mipmapMode 等于 VK_SAMPLER_MIPMAP_MODE_LINEARreductionMode 等于 VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGEcompareEnable 等于 VK_FALSE 创建的 VkSampler 来采样 VkImageView 作为此命令的结果,则图像视图的格式特征必须包含 VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT

  • VUID-vkCmdDispatchGraphIndirectCountAMDX-mipmapMode-09599
    如果使用 mipmapMode 等于 VK_SAMPLER_MIPMAP_MODE_LINEARreductionMode 等于 VK_SAMPLER_REDUCTION_MODE_MINVK_SAMPLER_REDUCTION_MODE_MAX 创建的 VkSampler 来采样 VkImageView 作为此命令的结果,则图像视图的格式特征必须包含 VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_MINMAX_BIT

  • VUID-vkCmdDispatchGraphIndirectCountAMDX-unnormalizedCoordinates-09635
    如果使用 unnormalizedCoordinates 等于 VK_TRUE 创建的 VkSampler 来采样 VkImageView 作为此命令的结果,则图像视图的 levelCountlayerCount 必须为 1

  • VUID-vkCmdDispatchGraphIndirectCountAMDX-None-08609
    如果使用 unnormalizedCoordinates 等于 VK_TRUE 创建的 VkSampler 来采样 VkImageView 作为此命令的结果,则图像视图的 viewType 必须VK_IMAGE_VIEW_TYPE_1DVK_IMAGE_VIEW_TYPE_2D

  • VUID-vkCmdDispatchGraphIndirectCountAMDX-None-08610
    如果使用 unnormalizedCoordinates 等于 VK_TRUE 创建的 VkSampler 来采样 VkImageView 作为此命令的结果,则采样器必须不能与任何 SPIR-V OpImageSample*OpImageSparseSample* 指令一起使用,这些指令的名称中包含 ImplicitLodDrefProj

  • VUID-vkCmdDispatchGraphIndirectCountAMDX-None-08611
    如果使用 unnormalizedCoordinates 等于 VK_TRUE 创建的 VkSampler 来采样 VkImageView 作为此命令的结果,则采样器必须不能与任何包含 LOD 偏差或任何偏移值的 SPIR-V OpImageSample*OpImageSparseSample* 指令一起使用

  • VUID-vkCmdDispatchGraphIndirectCountAMDX-None-06479
    如果使用深度比较采样 VkImageView,则图像视图的格式特征必须包含 VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_DEPTH_COMPARISON_BIT

  • VUID-vkCmdDispatchGraphIndirectCountAMDX-None-02691
    如果使用原子操作访问 VkImageView 作为此命令的结果,则图像视图的格式特征必须包含 VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT

  • VUID-vkCmdDispatchGraphIndirectCountAMDX-None-07888
    如果使用原子操作访问 VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER 描述符作为此命令的结果,则存储纹理缓冲区视图的格式特征必须包含 VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT

  • VUID-vkCmdDispatchGraphIndirectCountAMDX-None-02692
    如果此命令导致使用 VK_FILTER_CUBIC_EXT 采样 VkImageView,则该图像视图的格式特性必须包含 VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT

  • VUID-vkCmdDispatchGraphIndirectCountAMDX-None-02693
    如果未启用 VK_EXT_filter_cubic 扩展,并且任何 VkImageView 因此命令导致使用 VK_FILTER_CUBIC_EXT 进行采样,则它必须不具有 VK_IMAGE_VIEW_TYPE_3DVK_IMAGE_VIEW_TYPE_CUBEVK_IMAGE_VIEW_TYPE_CUBE_ARRAYVkImageViewType

  • VUID-vkCmdDispatchGraphIndirectCountAMDX-filterCubic-02694
    任何因此命令导致使用 VK_FILTER_CUBIC_EXT 采样的 VkImageView必须具有支持立方体滤波的 VkImageViewType 和格式,如 VkFilterCubicImageViewImageFormatPropertiesEXT::filterCubic 中指定,由 vkGetPhysicalDeviceImageFormatProperties2 返回。

  • VUID-vkCmdDispatchGraphIndirectCountAMDX-filterCubicMinmax-02695
    任何因此命令导致使用 VK_FILTER_CUBIC_EXT 采样,且缩减模式为 VK_SAMPLER_REDUCTION_MODE_MINVK_SAMPLER_REDUCTION_MODE_MAXVkImageView必须具有支持立方体滤波以及最小值/最大值滤波的 VkImageViewType 和格式,如 VkFilterCubicImageViewImageFormatPropertiesEXT::filterCubicMinmax 中指定,由 vkGetPhysicalDeviceImageFormatProperties2 返回。

  • VUID-vkCmdDispatchGraphIndirectCountAMDX-cubicRangeClamp-09212
    如果未启用 cubicRangeClamp 特性,则任何因此命令导致使用 VK_FILTER_CUBIC_EXT 采样的 VkImageView必须不具有等于 VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE_RANGECLAMP_QCOMVkSamplerReductionModeCreateInfo::reductionMode

  • VUID-vkCmdDispatchGraphIndirectCountAMDX-reductionMode-09213
    任何因此命令导致使用等于 VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE_RANGECLAMP_QCOMVkSamplerReductionModeCreateInfo::reductionMode 采样的 VkImageView必须使用 VK_FILTER_CUBIC_EXT 进行采样。

  • VUID-vkCmdDispatchGraphIndirectCountAMDX-selectableCubicWeights-09214
    如果未启用 selectableCubicWeights 特性,则任何因此命令导致使用 VK_FILTER_CUBIC_EXT 采样的 VkImageView必须使 VkSamplerCubicWeightsCreateInfoQCOM::cubicWeights 等于 VK_CUBIC_FILTER_WEIGHTS_CATMULL_ROM_QCOM

  • VUID-vkCmdDispatchGraphIndirectCountAMDX-flags-02696
    任何使用包含 VK_IMAGE_CREATE_CORNER_SAMPLED_BIT_NVVkImageCreateInfo::flags 创建,并且因此命令采样的 VkImage必须仅使用 VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGEVkSamplerAddressMode 进行采样。

  • VUID-vkCmdDispatchGraphIndirectCountAMDX-OpTypeImage-07027
    对于作为存储图像写入的任何 VkImageView,如果 OpTypeImage 的图像格式字段为 Unknown,则该视图的格式特性必须包含 VK_FORMAT_FEATURE_2_STORAGE_WRITE_WITHOUT_FORMAT_BIT

  • VUID-vkCmdDispatchGraphIndirectCountAMDX-OpTypeImage-07028
    对于作为存储图像读取的任何 VkImageView,如果 OpTypeImage 的图像格式字段为 Unknown,则该视图的格式特性必须包含 VK_FORMAT_FEATURE_2_STORAGE_READ_WITHOUT_FORMAT_BIT

  • VUID-vkCmdDispatchGraphIndirectCountAMDX-OpTypeImage-07029
    对于作为存储纹理缓冲写入的任何 VkBufferView,如果 OpTypeImage 的图像格式字段为 Unknown,则该视图的缓冲特性必须包含 VK_FORMAT_FEATURE_2_STORAGE_WRITE_WITHOUT_FORMAT_BIT

  • VUID-vkCmdDispatchGraphIndirectCountAMDX-OpTypeImage-07030
    任何作为存储纹理缓冲读取的 VkBufferView,如果 OpTypeImage 的图像格式字段为 Unknown,则该视图的 缓冲特性必须包含 VK_FORMAT_FEATURE_2_STORAGE_READ_WITHOUT_FORMAT_BIT

  • VUID-vkCmdDispatchGraphIndirectCountAMDX-None-08600
    对于 绑定的着色器 静态使用的每个集合 *n*,必须在同一管线绑定点将描述符集合绑定到 *n*,并且 VkPipelineLayout 必须与集合 *n* 兼容,且 VkPipelineLayout 用于创建当前的 VkPipeline,或者 VkDescriptorSetLayout 数组用于创建当前的 VkShaderEXT,如 管线布局兼容性 中所述。

  • VUID-vkCmdDispatchGraphIndirectCountAMDX-None-08601
    对于 绑定的着色器 静态使用的每个推送常量,必须为相同的管线绑定点设置推送常量值,并且 VkPipelineLayout 必须与推送常量兼容,且 VkPipelineLayout 用于创建当前的 VkPipeline,或者 VkDescriptorSetLayout 数组用于创建当前的 VkShaderEXT,如 管线布局兼容性 中所述。

  • VUID-vkCmdDispatchGraphIndirectCountAMDX-None-10068
    对于绑定的着色器使用的每个资源数组,用于访问数组元素的索引必须小于此命令使用的描述符集中标识的绑定的描述符计数

  • VUID-vkCmdDispatchGraphIndirectCountAMDX-maintenance4-08602
    如果未启用maintenance4特性,则对于绑定的着色器静态使用的每个推送常量,必须已为同一管线绑定点设置推送常量值,并且其VkPipelineLayout 对于推送常量是兼容的,与用于创建当前VkPipelineVkPipelineLayout 或用于创建当前VkShaderEXTVkDescriptorSetLayoutVkPushConstantRange数组,如管线布局兼容性中所述

  • VUID-vkCmdDispatchGraphIndirectCountAMDX-None-08114
    通过vkCmdBindDescriptorSets指定的每个绑定描述符集中的描述符,如果它们被绑定到此命令所用管线绑定点的VkPipeline静态使用,且绑定的VkPipeline不是使用VK_PIPELINE_CREATE_DESCRIPTOR_BUFFER_BIT_EXT创建的,则必须描述符有效性中所述有效

  • VUID-vkCmdDispatchGraphIndirectCountAMDX-None-08115
    如果绑定到管线绑定点的VkPipeline使用的描述符是通过vkCmdBindDescriptorSets指定的,则绑定的VkPipeline必须已在没有VK_PIPELINE_CREATE_DESCRIPTOR_BUFFER_BIT_EXT的情况下创建

  • VUID-vkCmdDispatchGraphIndirectCountAMDX-None-08116
    通过vkCmdSetDescriptorBufferOffsetsEXT指定的绑定描述符缓冲区中的描述符,如果它们被绑定到此命令所用管线绑定点的VkPipeline动态使用,且绑定的VkPipeline是使用VK_PIPELINE_CREATE_DESCRIPTOR_BUFFER_BIT_EXT创建的,则必须有效

  • VUID-vkCmdDispatchGraphIndirectCountAMDX-None-08604
    如果绑定到与此命令所用管线绑定点对应的阶段的任何VkShaderEXT动态使用,通过vkCmdSetDescriptorBufferOffsetsEXT指定的绑定描述符缓冲区中的描述符,必须有效

  • VUID-vkCmdDispatchGraphIndirectCountAMDX-None-08117
    如果绑定到管线绑定点的VkPipeline使用的描述符是通过vkCmdSetDescriptorBufferOffsetsEXT指定的,则绑定的VkPipeline必须已使用VK_PIPELINE_CREATE_DESCRIPTOR_BUFFER_BIT_EXT创建

  • VUID-vkCmdDispatchGraphIndirectCountAMDX-None-08119
    如果描述符被使用VK_PIPELINE_CREATE_DESCRIPTOR_BUFFER_BIT_EXT创建的VkPipeline动态使用,则描述符内存必须驻留

  • VUID-vkCmdDispatchGraphIndirectCountAMDX-None-08605
    如果描述符被使用通过使用VK_DESCRIPTOR_SET_LAYOUT_CREATE_DESCRIPTOR_BUFFER_BIT_EXT创建的VkDescriptorSetLayout 创建的VkShaderEXT动态使用,则描述符内存必须驻留

  • VUID-vkCmdDispatchGraphIndirectCountAMDX-None-08606
    如果未启用shaderObject特性,则必须将有效的管线绑定到此命令所用的管线绑定点

  • VUID-vkCmdDispatchGraphIndirectCountAMDX-None-08608
    如果将管线绑定到此命令使用的管线绑定点,则自该管线绑定以来,必须没有对绑定到此命令使用的管线绑定点的VkPipeline对象中静态指定的任何状态调用动态状态设置命令

  • VUID-vkCmdDispatchGraphIndirectCountAMDX-None-08607
    如果启用了shaderObject特性,则必须将有效的管线绑定到此命令所用的管线绑定点,或者将有效且VK_NULL_HANDLE着色器对象的有效组合绑定到与此命令所用的管线绑定点对应的每个受支持的着色器阶段

  • VUID-vkCmdDispatchGraphIndirectCountAMDX-uniformBuffers-06935
    如果绑定到此命令所用的管线绑定点的VkPipeline对象的任何阶段访问统一缓冲区,且该阶段的创建未启用uniformBuffersVK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESSVK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS_2,且未启用robustBufferAccess特性,则该阶段必须不访问缓冲区范围之外的值,如绑定到同一管线绑定点的描述符集中所指定

  • VUID-vkCmdDispatchGraphIndirectCountAMDX-None-08612
    如果未启用robustBufferAccess特性,且绑定到与此命令所用管线绑定点对应的阶段的任何VkShaderEXT访问统一缓冲区,则它必须不访问缓冲区范围之外的值,如绑定到同一管线绑定点的描述符集中所指定

  • VUID-vkCmdDispatchGraphIndirectCountAMDX-storageBuffers-06936
    如果绑定到此命令所用管线绑定点的 VkPipeline 对象的任何阶段访问存储缓冲区,并且该阶段的创建未启用 storageBuffersVK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESSVK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS_2,并且未启用 robustBufferAccess 功能,则该阶段必须不访问描述符集中指定的缓冲区范围之外的值(该描述符集绑定到同一管线绑定点)。

  • VUID-vkCmdDispatchGraphIndirectCountAMDX-None-08613
    如果未启用 robustBufferAccess 功能,并且绑定到与此命令所用管线绑定点对应的阶段的任何 VkShaderEXT 访问存储缓冲区,则它必须不访问描述符集中指定的缓冲区范围之外的值(该描述符集绑定到同一管线绑定点)。

  • VUID-vkCmdDispatchGraphIndirectCountAMDX-commandBuffer-02707
    如果 commandBuffer 是一个未受保护的命令缓冲区,并且不支持 protectedNoFault,则 绑定的着色器 访问的任何资源必须不是受保护的资源。

  • VUID-vkCmdDispatchGraphIndirectCountAMDX-None-06550
    如果 绑定的着色器 访问启用了 采样器 Y′CBCR 转换VkSamplerVkImageView 对象,则该对象必须仅与 OpImageSample*OpImageSparseSample* 指令一起使用。

  • VUID-vkCmdDispatchGraphIndirectCountAMDX-ConstOffset-06551
    如果 绑定的着色器 访问启用了 采样器 Y′CBCR 转换VkSamplerVkImageView 对象,则该对象必须不使用 ConstOffsetOffset 操作数。

  • VUID-vkCmdDispatchGraphIndirectCountAMDX-viewType-07752
    如果此命令导致访问 VkImageView,则图像视图的 viewType 必须SPIR-V 图像维度和 Vulkan ImageView 类型之间的兼容性中所述的 OpTypeImageDim 操作数匹配。

  • VUID-vkCmdDispatchGraphIndirectCountAMDX-format-07753
    如果此命令导致访问 VkImageView,则图像视图的 format数值类型OpTypeImageSampled Type 操作数必须匹配。

  • VUID-vkCmdDispatchGraphIndirectCountAMDX-OpImageWrite-08795
    如果使用 OpImageWrite 作为此命令的结果访问以 VK_FORMAT_A8_UNORM 以外的格式创建的 VkImageView,则该指令的 Texel 操作数的 Type 必须至少具有与图像视图格式一样多的组件。

  • VUID-vkCmdDispatchGraphIndirectCountAMDX-OpImageWrite-08796
    如果使用 OpImageWrite 作为此命令的结果访问以 VK_FORMAT_A8_UNORM 格式创建的 VkImageView,则该指令的 Texel 操作数的 Type 必须具有四个组件。

  • VUID-vkCmdDispatchGraphIndirectCountAMDX-OpImageWrite-04469
    如果使用 OpImageWrite 作为此命令的结果访问 VkBufferView,则该指令的 Texel 操作数的 Type 必须至少具有与缓冲区视图格式一样多的组件。

  • VUID-vkCmdDispatchGraphIndirectCountAMDX-SampledType-04470
    如果此命令导致访问具有 64 位组件宽度的 VkFormatVkImageView,则该指令的 OpTypeImage 操作数的 SampledType 必须具有 64 的 Width

  • VUID-vkCmdDispatchGraphIndirectCountAMDX-SampledType-04471
    如果此命令导致访问具有小于 64 位组件宽度的 VkFormatVkImageView,则该指令的 OpTypeImage 操作数的 SampledType 必须具有 32 的 Width

  • VUID-vkCmdDispatchGraphIndirectCountAMDX-SampledType-04472
    如果此命令导致访问具有 64 位组件宽度的 VkFormatVkBufferView,则该指令的 OpTypeImage 操作数的 SampledType 必须具有 64 的 Width

  • VUID-vkCmdDispatchGraphIndirectCountAMDX-SampledType-04473
    如果此命令导致访问具有小于 64 位组件宽度的 VkFormatVkBufferView,则该指令的 OpTypeImage 操作数的 SampledType 必须具有 32 的 Width

  • VUID-vkCmdDispatchGraphIndirectCountAMDX-sparseImageInt64Atomics-04474
    如果未启用 sparseImageInt64Atomics 功能,则通过此命令,具有 VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT 标志创建的 VkImage 对象必须不通过 SampledTypeWidth 为 64 的 OpTypeImage 以原子指令访问。

  • VUID-vkCmdDispatchGraphIndirectCountAMDX-sparseImageInt64Atomics-04475
    如果未启用 sparseImageInt64Atomics 功能,则使用 VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT 标志创建的 VkBuffer 对象必须不能通过具有 Width 为 64 的 SampledTypeOpTypeImage,通过原子指令访问。

  • VUID-vkCmdDispatchGraphIndirectCountAMDX-OpImageWeightedSampleQCOM-06971
    如果使用 OpImageWeightedSampleQCOM 对此命令的结果 VkImageView 进行采样,则图像视图的格式特性必须包含 VK_FORMAT_FEATURE_2_WEIGHT_SAMPLED_IMAGE_BIT_QCOM

  • VUID-vkCmdDispatchGraphIndirectCountAMDX-OpImageWeightedSampleQCOM-06972
    如果 OpImageWeightedSampleQCOM 使用 VkImageView 作为此命令结果的采样权重图像,则该图像视图的格式特性必须包含 VK_FORMAT_FEATURE_2_WEIGHT_IMAGE_BIT_QCOM

  • VUID-vkCmdDispatchGraphIndirectCountAMDX-OpImageBoxFilterQCOM-06973
    如果使用 OpImageBoxFilterQCOM 对此命令的结果 VkImageView 进行采样,则该图像视图的格式特性必须包含 VK_FORMAT_FEATURE_2_BOX_FILTER_SAMPLED_BIT_QCOM

  • VUID-vkCmdDispatchGraphIndirectCountAMDX-OpImageBlockMatchSSDQCOM-06974
    如果使用 OpImageBlockMatchSSDQCOM 从此命令的结果 VkImageView 中读取,则该图像视图的格式特性必须包含 VK_FORMAT_FEATURE_2_BLOCK_MATCHING_BIT_QCOM

  • VUID-vkCmdDispatchGraphIndirectCountAMDX-OpImageBlockMatchSADQCOM-06975
    如果使用 OpImageBlockMatchSADQCOM 从此命令的结果 VkImageView 中读取,则该图像视图的格式特性必须包含 VK_FORMAT_FEATURE_2_BLOCK_MATCHING_BIT_QCOM

  • VUID-vkCmdDispatchGraphIndirectCountAMDX-OpImageBlockMatchSADQCOM-06976
    如果使用 OpImageBlockMatchSADQCOM 或 OpImageBlockMatchSSDQCOM 从此命令结果的参考图像中读取,则指定的参考坐标必须通过整数纹素坐标验证

  • VUID-vkCmdDispatchGraphIndirectCountAMDX-OpImageWeightedSampleQCOM-06977
    如果 OpImageWeightedSampleQCOMOpImageBoxFilterQCOMOpImageBlockMatchWindowSSDQCOMOpImageBlockMatchWindowSADQCOMOpImageBlockMatchGatherSSDQCOMOpImageBlockMatchGatherSADQCOMOpImageBlockMatchSSDQCOMOpImageBlockMatchSADQCOM 使用 VkSampler 作为此命令的结果,则该采样器必须使用 VK_SAMPLER_CREATE_IMAGE_PROCESSING_BIT_QCOM 创建。

  • VUID-vkCmdDispatchGraphIndirectCountAMDX-OpImageWeightedSampleQCOM-06978
    如果除 OpImageWeightedSampleQCOMOpImageBoxFilterQCOMOpImageBlockMatchWindowSSDQCOMOpImageBlockMatchWindowSADQCOMOpImageBlockMatchGatherSSDQCOMOpImageBlockMatchGatherSADQCOMOpImageBlockMatchSSDQCOMOpImageBlockMatchSADQCOM 之外的任何命令使用 VkSampler 作为此命令的结果,则该采样器必须未使用 VK_SAMPLER_CREATE_IMAGE_PROCESSING_BIT_QCOM 创建。

  • VUID-vkCmdDispatchGraphIndirectCountAMDX-OpImageBlockMatchWindow-09215
    如果使用 OpImageBlockMatchWindow*QCOMOpImageBlockMatchGather*QCOM 指令从此命令的结果 VkImageView 中读取,则该图像视图的格式特性必须包含 VK_FORMAT_FEATURE_2_BLOCK_MATCHING_BIT_QCOM

  • VUID-vkCmdDispatchGraphIndirectCountAMDX-OpImageBlockMatchWindow-09216
    如果使用 OpImageBlockMatchWindow*QCOMOpImageBlockMatchGather*QCOM 指令从此命令的结果 VkImageView 中读取,则该图像视图的格式必须是单分量格式。

  • VUID-vkCmdDispatchGraphIndirectCountAMDX-OpImageBlockMatchWindow-09217
    如果 OpImageBlockMatchWindow*QCOMOpImageBlockMatchGather*QCOM 从此命令结果的参考图像中读取,则指定的参考坐标必须通过整数纹素坐标验证

  • VUID-vkCmdDispatchGraphIndirectCountAMDX-None-07288
    此命令执行的任何着色器调用必须终止

  • VUID-vkCmdDispatchGraphIndirectCountAMDX-None-09600
    如果访问类型等于 VK_DESCRIPTOR_TYPE_SAMPLE_WEIGHT_IMAGE_QCOMVK_DESCRIPTOR_TYPE_BLOCK_MATCH_IMAGE_QCOMVK_DESCRIPTOR_TYPE_SAMPLED_IMAGEVK_DESCRIPTOR_TYPE_STORAGE_IMAGEVK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT 的描述符作为此命令的结果,则该描述符标识的所有图像子资源必须位于写入描述符时标识的图像布局中。

  • VUID-vkCmdDispatchGraphIndirectCountAMDX-commandBuffer-09181
    commandBuffer必须不是受保护的命令缓冲区。

  • VUID-vkCmdDispatchGraphIndirectCountAMDX-commandBuffer-09182
    commandBuffer必须是主命令缓冲区。

  • VUID-vkCmdDispatchGraphIndirectCountAMDX-scratch-10192
    scratch 必须 是至少与 scratchSize 一样大的已分配内存范围的设备地址

  • VUID-vkCmdDispatchGraphIndirectCountAMDX-scratchSize-10193
    scratchSize 必须 大于或等于 vkGetExecutionGraphPipelineScratchSizeAMDX 为绑定的执行图管线返回的 VkExecutionGraphPipelineScratchSizeAMDX::minSize

  • VUID-vkCmdDispatchGraphIndirectCountAMDX-scratch-09184
    scratch必须是使用 VK_BUFFER_USAGE_EXECUTION_GRAPH_SCRATCH_BIT_AMDXVK_BUFFER_USAGE_2_EXECUTION_GRAPH_SCRATCH_BIT_AMDX 标志创建的 VkBuffer 中的设备地址。

  • VUID-vkCmdDispatchGraphIndirectCountAMDX-scratch-10194
    设备内存范围 [scratch,scratch
    scratchSize]必须已使用 vkCmdInitializeGraphScratchMemoryAMDX 使用绑定的执行图管线初始化,并且之后没有被其他任何东西修改,除了另一个执行图分派命令。

  • VUID-vkCmdDispatchGraphIndirectCountAMDX-maxComputeWorkGroupCount-09186
    此命令的执行必须不会导致节点分派的工作组数量大于已分派节点中的 MaxNumWorkgroupsAMDX 装饰或 maxComputeWorkGroupCount 指定的数量。

  • VUID-vkCmdDispatchGraphIndirectCountAMDX-maxExecutionGraphShaderPayloadCount-09187
    执行此命令必须不会导致任何着色器初始化超过 maxExecutionGraphShaderPayloadCount 个输出负载。

  • VUID-vkCmdDispatchGraphIndirectCountAMDX-NodeMaxPayloadsAMDX-09188
    执行此命令必须不会导致任何声明了 NodeMaxPayloadsAMDX 的着色器初始化的输出负载数量超过该装饰的最大负载数量。 此要求分别适用于每个 NodeMaxPayloadsAMDX 装饰。

  • VUID-vkCmdDispatchGraphIndirectCountAMDX-None-10195
    如果绑定的执行图管线包含绘制节点,则此命令必须在与用于创建每个节点的图形管线兼容的渲染通道实例中调用。

  • VUID-vkCmdDispatchGraphIndirectCountAMDX-countInfo-09159
    当此命令在设备上执行时,countInfo 必须是指向包含有效 VkDispatchGraphCountInfoAMDX 结构的内存分配的设备指针。

  • VUID-vkCmdDispatchGraphIndirectCountAMDX-countInfo-09160
    countInfo 必须是使用 VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT 标志创建的 VkBuffer 内的设备地址。

  • VUID-vkCmdDispatchGraphIndirectCountAMDX-countInfo-09161
    countInfo 必须 executionGraphDispatchAddressAlignment 的倍数。

  • VUID-vkCmdDispatchGraphIndirectCountAMDX-countInfo-09162
    当此命令在设备上执行时,countInfo->infos 必须是指向至少与 countstride 的乘积一样大的内存分配的设备指针。

  • VUID-vkCmdDispatchGraphIndirectCountAMDX-countInfo-09163
    countInfo->infos 必须是使用 VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT 标志创建的 VkBuffer 内的设备地址。

  • VUID-vkCmdDispatchGraphIndirectCountAMDX-countInfo-09164
    countInfo->infos 必须 executionGraphDispatchAddressAlignment 的倍数。

  • VUID-vkCmdDispatchGraphIndirectCountAMDX-infos-09165
    当此命令在设备上执行时,索引范围 [infos, infos + (count*stride)) 内,以 stride 为粒度的设备内存位置必须在头 24 个字节中包含有效的 VkDispatchGraphInfoAMDX 结构。

  • VUID-vkCmdDispatchGraphIndirectCountAMDX-countInfo-09166
    对于 countInfo->infos 中的每个 VkDispatchGraphInfoAMDX 结构,当此命令在设备上执行时,payloads 必须是指向至少与 payloadCountpayloadStride 的乘积一样大的内存分配的设备指针。

  • VUID-vkCmdDispatchGraphIndirectCountAMDX-countInfo-09167
    对于 countInfo->infos 中的每个 VkDispatchGraphInfoAMDX 结构,payloads 必须是使用 VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT 标志创建的 VkBuffer 内的设备地址。

  • VUID-vkCmdDispatchGraphIndirectCountAMDX-countInfo-09168
    对于 countInfo->infos 中的每个 VkDispatchGraphInfoAMDX 结构,payloads 必须 executionGraphDispatchAddressAlignment 的倍数。

  • VUID-vkCmdDispatchGraphIndirectCountAMDX-countInfo-09169
    对于 countInfo->infos 中的每个 VkDispatchGraphInfoAMDX 结构,当此命令在设备上执行时,nodeIndex 必须是绑定执行图管线中的有效节点索引,如 vkGetExecutionGraphPipelineNodeIndexAMDX 返回的那样。

  • VUID-vkCmdDispatchGraphIndirectCountAMDX-countInfo-09170
    对于 countInfo->infos 中的每个 VkDispatchGraphInfoAMDX 结构,在范围 [payloads, payloads + (payloadCount * payloadStride)) 内,以 payloadStride 的粒度,设备内存位置 必须包含与此命令在设备上执行时,nodeIndex 中节点预期的输入有效负载大小相匹配的有效负载(在前几个字节中)。

有效使用(隐式)
  • VUID-vkCmdDispatchGraphIndirectCountAMDX-commandBuffer-parameter
    commandBuffer 必须 是有效的 VkCommandBuffer 句柄

  • VUID-vkCmdDispatchGraphIndirectCountAMDX-commandBuffer-recording
    commandBuffer 必须处于录制状态

  • VUID-vkCmdDispatchGraphIndirectCountAMDX-commandBuffer-cmdpool
    commandBuffer 分配自的 VkCommandPool 必须支持图形或计算操作

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

  • VUID-vkCmdDispatchGraphIndirectCountAMDX-bufferlevel
    commandBuffer 必须是一个主 VkCommandBuffer

主机同步
  • commandBuffer 分配自的 VkCommandPool 的主机访问必须进行外部同步

VkDeviceOrHostAddressConstAMDX 联合定义为

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

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

VkDispatchGraphCountInfoAMDX 结构定义为

// Provided by VK_AMDX_shader_enqueue
typedef struct VkDispatchGraphCountInfoAMDX {
    uint32_t                          count;
    VkDeviceOrHostAddressConstAMDX    infos;
    uint64_t                          stride;
} VkDispatchGraphCountInfoAMDX;

infos 是作为设备指针还是主机指针使用,由使用此结构的命令定义。

VkDispatchGraphInfoAMDX 结构定义为

// Provided by VK_AMDX_shader_enqueue
typedef struct VkDispatchGraphInfoAMDX {
    uint32_t                          nodeIndex;
    uint32_t                          payloadCount;
    VkDeviceOrHostAddressConstAMDX    payloads;
    uint64_t                          payloadStride;
} VkDispatchGraphInfoAMDX;
  • nodeIndex 是要分派的执行图中的节点索引。

  • payloadCount 是要为指定节点分派的有效负载的数量。

  • payloads 是指向大小等于 payloadCountpayloadStride 的乘积的有效负载平面数组的设备或主机地址指针。

  • payloadStridepayloads 中连续有效负载之间的字节步长。

payloads 是作为设备指针还是主机指针使用,取决于使用该结构的命令。

有效用法

着色器入队

执行图中的计算着色器可以使用 OpInitializeNodePayloadsAMDX 来初始化用于调度的节点。以这种方式初始化的任何节点有效负载,一旦着色器完成写入有效负载,就会被入队以进行调度。由于编译器在做出此决定时可能会比较保守,因此着色器可以进一步调用 OpFinalizeNodePayloadsAMDX 以保证不再写入有效负载。

有效负载上的 PayloadNodeNameAMDX 修饰的 Node Name 操作数标识要入队的节点的着色器名称,而 OpInitializeNodePayloadsAMDXShader Index 操作数标识着色器索引。以这种方式标识的节点将按照以下部分中的描述进行调度。

计算节点

添加到执行图中的计算着色器节点,根据是否存在 StaticNumWorkgroupsAMDXCoalescingAMDX 执行模式,执行方式会有所不同。

调度一个未声明 StaticNumWorkgroupsAMDXCoalescingAMDX 执行模式的计算着色器节点,将在每个维度中执行由有效负载的前 12 个字节指定的数量的工作组,这些字节被解释为 VkDispatchIndirectCommand。相同的有效负载将被广播到相同调度中的每个工作组。有效负载中的其他值对执行没有影响。

调度一个具有 StaticNumWorkgroupsAMDX 执行模式的计算着色器节点,将根据 StaticNumWorkgroupsAMDX 执行模式的 xyz size 操作数在每个维度中执行工作组。相同的有效负载将被广播到相同调度中的每个工作组。有效负载中的任何值对执行没有影响。

调度一个具有 CoalescingAMDX 执行模式的计算着色器节点,将入队一个单独的调用以进行执行。实现可以将多个此类调度合并到同一个工作组中,直到达到工作组的大小。可以通过 CoalescedInputCountAMDX 内置变量查询以此方式合并到给定工作组中的调用次数。有效负载中的任何值对执行没有影响。

网格节点

添加到执行图中的图形管线以类似于 vkCmdDrawMeshTasksIndirectEXT 的方式执行,使用与计算着色器相同的有效负载,但会从命令缓冲区捕获一些状态。

当执行图调度记录到命令缓冲区中时,它会捕获以下动态状态,以用于绘制节点

  • VK_DYNAMIC_STATE_VIEWPORT

  • VK_DYNAMIC_STATE_SCISSOR

  • VK_DYNAMIC_STATE_LINE_WIDTH

  • VK_DYNAMIC_STATE_DEPTH_BIAS

  • VK_DYNAMIC_STATE_BLEND_CONSTANTS

  • VK_DYNAMIC_STATE_DEPTH_BOUNDS

  • VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT

  • VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT

  • VK_DYNAMIC_STATE_FRAGMENT_SHADING_RATE_KHR

其他状态不会被捕获,并且当在执行图管线中用作库时,必须不能使用其他动态状态创建图形管线。