设备生成的命令

本章讨论在设备上生成命令缓冲区内容,为此需要采取以下主要步骤

  • 定义描述应生成的命令序列的布局。

  • (可选)设置设备可绑定的着色器。

  • 通过 vkGetBufferDeviceAddressEXT 检索设备地址,以便在设备上设置缓冲区。

  • 使用由命令布局解释的适当内容填充一个或多个 VkBuffer

  • 使用设备查询的分配信息创建 preprocess VkBuffer

  • (可选)在单独的操作中预处理输入数据。

  • 生成并执行实际命令。

预处理步骤在与图形或计算不同的单独逻辑管道中执行。当在单独的步骤中预处理命令时,必须 显式地与命令执行同步。当不在单独的步骤中预处理时,预处理会自动与命令执行同步。

间接命令布局

设备端命令生成通过原子序列的迭代处理发生,原子序列由命令令牌组成,命令令牌由

// Provided by VK_EXT_device_generated_commands
VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkIndirectCommandsLayoutEXT)

// Provided by VK_NV_device_generated_commands
VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkIndirectCommandsLayoutNV)

每个间接命令布局必须恰好有一个操作命令令牌,并且它必须是序列中的最后一个令牌。

如果间接命令布局仅包含 1 个令牌,它将是一个操作命令令牌,并且间接缓冲区的内容将是一个间接命令结构序列,类似于用于间接绘制和分派的那些。在某些实现中,对于这些情况使用间接绘制和分派将比使用设备生成的命令产生更高的性能,因为后者会导致开销。

创建和删除

用于 VK_EXT_device_generated_commands 的间接命令布局是通过

// Provided by VK_EXT_device_generated_commands
VkResult vkCreateIndirectCommandsLayoutEXT(
    VkDevice                                    device,
    const VkIndirectCommandsLayoutCreateInfoEXT* pCreateInfo,
    const VkAllocationCallbacks*                pAllocator,
    VkIndirectCommandsLayoutEXT*                pIndirectCommandsLayout);
  • device 是创建间接命令布局的逻辑设备。

  • pCreateInfo 是指向 VkIndirectCommandsLayoutCreateInfoEXT 结构的指针,该结构包含影响间接命令布局创建的参数。

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

  • pIndirectCommandsLayout 是指向 VkIndirectCommandsLayoutEXT 句柄的指针,在该句柄中返回生成的间接命令布局。

有效用法
有效用法(隐式)
  • VUID-vkCreateIndirectCommandsLayoutEXT-device-parameter
    device 必须是有效的 VkDevice 句柄

  • VUID-vkCreateIndirectCommandsLayoutEXT-pCreateInfo-parameter
    pCreateInfo 必须是指向有效 VkIndirectCommandsLayoutCreateInfoEXT 结构的有效指针

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

  • VUID-vkCreateIndirectCommandsLayoutEXT-pIndirectCommandsLayout-parameter
    pIndirectCommandsLayout 必须是指向 VkIndirectCommandsLayoutEXT 句柄的有效指针

返回码
成功
  • VK_SUCCESS

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_OUT_OF_DEVICE_MEMORY

VkIndirectCommandsLayoutCreateInfoEXT 结构定义为

// Provided by VK_EXT_device_generated_commands
typedef struct VkIndirectCommandsLayoutCreateInfoEXT {
    VkStructureType                            sType;
    const void*                                pNext;
    VkIndirectCommandsLayoutUsageFlagsEXT      flags;
    VkShaderStageFlags                         shaderStages;
    uint32_t                                   indirectStride;
    VkPipelineLayout                           pipelineLayout;
    uint32_t                                   tokenCount;
    const VkIndirectCommandsLayoutTokenEXT*    pTokens;
} VkIndirectCommandsLayoutCreateInfoEXT;

以下代码说明了一些标志

void cmdProcessAllSequences(cmd, indirectExecutionSet, indirectCommandsLayout, indirectAddress, sequencesCount)
{
  for (s = 0; s < sequencesCount; s++)
  {
    sUsed = s;

    if (indirectCommandsLayout.flags & VK_INDIRECT_COMMANDS_LAYOUT_USAGE_UNORDERED_SEQUENCES_BIT_EXT) {
      sUsed = incoherent_implementation_dependent_permutation[ sUsed ];
    }

    cmdProcessSequence( cmd, indirectExecutionSet, indirectCommandsLayout, indirectAddress, sUsed );
  }
}

当 token 被使用时,会基于 token 偏移量和流步长计算一个偏移量。计算出的偏移量必须是对齐的。特定 token 的对齐方式等于 对齐要求中定义的数据类型的标量对齐方式,或者 4,取两者中较小的值。

有效用法
  • VUID-VkIndirectCommandsLayoutCreateInfoEXT-indirectStride-11090
    indirectStride 必须小于或等于 VkPhysicalDeviceDeviceGeneratedCommandsPropertiesEXT::maxIndirectCommandsIndirectStride

  • VUID-VkIndirectCommandsLayoutCreateInfoEXT-shaderStages-11091
    shaderStages 必须仅包含 VkPhysicalDeviceDeviceGeneratedCommandsPropertiesEXT::supportedIndirectCommandsShaderStages 支持的阶段

  • VUID-VkIndirectCommandsLayoutCreateInfoEXT-tokenCount-11092
    tokenCount 必须小于或等于 VkPhysicalDeviceDeviceGeneratedCommandsPropertiesEXT::maxIndirectCommandsTokenCount

  • VUID-VkIndirectCommandsLayoutCreateInfoEXT-pTokens-11093
    pTokens 数组中,type 等于 VK_INDIRECT_COMMANDS_TOKEN_TYPE_EXECUTION_SET_EXT 的 token 数量必须小于或等于 1

  • VUID-VkIndirectCommandsLayoutCreateInfoEXT-pTokens-11145
    pTokens 数组中,type 等于 VK_INDIRECT_COMMANDS_TOKEN_TYPE_SEQUENCE_INDEX_EXT 的 token 数量必须小于或等于 1

  • VUID-VkIndirectCommandsLayoutCreateInfoEXT-pTokens-11094
    pTokens 数组中,type 等于 VK_INDIRECT_COMMANDS_TOKEN_TYPE_INDEX_BUFFER_EXT 的 token 数量必须小于或等于 1

  • VUID-VkIndirectCommandsLayoutCreateInfoEXT-pTokens-11095
    如果 pTokens 数组中的动作命令 token 不是索引绘制 token,则 pTokens 必须不包含 type 设置为 VK_INDIRECT_COMMANDS_TOKEN_TYPE_INDEX_BUFFER_EXT 的成员

  • VUID-VkIndirectCommandsLayoutCreateInfoEXT-pTokens-11096
    如果 pTokens 数组中的动作命令 token 不是非网格绘制 token,则 pTokens 必须不包含 type 设置为 VK_INDIRECT_COMMANDS_TOKEN_TYPE_VERTEX_BUFFER_EXT 的成员

  • VUID-VkIndirectCommandsLayoutCreateInfoEXT-pTokens-11097
    如果 pTokens 数组包含多个 type 等于 VK_INDIRECT_COMMANDS_TOKEN_TYPE_VERTEX_BUFFER_EXT 的 token,则必须没有重复的 VkIndirectCommandsVertexBufferTokenEXT::vertexBindingUnit

  • VUID-VkIndirectCommandsLayoutCreateInfoEXT-pTokens-11099
    对于 pTokens 中的所有 VK_INDIRECT_COMMANDS_TOKEN_TYPE_PUSH_CONSTANT_EXTVK_INDIRECT_COMMANDS_TOKEN_TYPE_SEQUENCE_INDEX_EXT 类型 token,任何指定的 push constant 范围之间都必须没有重叠

  • VUID-VkIndirectCommandsLayoutCreateInfoEXT-pTokens-11100
    动作命令 token 必须pTokens 数组中的最后一个 token

  • VUID-VkIndirectCommandsLayoutCreateInfoEXT-pTokens-11139
    如果 pTokens 数组包含 VK_INDIRECT_COMMANDS_TOKEN_TYPE_EXECUTION_SET_EXT token,则该 token 必须是数组中的第一个 token

  • VUID-VkIndirectCommandsLayoutCreateInfoEXT-pTokens-11101
    对于 pTokens 的任何元素,如果 typeVK_INDIRECT_COMMANDS_TOKEN_TYPE_PUSH_CONSTANT_EXTVK_INDIRECT_COMMANDS_TOKEN_TYPE_SEQUENCE_INDEX_EXT,并且未启用 dynamicGeneratedPipelineLayout 功能,则 pipelineLayout 必须不是 VK_NULL_HANDLE

  • VUID-VkIndirectCommandsLayoutCreateInfoEXT-pTokens-11102
    对于 pTokens 的任何元素,如果 typeVK_INDIRECT_COMMANDS_TOKEN_TYPE_PUSH_CONSTANT_EXTVK_INDIRECT_COMMANDS_TOKEN_TYPE_SEQUENCE_INDEX_EXT,并且 pipelineLayoutVK_NULL_HANDLE,则 pNext必须包含一个 VkPipelineLayoutCreateInfo 结构体

  • VUID-VkIndirectCommandsLayoutCreateInfoEXT-pTokens-11103
    对于 pTokens 的任何元素,offset 必须大于或等于先前 token 的 offset 成员

  • VUID-VkIndirectCommandsLayoutCreateInfoEXT-pTokens-11104
    对于 pTokens 的任何元素,如果 typeVK_INDIRECT_COMMANDS_TOKEN_TYPE_INDEX_BUFFER_EXTVK_INDIRECT_COMMANDS_TOKEN_TYPE_VERTEX_BUFFER_EXTVK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_MESH_TASKS_EXTVK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_MESH_TASKS_COUNT_EXTVK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_MESH_TASKS_NV_EXTVK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_MESH_TASKS_COUNT_NV_EXTVK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_INDEXED_COUNT_EXTVK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_INDEXED_EXTVK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_EXT,则 shaderStages 必须包含图形阶段

  • VUID-VkIndirectCommandsLayoutCreateInfoEXT-pTokens-11105
    对于 pTokens 的任何元素,如果 typeVK_INDIRECT_COMMANDS_TOKEN_TYPE_DISPATCH_EXT,则 shaderStages 必须VK_SHADER_STAGE_COMPUTE_BIT

  • VUID-VkIndirectCommandsLayoutCreateInfoEXT-pTokens-11106
    对于 pTokens 的任何元素,如果 typeVK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_MESH_TASKS_EXTVK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_MESH_TASKS_COUNT_EXT,则 shaderStages 必须包含 VK_SHADER_STAGE_MESH_BIT_EXT

  • VUID-VkIndirectCommandsLayoutCreateInfoEXT-pTokens-11107
    对于 pTokens 的任何元素,如果 typeVK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_MESH_TASKS_NV_EXTVK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_MESH_TASKS_COUNT_NV_EXT,则 shaderStages **必须** 包含 VK_SHADER_STAGE_MESH_BIT_NV

  • VUID-VkIndirectCommandsLayoutCreateInfoEXT-pTokens-11108
    对于 pTokens 的任何元素,如果 typeVK_INDIRECT_COMMANDS_TOKEN_TYPE_TRACE_RAYS2_EXT,则 shaderStages **必须** 包含光线追踪阶段。

  • VUID-VkIndirectCommandsLayoutCreateInfoEXT-shaderStages-11109
    如果 shaderStages 包含图形阶段,则 pTokens 中的状态令牌**必须**不包括 VK_INDIRECT_COMMANDS_TOKEN_TYPE_TRACE_RAYS2_EXTVK_INDIRECT_COMMANDS_TOKEN_TYPE_DISPATCH_EXT

  • VUID-VkIndirectCommandsLayoutCreateInfoEXT-shaderStages-11110
    如果 shaderStagesVK_SHADER_STAGE_COMPUTE_BIT,则 pTokens 中的状态令牌**必须**仅包括 VK_INDIRECT_COMMANDS_TOKEN_TYPE_DISPATCH_EXTVK_INDIRECT_COMMANDS_TOKEN_TYPE_EXECUTION_SET_EXTVK_INDIRECT_COMMANDS_TOKEN_TYPE_PUSH_CONSTANT_EXTVK_INDIRECT_COMMANDS_TOKEN_TYPE_SEQUENCE_INDEX_EXT

  • VUID-VkIndirectCommandsLayoutCreateInfoEXT-shaderStages-11111
    如果 shaderStages 包含光线追踪阶段,则 pTokens 中的状态令牌**必须**仅包括 VK_INDIRECT_COMMANDS_TOKEN_TYPE_TRACE_RAYS2_EXTVK_INDIRECT_COMMANDS_TOKEN_TYPE_EXECUTION_SET_EXTVK_INDIRECT_COMMANDS_TOKEN_TYPE_PUSH_CONSTANT_EXTVK_INDIRECT_COMMANDS_TOKEN_TYPE_SEQUENCE_INDEX_EXT

  • VUID-VkIndirectCommandsLayoutCreateInfoEXT-shaderStages-11112
    shaderStages **必须**仅包含以下其中一个阶段:

    • 图形阶段

    • VK_SHADER_STAGE_COMPUTE_BIT

    • 网格阶段和 VK_SHADER_STAGE_FRAGMENT_BIT

    • 光线追踪阶段

  • VUID-VkIndirectCommandsLayoutCreateInfoEXT-shaderStages-11113
    如果 shaderStages 包含 VK_SHADER_STAGE_FRAGMENT_BIT,则 shaderStages **必须** 也包含 VK_SHADER_STAGE_VERTEX_BITVK_SHADER_STAGE_MESH_BIT_EXT

有效用法(隐式)
  • VUID-VkIndirectCommandsLayoutCreateInfoEXT-sType-sType
    sType **必须** 是 VK_STRUCTURE_TYPE_INDIRECT_COMMANDS_LAYOUT_CREATE_INFO_EXT

  • VUID-VkIndirectCommandsLayoutCreateInfoEXT-pNext-pNext
    pNext **必须** 是 NULL 或指向 VkPipelineLayoutCreateInfo 的有效实例的指针。

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

  • VUID-VkIndirectCommandsLayoutCreateInfoEXT-flags-parameter
    flags **必须**是 VkIndirectCommandsLayoutUsageFlagBitsEXT 值的有效组合。

  • VUID-VkIndirectCommandsLayoutCreateInfoEXT-shaderStages-parameter
    shaderStages **必须**是 VkShaderStageFlagBits 值的有效组合。

  • VUID-VkIndirectCommandsLayoutCreateInfoEXT-shaderStages-requiredbitmask
    shaderStages **必须**不能为 0

  • VUID-VkIndirectCommandsLayoutCreateInfoEXT-pipelineLayout-parameter
    如果 pipelineLayout 不是 VK_NULL_HANDLE,则 pipelineLayout **必须**是有效的 VkPipelineLayout 句柄。

  • VUID-VkIndirectCommandsLayoutCreateInfoEXT-pTokens-parameter
    pTokens **必须**是指向 tokenCount 个有效 VkIndirectCommandsLayoutTokenEXT 结构体的数组的有效指针。

  • VUID-VkIndirectCommandsLayoutCreateInfoEXT-tokenCount-arraylength
    tokenCount **必须**大于 0

VkIndirectCommandsLayoutCreateInfoEXT::flags 中**可以**设置的位,用于指定间接命令布局的使用提示,包括:

// Provided by VK_EXT_device_generated_commands
typedef enum VkIndirectCommandsLayoutUsageFlagBitsEXT {
    VK_INDIRECT_COMMANDS_LAYOUT_USAGE_EXPLICIT_PREPROCESS_BIT_EXT = 0x00000001,
    VK_INDIRECT_COMMANDS_LAYOUT_USAGE_UNORDERED_SEQUENCES_BIT_EXT = 0x00000002,
} VkIndirectCommandsLayoutUsageFlagBitsEXT;
  • VK_INDIRECT_COMMANDS_LAYOUT_USAGE_EXPLICIT_PREPROCESS_BIT_EXT 指定该布局始终与通过调用 vkCmdPreprocessGeneratedCommandsEXT 手动预处理步骤一起使用,并通过 vkCmdExecuteGeneratedCommandsEXT 执行,且 isPreprocessed 设置为 VK_TRUE

  • VK_INDIRECT_COMMANDS_LAYOUT_USAGE_UNORDERED_SEQUENCES_BIT_EXT 指定序列的处理将以依赖于实现的顺序进行,该顺序不能保证在使用相同输入数据时是确定性的。当 shaderStagesVK_SHADER_STAGE_COMPUTE_BIT 时,此标志将被忽略,因为它暗示调度序列始终是无序的。

// Provided by VK_EXT_device_generated_commands
typedef VkFlags VkIndirectCommandsLayoutUsageFlagsEXT;

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

VK_EXT_device_generated_commands 的间接命令布局通过以下方式销毁:

// Provided by VK_EXT_device_generated_commands
void vkDestroyIndirectCommandsLayoutEXT(
    VkDevice                                    device,
    VkIndirectCommandsLayoutEXT                 indirectCommandsLayout,
    const VkAllocationCallbacks*                pAllocator);
  • device 是销毁布局的逻辑设备。

  • indirectCommandsLayout 是要销毁的布局。

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

有效用法
  • VUID-vkDestroyIndirectCommandsLayoutEXT-indirectCommandsLayout-11114
    所有引用 indirectCommandsLayout 的已提交命令**必须**已完成执行。

  • VUID-vkDestroyIndirectCommandsLayoutEXT-indirectCommandsLayout-11115
    如果在创建 indirectCommandsLayout 时提供了 VkAllocationCallbacks,则此处**必须**提供一组兼容的回调。

  • VUID-vkDestroyIndirectCommandsLayoutEXT-indirectCommandsLayout-11116
    如果在创建 indirectCommandsLayout 时未提供 VkAllocationCallbacks,则 pAllocator **必须**为 NULL

有效用法(隐式)
  • VUID-vkDestroyIndirectCommandsLayoutEXT-device-parameter
    device 必须是有效的 VkDevice 句柄

  • VUID-vkDestroyIndirectCommandsLayoutEXT-indirectCommandsLayout-parameter
    如果 indirectCommandsLayout 不是 VK_NULL_HANDLE,则 indirectCommandsLayout **必须**是有效的 VkIndirectCommandsLayoutEXT 句柄。

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

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

主机同步
  • indirectCommandsLayout 的主机访问**必须**进行外部同步。

VK_NV_device_generated_commands 的间接命令布局通过以下方式创建:

// Provided by VK_NV_device_generated_commands
VkResult vkCreateIndirectCommandsLayoutNV(
    VkDevice                                    device,
    const VkIndirectCommandsLayoutCreateInfoNV* pCreateInfo,
    const VkAllocationCallbacks*                pAllocator,
    VkIndirectCommandsLayoutNV*                 pIndirectCommandsLayout);
  • device 是创建间接命令布局的逻辑设备。

  • pCreateInfo 是指向 VkIndirectCommandsLayoutCreateInfoNV 结构的指针,其中包含影响间接命令布局创建的参数。

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

  • pIndirectCommandsLayout 是指向 VkIndirectCommandsLayoutNV 句柄的指针,其中返回生成的间接命令布局。

有效用法
有效用法(隐式)
  • VUID-vkCreateIndirectCommandsLayoutNV-device-parameter
    device 必须是有效的 VkDevice 句柄

  • VUID-vkCreateIndirectCommandsLayoutNV-pCreateInfo-parameter
    pCreateInfo 必须 是指向有效的 VkIndirectCommandsLayoutCreateInfoNV 结构的有效指针。

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

  • VUID-vkCreateIndirectCommandsLayoutNV-pIndirectCommandsLayout-parameter
    pIndirectCommandsLayout 必须 是指向 VkIndirectCommandsLayoutNV 句柄的有效指针。

返回码
成功
  • VK_SUCCESS

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_OUT_OF_DEVICE_MEMORY

VkIndirectCommandsLayoutCreateInfoNV 结构定义如下:

// Provided by VK_NV_device_generated_commands
typedef struct VkIndirectCommandsLayoutCreateInfoNV {
    VkStructureType                           sType;
    const void*                               pNext;
    VkIndirectCommandsLayoutUsageFlagsNV      flags;
    VkPipelineBindPoint                       pipelineBindPoint;
    uint32_t                                  tokenCount;
    const VkIndirectCommandsLayoutTokenNV*    pTokens;
    uint32_t                                  streamCount;
    const uint32_t*                           pStreamStrides;
} VkIndirectCommandsLayoutCreateInfoNV;

以下代码说明了一些标志

void cmdProcessAllSequences(cmd, pipeline, indirectCommandsLayout, pIndirectCommandsTokens, sequencesCount, indexbuffer, indexbufferOffset)
{
  for (s = 0; s < sequencesCount; s++)
  {
    sUsed = s;

    if (indirectCommandsLayout.flags & VK_INDIRECT_COMMANDS_LAYOUT_USAGE_INDEXED_SEQUENCES_BIT_NV) {
      sUsed = indexbuffer.load_uint32( sUsed * sizeof(uint32_t) + indexbufferOffset);
    }

    if (indirectCommandsLayout.flags & VK_INDIRECT_COMMANDS_LAYOUT_USAGE_UNORDERED_SEQUENCES_BIT_NV) {
      sUsed = incoherent_implementation_dependent_permutation[ sUsed ];
    }

    cmdProcessSequence( cmd, pipeline, indirectCommandsLayout, pIndirectCommandsTokens, sUsed );
  }
}

当令牌被消耗时,会基于令牌偏移和流步幅计算偏移量。生成的偏移量必须是对齐的。特定令牌的对齐方式等于 对齐要求 中定义的数据类型的标量对齐,或 VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV::minIndirectCommandsBufferOffsetAlignment,以较小者为准。

minIndirectCommandsBufferOffsetAlignment 为 4 允许将 VkDeviceAddress 打包为具有标量布局的 uvec2,而不是具有 8 字节对齐的 uint64_t。这使得与 D3D12 命令签名布局直接兼容。

有效用法
  • VUID-VkIndirectCommandsLayoutCreateInfoNV-pipelineBindPoint-02930
    pipelineBindPoint 必须VK_PIPELINE_BIND_POINT_GRAPHICSVK_PIPELINE_BIND_POINT_COMPUTE

  • VUID-VkIndirectCommandsLayoutCreateInfoNV-tokenCount-02931
    tokenCount 必须 大于 0 且小于或等于 VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV::maxIndirectCommandsTokenCount

  • VUID-VkIndirectCommandsLayoutCreateInfoNV-pTokens-02932
    如果 pTokens 包含 VK_INDIRECT_COMMANDS_TOKEN_TYPE_SHADER_GROUP_NV 的条目,它必须是数组的第一个元素,并且必须只有一个这种类型的元素。

  • VUID-VkIndirectCommandsLayoutCreateInfoNV-pTokens-09585
    如果 pTokens 包含 VK_INDIRECT_COMMANDS_TOKEN_TYPE_PIPELINE_NV 的条目,它必须是数组的第一个元素,并且必须只有一个这种类型的元素。

  • VUID-VkIndirectCommandsLayoutCreateInfoNV-pTokens-02933
    如果 pTokens 包含 VK_INDIRECT_COMMANDS_TOKEN_TYPE_STATE_FLAGS_NV 的条目,则必须只有一个这种类型的元素。

  • VUID-VkIndirectCommandsLayoutCreateInfoNV-pTokens-02934
    pTokens 中的所有状态令牌必须出现在任何操作命令令牌(VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_NVVK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_INDEXED_NVVK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_TASKS_NVVK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_MESH_TASKS_NVVK_INDIRECT_COMMANDS_TOKEN_TYPE_DISPATCH_NV)之前。

  • VUID-VkIndirectCommandsLayoutCreateInfoNV-pTokens-02935
    pTokens 的内容必须包括一个与 pipelineBindPoint 兼容的单一操作命令令牌。

  • VUID-VkIndirectCommandsLayoutCreateInfoNV-streamCount-02936
    streamCount 必须 大于 0 且小于或等于 VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV::maxIndirectCommandsStreamCount

  • VUID-VkIndirectCommandsLayoutCreateInfoNV-pStreamStrides-02937
    pStreamStrides 的每个元素必须 大于 0 且小于或等于 VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV::maxIndirectCommandsStreamStride。此外,必须确保每个令牌输入的对齐。

  • VUID-VkIndirectCommandsLayoutCreateInfoNV-pipelineBindPoint-09088
    如果 pipelineBindPointVK_PIPELINE_BIND_POINT_COMPUTE,则必须启用 VkPhysicalDeviceDeviceGeneratedCommandsComputeFeaturesNV::deviceGeneratedCompute 功能。

  • VUID-VkIndirectCommandsLayoutCreateInfoNV-pipelineBindPoint-09089
    如果 pipelineBindPointVK_PIPELINE_BIND_POINT_COMPUTE,则 pTokens 中的状态令牌必须仅包括 VK_INDIRECT_COMMANDS_TOKEN_TYPE_DISPATCH_NVVK_INDIRECT_COMMANDS_TOKEN_TYPE_PIPELINE_NVVK_INDIRECT_COMMANDS_TOKEN_TYPE_PUSH_CONSTANT_NV

  • VUID-VkIndirectCommandsLayoutCreateInfoNV-pipelineBindPoint-09090
    如果 pipelineBindPointVK_PIPELINE_BIND_POINT_COMPUTEpTokens 包括 VK_INDIRECT_COMMANDS_TOKEN_TYPE_PIPELINE_NV,则必须启用 VkPhysicalDeviceDeviceGeneratedCommandsComputeFeaturesNV::deviceGeneratedComputePipelines 功能。

有效用法(隐式)
  • VUID-VkIndirectCommandsLayoutCreateInfoNV-sType-sType
    sType 必须VK_STRUCTURE_TYPE_INDIRECT_COMMANDS_LAYOUT_CREATE_INFO_NV

  • VUID-VkIndirectCommandsLayoutCreateInfoNV-pNext-pNext
    pNext 必须NULL

  • VUID-VkIndirectCommandsLayoutCreateInfoNV-flags-parameter
    flags 必须VkIndirectCommandsLayoutUsageFlagBitsNV 值的有效组合。

  • VUID-VkIndirectCommandsLayoutCreateInfoNV-pipelineBindPoint-parameter
    pipelineBindPoint 必须 是有效的 VkPipelineBindPoint 值。

  • VUID-VkIndirectCommandsLayoutCreateInfoNV-pTokens-parameter
    pTokens 必须是一个指向 tokenCount 个有效 VkIndirectCommandsLayoutTokenNV 结构体数组的有效指针。

  • VUID-VkIndirectCommandsLayoutCreateInfoNV-pStreamStrides-parameter
    pStreamStrides 必须是一个指向 streamCountuint32_t 值的数组的有效指针。

  • VUID-VkIndirectCommandsLayoutCreateInfoNV-tokenCount-arraylength
    tokenCount **必须**大于 0

  • VUID-VkIndirectCommandsLayoutCreateInfoNV-streamCount-arraylength
    streamCount 必须大于 0

VkIndirectCommandsLayoutCreateInfoNV::flags可以设置的位,指定间接命令布局的使用提示,包括:

// Provided by VK_NV_device_generated_commands
typedef enum VkIndirectCommandsLayoutUsageFlagBitsNV {
    VK_INDIRECT_COMMANDS_LAYOUT_USAGE_EXPLICIT_PREPROCESS_BIT_NV = 0x00000001,
    VK_INDIRECT_COMMANDS_LAYOUT_USAGE_INDEXED_SEQUENCES_BIT_NV = 0x00000002,
    VK_INDIRECT_COMMANDS_LAYOUT_USAGE_UNORDERED_SEQUENCES_BIT_NV = 0x00000004,
} VkIndirectCommandsLayoutUsageFlagBitsNV;
  • VK_INDIRECT_COMMANDS_LAYOUT_USAGE_EXPLICIT_PREPROCESS_BIT_NV 指定该布局始终通过调用 vkCmdPreprocessGeneratedCommandsNV 进行手动预处理步骤,并通过 vkCmdExecuteGeneratedCommandsNV 执行,且 isPreprocessed 设置为 VK_TRUE

  • VK_INDIRECT_COMMANDS_LAYOUT_USAGE_INDEXED_SEQUENCES_BIT_NV 指定序列的输入数据不是从 0..sequencesUsed 隐式索引,而是提供应用程序提供的 VkBuffer 来编码索引。

  • VK_INDIRECT_COMMANDS_LAYOUT_USAGE_UNORDERED_SEQUENCES_BIT_NV 指定序列的处理可以以依赖于实现的顺序发生,不能保证使用相同输入数据时的一致性。当 pipelineBindPointVK_PIPELINE_BIND_POINT_COMPUTE 时,此标志将被忽略,因为这意味着调度序列始终是无序的。

// Provided by VK_NV_device_generated_commands
typedef VkFlags VkIndirectCommandsLayoutUsageFlagsNV;

VkIndirectCommandsLayoutUsageFlagsNV 是一种位掩码类型,用于设置零个或多个 VkIndirectCommandsLayoutUsageFlagBitsNV 的掩码。

用于 VK_NV_device_generated_commands 的间接命令布局通过以下方式销毁:

// Provided by VK_NV_device_generated_commands
void vkDestroyIndirectCommandsLayoutNV(
    VkDevice                                    device,
    VkIndirectCommandsLayoutNV                  indirectCommandsLayout,
    const VkAllocationCallbacks*                pAllocator);
  • device 是销毁布局的逻辑设备。

  • indirectCommandsLayout 是要销毁的布局。

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

有效用法
  • VUID-vkDestroyIndirectCommandsLayoutNV-indirectCommandsLayout-02938
    所有引用 indirectCommandsLayout 的已提交命令**必须**已完成执行。

  • VUID-vkDestroyIndirectCommandsLayoutNV-indirectCommandsLayout-02939
    如果在创建 indirectCommandsLayout 时提供了 VkAllocationCallbacks,则此处**必须**提供一组兼容的回调。

  • VUID-vkDestroyIndirectCommandsLayoutNV-indirectCommandsLayout-02940
    如果在创建 indirectCommandsLayout 时未提供 VkAllocationCallbacks,则 pAllocator **必须**为 NULL

  • VUID-vkDestroyIndirectCommandsLayoutNV-deviceGeneratedCommands-02941
    必须启用 VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV::deviceGeneratedCommands 功能。

有效用法(隐式)
  • VUID-vkDestroyIndirectCommandsLayoutNV-device-parameter
    device 必须是有效的 VkDevice 句柄

  • VUID-vkDestroyIndirectCommandsLayoutNV-indirectCommandsLayout-parameter
    如果 indirectCommandsLayout 不是 VK_NULL_HANDLE,则 indirectCommandsLayout 必须是一个有效的 VkIndirectCommandsLayoutNV 句柄。

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

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

主机同步
  • indirectCommandsLayout 的主机访问**必须**进行外部同步。

令牌输入流

对于 VK_EXT_device_generated_commands,输入流可以包含原始 uint32_t 值,现有的间接命令,例如:

或如下所列的其他命令。数据如何使用将在下一节中描述。

VkBindIndexBufferIndirectCommandEXT 结构体指定 VK_INDIRECT_COMMANDS_TOKEN_TYPE_INDEX_BUFFER_EXT 令牌的输入数据。

// Provided by VK_EXT_device_generated_commands
typedef struct VkBindIndexBufferIndirectCommandEXT {
    VkDeviceAddress    bufferAddress;
    uint32_t           size;
    VkIndexType        indexType;
} VkBindIndexBufferIndirectCommandEXT;
  • bufferAddress 指定用作索引缓冲区的 VkBuffer 的物理地址。

  • size 是从此地址可用于此操作的字节大小范围。

  • indexType 是一个 VkIndexType 值,指定如何处理索引。

有效用法
  • VUID-VkBindIndexBufferIndirectCommandEXT-None-11117
    从中获取地址的缓冲区的用法标志必须设置 VK_BUFFER_USAGE_INDEX_BUFFER_BIT 位。

  • VUID-VkBindIndexBufferIndirectCommandEXT-bufferAddress-11118
    bufferAddress 必须与使用的 indexTypeVkIndexType 对齐。

  • VUID-VkBindIndexBufferIndirectCommandEXT-None-11119
    从中获取地址并且是非稀疏的缓冲区的每个元素必须完全且连续地绑定到单个 VkDeviceMemory 对象。

有效用法(隐式)
  • VUID-VkBindIndexBufferIndirectCommandEXT-indexType-parameter
    indexType 必须是一个有效的 VkIndexType 值。

VkBindVertexBufferIndirectCommandEXT 结构体指定 VK_INDIRECT_COMMANDS_TOKEN_TYPE_VERTEX_BUFFER_EXT 令牌的输入数据。

// Provided by VK_EXT_device_generated_commands
typedef struct VkBindVertexBufferIndirectCommandEXT {
    VkDeviceAddress    bufferAddress;
    uint32_t           size;
    uint32_t           stride;
} VkBindVertexBufferIndirectCommandEXT;
  • bufferAddress 指定用作顶点输入绑定的 VkBuffer 的物理地址。

  • size 是从此地址可用于此操作的字节大小范围。

  • stride 是此顶点输入绑定的字节大小步幅,与 VkVertexInputBindingDescription::stride 中的步幅相同。

有效用法
  • VUID-VkBindVertexBufferIndirectCommandEXT-None-11120
    从中获取地址的缓冲区的用法标志必须设置 VK_BUFFER_USAGE_VERTEX_BUFFER_BIT 位。

  • VUID-VkBindVertexBufferIndirectCommandEXT-None-11121
    从中获取地址并且是非稀疏的缓冲区的每个元素必须完全且连续地绑定到单个 VkDeviceMemory 对象。

VkDrawIndirectCountIndirectCommandEXT 结构体指定所有绘制类型令牌的输入数据。

// Provided by VK_EXT_device_generated_commands
typedef struct VkDrawIndirectCountIndirectCommandEXT {
    VkDeviceAddress    bufferAddress;
    uint32_t           stride;
    uint32_t           commandCount;
} VkDrawIndirectCountIndirectCommandEXT;
  • bufferAddress 指定用于绘制命令的 VkBuffer 的物理地址。

  • stride 是命令参数的字节大小步幅。

  • commandCount 是要执行的命令数。

相应的间接绘制结构数据将从缓冲区地址读取。

有效用法
  • VUID-VkDrawIndirectCountIndirectCommandEXT-None-11122
    从中获取地址的缓冲区的用法标志必须设置 VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT 位。

  • VUID-VkDrawIndirectCountIndirectCommandEXT-None-11123
    从中获取地址并且是非稀疏的缓冲区的每个元素必须完全且连续地绑定到单个 VkDeviceMemory 对象。

VkIndirectCommandsStreamNV 结构体在处理时指定一个或多个令牌的输入数据。

// Provided by VK_NV_device_generated_commands
typedef struct VkIndirectCommandsStreamNV {
    VkBuffer        buffer;
    VkDeviceSize    offset;
} VkIndirectCommandsStreamNV;
  • buffer 指定存储每个序列的功能参数的 VkBuffer。这些参数可以由设备写入。

  • offset 指定 buffer 中参数开始处的偏移量。

有效用法
  • VUID-VkIndirectCommandsStreamNV-buffer-02942
    buffer 的使用标志**必须**设置 VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT 位。

  • VUID-VkIndirectCommandsStreamNV-offset-02943
    offset **必须**与 VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV::minIndirectCommandsBufferOffsetAlignment 对齐。

  • VUID-VkIndirectCommandsStreamNV-buffer-02975
    如果 buffer 是非稀疏的,则它**必须**完整且连续地绑定到单个 VkDeviceMemory 对象。

有效用法(隐式)
  • VUID-VkIndirectCommandsStreamNV-buffer-parameter
    buffer **必须**是有效的 VkBuffer 句柄。

对于 VK_NV_device_generated_commands,输入流**可以**包含原始的 uint32_t 值,以及现有的间接命令,例如

或如下所列的其他命令。数据如何使用将在下一节中描述。

VkBindShaderGroupIndirectCommandNV 结构指定 VK_INDIRECT_COMMANDS_TOKEN_TYPE_SHADER_GROUP_NV 令牌的输入数据。

// Provided by VK_NV_device_generated_commands
typedef struct VkBindShaderGroupIndirectCommandNV {
    uint32_t    groupIndex;
} VkBindShaderGroupIndirectCommandNV;
  • groupIndex 指定当前绑定的图形管线的哪个着色器组被使用。

有效用法
  • VUID-VkBindShaderGroupIndirectCommandNV-None-02944
    当前绑定的图形管线,以及它可能引用的管线,**必须**使用 VK_PIPELINE_CREATE_INDIRECT_BINDABLE_BIT_NV 创建。

  • VUID-VkBindShaderGroupIndirectCommandNV-index-02945
    index **必须**在当前绑定的图形管线可访问的着色器组范围内。有关详细信息,请参阅 vkCmdBindPipelineShaderGroupNV

VkBindIndexBufferIndirectCommandNV 结构指定 VK_INDIRECT_COMMANDS_TOKEN_TYPE_INDEX_BUFFER_NV 令牌的输入数据。

// Provided by VK_NV_device_generated_commands
typedef struct VkBindIndexBufferIndirectCommandNV {
    VkDeviceAddress    bufferAddress;
    uint32_t           size;
    VkIndexType        indexType;
} VkBindIndexBufferIndirectCommandNV;
  • bufferAddress 指定用作索引缓冲区的 VkBuffer 的物理地址。

  • size 是从此地址可用于此操作的字节大小范围。

  • indexType 是一个 VkIndexType 值,指定如何处理索引。 可以通过指定 VkIndirectCommandsLayoutTokenNV::pIndexTypesVkIndirectCommandsLayoutTokenNV::pIndexTypeValues 数组,将自定义的 uint32_t 值映射到 VkIndexType,而不是 Vulkan 枚举值。

有效用法
  • VUID-VkBindIndexBufferIndirectCommandNV-None-02946
    从中获取地址的缓冲区的使用标志**必须**设置 VK_BUFFER_USAGE_INDEX_BUFFER_BIT 位。

  • VUID-VkBindIndexBufferIndirectCommandNV-bufferAddress-02947
    bufferAddress **必须**与所使用的 indexType 对齐。

  • VUID-VkBindIndexBufferIndirectCommandNV-None-02948
    从中获取地址并且是非稀疏的缓冲区的每个元素必须完全且连续地绑定到单个 VkDeviceMemory 对象。

有效用法(隐式)
  • VUID-VkBindIndexBufferIndirectCommandNV-indexType-parameter
    indexType 必须是一个有效的 VkIndexType 值。

VkBindVertexBufferIndirectCommandNV 结构指定 VK_INDIRECT_COMMANDS_TOKEN_TYPE_VERTEX_BUFFER_NV 令牌的输入数据。

// Provided by VK_NV_device_generated_commands
typedef struct VkBindVertexBufferIndirectCommandNV {
    VkDeviceAddress    bufferAddress;
    uint32_t           size;
    uint32_t           stride;
} VkBindVertexBufferIndirectCommandNV;
  • bufferAddress 指定用作顶点输入绑定的 VkBuffer 的物理地址。

  • size 是从此地址可用于此操作的字节大小范围。

  • stride 是此顶点输入绑定的字节大小步幅,如 VkVertexInputBindingDescription::stride 中所示。只有当设置了 VkIndirectCommandsLayoutTokenNV::vertexDynamicStride 时才使用它,否则步幅将从当前绑定的图形管线继承。

有效用法
  • VUID-VkBindVertexBufferIndirectCommandNV-None-02949
    从中获取地址的缓冲区的用法标志必须设置 VK_BUFFER_USAGE_VERTEX_BUFFER_BIT 位。

  • VUID-VkBindVertexBufferIndirectCommandNV-None-02950
    从中获取地址并且是非稀疏的缓冲区的每个元素必须完全且连续地绑定到单个 VkDeviceMemory 对象。

VkSetStateFlagsIndirectCommandNV 结构指定 VK_INDIRECT_COMMANDS_TOKEN_TYPE_STATE_FLAGS_NV 令牌的输入数据。更改哪个状态取决于在创建 VkIndirectCommandsLayoutNV 时指定的 VkIndirectStateFlagBitsNV

// Provided by VK_NV_device_generated_commands
typedef struct VkSetStateFlagsIndirectCommandNV {
    uint32_t    data;
} VkSetStateFlagsIndirectCommandNV;
  • data 编码此命令更改的打包状态。

    • 0:如果设置,则表示 VK_FRONT_FACE_CLOCKWISE,否则表示 VK_FRONT_FACE_COUNTER_CLOCKWISE

可以使用间接状态标志更改图形管线状态的子集。

// Provided by VK_NV_device_generated_commands
typedef enum VkIndirectStateFlagBitsNV {
    VK_INDIRECT_STATE_FLAG_FRONTFACE_BIT_NV = 0x00000001,
} VkIndirectStateFlagBitsNV;
  • VK_INDIRECT_STATE_FLAG_FRONTFACE_BIT_NV 允许为后续的绘图命令切换 VkFrontFace 光栅化状态。

// Provided by VK_NV_device_generated_commands
typedef VkFlags VkIndirectStateFlagsNV;

VkIndirectStateFlagsNV 是一种位掩码类型,用于设置零个或多个 VkIndirectStateFlagBitsNV 的掩码。

VkBindPipelineIndirectCommandNV 结构指定 VK_INDIRECT_COMMANDS_TOKEN_TYPE_PIPELINE_NV 令牌的输入数据。

// Provided by VK_NV_device_generated_commands_compute
typedef struct VkBindPipelineIndirectCommandNV {
    VkDeviceAddress    pipelineAddress;
} VkBindPipelineIndirectCommandNV;
  • pipelineAddress 指定设备生成渲染中将使用的计算管线的管线地址。

有效用法

标记化命令处理

原则上,下面说明了 VK_EXT_device_generated_commands 的处理过程

void cmdProcessSequence(cmd, indirectExecutionSet, indirectCommandsLayout, indirectAddress, s)
{
  for (t = 0; t < indirectCommandsLayout.tokenCount; t++)
  {
    uint32_t offset  = indirectCommandsLayout.pTokens[t].offset;
    uint32_t stride  = indirectCommandsLayout.indirectStride;
    VkDeviceAddress streamData = indirectAddress;
    const void* input = streamData + stride * s + offset;

    // further details later
    indirectCommandsLayout.pTokens[t].command (cmd, indirectExecutionSet, input, s);
  }
}

void cmdProcessAllSequences(cmd, indirectExecutionSet, indirectCommandsLayout, indirectAddress, sequencesCount)
{
  for (s = 0; s < sequencesCount; s++)
  {
    sUsed = s;

    if (indirectCommandsLayout.flags & VK_INDIRECT_COMMANDS_LAYOUT_USAGE_UNORDERED_SEQUENCES_BIT_EXT) {
      sUsed = incoherent_implementation_dependent_permutation[ sUsed ];
    }

    cmdProcessSequence( cmd, indirectExecutionSet, indirectCommandsLayout, indirectAddress, sUsed );
  }
}

每个序列的处理都被认为是无状态的,因此所有状态更改**必须**在序列中的操作命令之前发生。单个序列严格针对创建时使用的 VkShaderStageFlags

每个令牌的主要输入数据是通过 VkBuffer 内容提供的,在预处理时使用 vkCmdPreprocessGeneratedCommandsEXT 或在执行时使用 vkCmdExecuteGeneratedCommandsEXT,但是某些功能参数(例如推送常量布局)是在布局创建时指定的。 每个令牌的输入大小都不同。

指定命令令牌的 VkIndirectCommandsLayoutCreateInfoEXT::pTokens 数组中的元素的可能值(数组的其他元素指定命令参数)为

// Provided by VK_EXT_device_generated_commands
typedef enum VkIndirectCommandsTokenTypeEXT {
    VK_INDIRECT_COMMANDS_TOKEN_TYPE_EXECUTION_SET_EXT = 0,
    VK_INDIRECT_COMMANDS_TOKEN_TYPE_PUSH_CONSTANT_EXT = 1,
    VK_INDIRECT_COMMANDS_TOKEN_TYPE_SEQUENCE_INDEX_EXT = 2,
    VK_INDIRECT_COMMANDS_TOKEN_TYPE_INDEX_BUFFER_EXT = 3,
    VK_INDIRECT_COMMANDS_TOKEN_TYPE_VERTEX_BUFFER_EXT = 4,
    VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_INDEXED_EXT = 5,
    VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_EXT = 6,
    VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_INDEXED_COUNT_EXT = 7,
    VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_COUNT_EXT = 8,
    VK_INDIRECT_COMMANDS_TOKEN_TYPE_DISPATCH_EXT = 9,
  // Provided by VK_EXT_device_generated_commands with VK_NV_mesh_shader
    VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_MESH_TASKS_NV_EXT = 1000202002,
  // Provided by VK_EXT_device_generated_commands with VK_NV_mesh_shader
    VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_MESH_TASKS_COUNT_NV_EXT = 1000202003,
  // Provided by VK_EXT_device_generated_commands with VK_EXT_mesh_shader
    VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_MESH_TASKS_EXT = 1000328000,
  // Provided by VK_EXT_device_generated_commands with VK_EXT_mesh_shader
    VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_MESH_TASKS_COUNT_EXT = 1000328001,
  // Provided by VK_KHR_ray_tracing_maintenance1 with VK_EXT_device_generated_commands
    VK_INDIRECT_COMMANDS_TOKEN_TYPE_TRACE_RAYS2_EXT = 1000386004,
} VkIndirectCommandsTokenTypeEXT;
表 1. 支持的间接命令令牌
通用令牌 命令数据

VK_INDIRECT_COMMANDS_TOKEN_TYPE_EXECUTION_SET_EXT

u32[] 间接执行集索引数组

VK_INDIRECT_COMMANDS_TOKEN_TYPE_PUSH_CONSTANT_EXT

u32[] 原始数据

VK_INDIRECT_COMMANDS_TOKEN_TYPE_SEQUENCE_INDEX_EXT

u32 占位符数据(着色器不访问)

计算令牌

VK_INDIRECT_COMMANDS_TOKEN_TYPE_DISPATCH_EXT

VkDispatchIndirectCommand

光线追踪令牌

VK_INDIRECT_COMMANDS_TOKEN_TYPE_TRACE_RAYS2_EXT

VkTraceRaysIndirectCommand2KHR

图形状态令牌

VK_INDIRECT_COMMANDS_TOKEN_TYPE_INDEX_BUFFER_EXT

VkBindIndexBufferIndirectCommandEXT

VK_INDIRECT_COMMANDS_TOKEN_TYPE_VERTEX_BUFFER_EXT

VkBindVertexBufferIndirectCommandEXT

图形绘制令牌

VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_INDEXED_EXT

VkDrawIndexedIndirectCommand

VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_EXT

VkDrawIndirectCommand

VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_MESH_TASKS_EXT

VkDrawMeshTasksIndirectCommandEXT

VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_MESH_TASKS_NV_EXT

VkDrawMeshTasksIndirectCommandNV

图形绘制计数令牌

VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_INDEXED_COUNT_EXT

VkDrawIndirectCountIndirectCommandEXT 与 VkDrawIndexedIndirectCommand

VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_COUNT_EXT

VkDrawIndirectCountIndirectCommandEXT 与 VkDrawIndirectCommand

VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_MESH_TASKS_COUNT_EXT

VkDrawIndirectCountIndirectCommandEXT 与 VkDrawMeshTasksIndirectCommandEXT

VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_MESH_TASKS_COUNT_NV_EXT

VkDrawIndirectCountIndirectCommandEXT 与 VkDrawMeshTasksIndirectCommandNV

VkIndirectCommandsLayoutTokenEXT 结构体指定了在布局创建时需要知道的函数参数的详细信息。

// Provided by VK_EXT_device_generated_commands
typedef struct VkIndirectCommandsLayoutTokenEXT {
    VkStructureType                   sType;
    const void*                       pNext;
    VkIndirectCommandsTokenTypeEXT    type;
    VkIndirectCommandsTokenDataEXT    data;
    uint32_t                          offset;
} VkIndirectCommandsLayoutTokenEXT;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • type 指定了 dataVkIndirectCommandsTokenTypeEXT

  • data 指定了一个 VkIndirectCommandsTokenDataEXT,其中包含用于命令执行的特定于标记的详细信息。 如果 typeVkIndirectCommandsTokenDataEXT 联合体的任何成员都不匹配,则忽略该信息。

  • offset 是间接缓冲区内一个序列中标记的相对字节偏移量。 存储在该偏移量处的数据是标记的命令数据,例如 VkDispatchIndirectCommand

有效用法
  • VUID-VkIndirectCommandsLayoutTokenEXT-offset-11124
    offset 必须小于或等于 VkPhysicalDeviceDeviceGeneratedCommandsPropertiesEXT::maxIndirectCommandsTokenOffset

  • VUID-VkIndirectCommandsLayoutTokenEXT-offset-11125
    offset 必须4 对齐

  • VUID-VkIndirectCommandsLayoutTokenEXT-meshShader-11126
    如果未启用 meshShadertaskShader,则 type 不得VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_MESH_TASKS_EXTVK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_MESH_TASKS_COUNT_EXTVK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_MESH_TASKS_NV_EXTVK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_MESH_TASKS_COUNT_NV_EXT

  • VUID-VkIndirectCommandsLayoutTokenEXT-rayTracingMaintenance1-11128
    如果未启用 rayTracingMaintenance1 功能,则 type 不得VK_INDIRECT_COMMANDS_TOKEN_TYPE_TRACE_RAYS2_EXT

  • VUID-VkIndirectCommandsLayoutTokenEXT-deviceGeneratedCommandsMultiDrawIndirectCount-11129
    如果不支持 VkPhysicalDeviceDeviceGeneratedCommandsPropertiesEXT::deviceGeneratedCommandsMultiDrawIndirectCount,则 type 不得VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_INDEXED_COUNT_EXTVK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_COUNT_EXT

  • VUID-VkIndirectCommandsLayoutTokenEXT-deviceGeneratedCommandsMultiDrawIndirectCount-11130
    如果不支持 VkPhysicalDeviceDeviceGeneratedCommandsPropertiesEXT::deviceGeneratedCommandsMultiDrawIndirectCount,则 type 不得VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_MESH_TASKS_COUNT_EXT

  • VUID-VkIndirectCommandsLayoutTokenEXT-deviceGeneratedCommandsMultiDrawIndirectCount-11131
    如果不支持 VkPhysicalDeviceDeviceGeneratedCommandsPropertiesEXT::deviceGeneratedCommandsMultiDrawIndirectCount,则 type 不得VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_MESH_TASKS_COUNT_NV_EXT

有效用法(隐式)
  • VUID-VkIndirectCommandsLayoutTokenEXT-sType-sType
    sType 必须VK_STRUCTURE_TYPE_INDIRECT_COMMANDS_LAYOUT_TOKEN_EXT

  • VUID-VkIndirectCommandsLayoutTokenEXT-type-parameter
    type 必须是有效的 VkIndirectCommandsTokenTypeEXT 值。

  • VUID-VkIndirectCommandsLayoutTokenEXT-pPushConstant-parameter
    如果 typeVK_INDIRECT_COMMANDS_TOKEN_TYPE_PUSH_CONSTANT_EXT、VK_INDIRECT_COMMANDS_TOKEN_TYPE_SEQUENCE_INDEX_EXT,则 datapPushConstant 成员必须是指向有效 VkIndirectCommandsPushConstantTokenEXT 结构的有效指针。

  • VUID-VkIndirectCommandsLayoutTokenEXT-pVertexBuffer-parameter
    如果 typeVK_INDIRECT_COMMANDS_TOKEN_TYPE_VERTEX_BUFFER_EXT,则 datapVertexBuffer 成员必须是指向有效 VkIndirectCommandsVertexBufferTokenEXT 结构的有效指针。

  • VUID-VkIndirectCommandsLayoutTokenEXT-pIndexBuffer-parameter
    如果 typeVK_INDIRECT_COMMANDS_TOKEN_TYPE_INDEX_BUFFER_EXT,则 datapIndexBuffer 成员必须是指向有效 VkIndirectCommandsIndexBufferTokenEXT 结构的有效指针。

  • VUID-VkIndirectCommandsLayoutTokenEXT-pExecutionSet-parameter
    如果 typeVK_INDIRECT_COMMANDS_TOKEN_TYPE_EXECUTION_SET_EXT,则 datapExecutionSet 成员必须是指向有效 VkIndirectCommandsExecutionSetTokenEXT 结构的有效指针。

VkIndirectCommandsTokenDataEXT 结构体提供了用于生成间接执行布局的特定于标记的详细信息。

// Provided by VK_EXT_device_generated_commands
typedef union VkIndirectCommandsTokenDataEXT {
    const VkIndirectCommandsPushConstantTokenEXT*    pPushConstant;
    const VkIndirectCommandsVertexBufferTokenEXT*    pVertexBuffer;
    const VkIndirectCommandsIndexBufferTokenEXT*     pIndexBuffer;
    const VkIndirectCommandsExecutionSetTokenEXT*    pExecutionSet;
} VkIndirectCommandsTokenDataEXT;

必须为每个标记设置联合体的相应成员。

以下代码提供了关于如何处理单个序列的详细信息。 对于有效使用,所有来自常规命令的限制都适用。

void cmdProcessSequence(cmd, indirectExecutionSet, indirectCommandsLayout, indirectAddress, s)
{
  for (uint32_t t = 0; t < indirectCommandsLayout.tokenCount; t++) {
    VkIndirectCommandsLayoutTokenEXT *token = &indirectCommandsLayout.pTokens[t];

    uint32_t offset  = token->offset;
    uint32_t stride  = indirectCommandsLayout.indirectStride;
    VkDeviceAddress streamData = indirectAddress;
    const void* input = streamData + stride * s + offset;

    switch (token->tokenType) {
    case VK_INDIRECT_COMMANDS_TOKEN_TYPE_EXECUTION_SET_EXT:
      uint32_t *bind = input;
      VkIndirectCommandsExecutionSetTokenEXT *info = token->data.pExecutionSet;

      if (info->type == VK_INDIRECT_EXECUTION_SET_INFO_TYPE_PIPELINES_EXT) {
        vkCmdBindPipeline(cmd, indirectExecutionSet.pipelineBindPoint, indirectExecutionSet.pipelines[*bind]);
      } else {
        VkShaderStageFlagBits stages[];
        VkShaderEXT shaders[];
        uint32_t i = 0;
        IterateBitmaskLSBToMSB(iter, info->shaderStages) {
            stages[i] = iter;
            shaders[i] = indirectExecutionSet.shaders[bind[i]].shaderObject;
            i++;
        }
        vkCmdBindShadersEXT(cmd, i, stages, shaders);
      }
      break;

    case VK_INDIRECT_COMMANDS_TOKEN_TYPE_PUSH_CONSTANT_EXT:
      uint32_t* data = input;
      VkPushConstantsInfoKHR info = {
        VK_STRUCTURE_TYPE_PUSH_CONSTANTS_INFO_KHR,
        // this can also use `dynamicGeneratedPipelineLayout' to pass a VkPipelineLayoutCreateInfo from pNext
        indirectCommandsLayout.pipelineLayout,
        token->token.pushConstant.updateRange.shaderStages,
        token->token.pushConstant.updateRange.offset,
        token->token.pushConstant.updateRange.size,
        data
      };

      vkCmdPushConstants2KHR(cmd, &info);
      break;

    case VK_INDIRECT_COMMANDS_TOKEN_TYPE_SEQUENCE_INDEX_EXT:
      VkPushConstantsInfoKHR info = {
        VK_STRUCTURE_TYPE_PUSH_CONSTANTS_INFO_KHR,
        // this can also use `dynamicGeneratedPipelineLayout' to pass a VkPipelineLayoutCreateInfo from pNext
        indirectCommandsLayout.pipelineLayout,
        token->token.pushConstant.updateRange.shaderStages,
        token->token.pushConstant.updateRange.offset,
        // this must be 4
        token->token.pushConstant.updateRange.size,
        // this just updates the sequence index
        &s
      };

      vkCmdPushConstants2KHR(cmd, &info);
      break;

    case VK_INDIRECT_COMMANDS_TOKEN_TYPE_INDEX_BUFFER_EXT:
      VkBindIndexBufferIndirectCommandEXT* data = input;

      vkCmdBindIndexBuffer(cmd, deriveBuffer(data->bufferAddress), deriveOffset(data->bufferAddress), data->indexType);
      break;

    case VK_INDIRECT_COMMANDS_TOKEN_TYPE_VERTEX_BUFFER_EXT:
      VkBindVertexBufferIndirectCommandEXT* data = input;

      vkCmdBindVertexBuffers2(cmd, token->token.vertexBuffer->vertexBindingUnit, 1, &deriveBuffer(data->bufferAddress),
                              &deriveOffset(data->bufferAddress), data->size, data->stride);
      break;

    case VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_INDEXED_EXT:
      VkDrawIndexedIndirectCommand *data = input;

      vkCmdDrawIndexed(cmd, data->indexCount, data->instanceCount, data->firstIndex, data->vertexOffset, data->firstInstance);
      break;
    case VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_INDEXED_COUNT_EXT:
      VkDrawIndirectCountIndirectCommandEXT* data = input;

      vkCmdDrawIndexedIndirect(cmd, deriveBuffer(data->bufferAddress),  deriveoffset(data->bufferAddress), min(data->commandCount, indirectCommandsLayout.maxDrawCount), data->stride);
      break;

    case VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_EXT:
      VkDrawIndirectCommand* data = input;

      vkCmdDraw(cmd, data->vertex_count, data->instanceCount, data->firstVertex, data->firstIndex);
      break;

    case VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_COUNT_EXT:
      VkDrawIndirectCountIndirectCommandEXT* data = input;

      vkCmdDrawIndirect(cmd, deriveBuffer(data->bufferAddress), deriveoffset(data->bufferAddress), min(data->commandCount, indirectCommandsLayout.maxDrawCount), data->stride);
      break;

    // only available if VK_NV_mesh_shader is enabled
    case VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_MESH_TASKS_NV_EXT:
      VkDrawMeshTasksIndirectCommandNV *data = input;

      vkCmdDrawMeshTasksNV(cmd, data->taskCount, data->firstTask);
     break;

    // only available if VK_NV_mesh_shader is enabled
    case VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_MESH_TASKS_COUNT_NV_EXT:
      VkDrawIndirectCountIndirectCommandEXT* data = input;

      vkCmdDrawMeshTasksIndirectCountNV(cmd, deriveBuffer(data->bufferAddress),  deriveoffset(data->bufferAddress), min(data->commandCount, indirectCommandsLayout.maxDrawCount), data->stride);
      break;

    // only available if VK_EXT_mesh_shader is enabled
    case VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_MESH_TASKS_EXT:
      VkDrawMeshTasksIndirectCommandEXT *data = input;

      vkCmdDrawMeshTasksEXT(cmd, data->groupCountX, data->groupCountY, data->groupCountZ);
     break;

    // only available if VK_EXT_mesh_shader is enabled
    case VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_MESH_TASKS_COUNT_EXT:
      VkDrawIndirectCountIndirectCommandEXT* data = input;

      vkCmdDrawMeshTasksIndirectCountEXT(cmd, deriveBuffer(data->bufferAddress),  deriveoffset(data->bufferAddress), min(data->commandCount, indirectCommandsLayout.maxDrawCount), data->stride);
      break;

    case VK_INDIRECT_COMMANDS_TOKEN_TYPE_DISPATCH_EXT:
      VkDispatchIndirectCommand *data = input;

      vkCmdDispatch(cmd, data->x, data->y, data->z);
      break;

    // only available if VK_KHR_ray_tracing_maintenance1 is enabled
    case VK_INDIRECT_COMMANDS_TOKEN_TYPE_TRACE_RAYS2_EXT:
      vkCmdTraceRaysIndirect2KHR(cmd, deriveBuffer(input));
      break;
    }
  }
}

原则上,下面说明了 VK_NV_device_generated_commands 的处理过程

void cmdProcessSequence(cmd, pipeline, indirectCommandsLayout, pIndirectCommandsStreams, s)
{
  for (t = 0; t < indirectCommandsLayout.tokenCount; t++)
  {
    uint32_t stream  = indirectCommandsLayout.pTokens[t].stream;
    uint32_t offset  = indirectCommandsLayout.pTokens[t].offset;
    uint32_t stride  = indirectCommandsLayout.pStreamStrides[stream];
    stream            = pIndirectCommandsStreams[stream];
    const void* input = stream.buffer.pointer( stream.offset + stride * s + offset )

    // further details later
    indirectCommandsLayout.pTokens[t].command (cmd, pipeline, input, s);
  }
}

void cmdProcessAllSequences(cmd, pipeline, indirectCommandsLayout, pIndirectCommandsStreams, sequencesCount)
{
  for (s = 0; s < sequencesCount; s++)
  {
    cmdProcessSequence(cmd, pipeline, indirectCommandsLayout, pIndirectCommandsStreams, s);
  }
}

每个序列的处理都被认为是无状态的,因此所有状态更改必须在序列内的任何操作命令标记之前发生。单个序列严格地针对创建它时使用的 VkPipelineBindPoint

每个标记的主要输入数据是通过使用 vkCmdPreprocessGeneratedCommandsNV 在预处理期间或使用 vkCmdExecuteGeneratedCommandsNV 在执行时,通过 VkBuffer 内容提供的,但是一些功能参数,例如绑定集,是在布局创建时指定的。每个标记的输入大小都不同。

VkIndirectCommandsPushConstantTokenEXT 结构体指定了 VK_INDIRECT_COMMANDS_TOKEN_TYPE_PUSH_CONSTANT_EXTVK_INDIRECT_COMMANDS_TOKEN_TYPE_SEQUENCE_INDEX_EXT 标记的布局标记信息。

// Provided by VK_EXT_device_generated_commands
typedef struct VkIndirectCommandsPushConstantTokenEXT {
    VkPushConstantRange    updateRange;
} VkIndirectCommandsPushConstantTokenEXT;
  • updateRange 是将由标记更新的推送常量范围。

将忽略 updateRangestageFlags 成员。

有效用法
  • VUID-VkIndirectCommandsPushConstantTokenEXT-updateRange-11132
    updateRange 必须包含在 VkIndirectCommandsLayoutCreateInfoEXT 使用的推送常量信息中。

  • VUID-VkIndirectCommandsPushConstantTokenEXT-size-11133
    如果令牌类型为 VK_INDIRECT_COMMANDS_TOKEN_TYPE_SEQUENCE_INDEX_EXT,则 updateRange 成员的 size 必须为 4

有效用法(隐式)
  • VUID-VkIndirectCommandsPushConstantTokenEXT-updateRange-parameter
    updateRange 必须是有效的 VkPushConstantRange 结构体

VkIndirectCommandsVertexBufferTokenEXT 结构体指定 VK_INDIRECT_COMMANDS_TOKEN_TYPE_VERTEX_BUFFER_EXT 令牌的布局令牌信息。

// Provided by VK_EXT_device_generated_commands
typedef struct VkIndirectCommandsVertexBufferTokenEXT {
    uint32_t    vertexBindingUnit;
} VkIndirectCommandsVertexBufferTokenEXT;
  • vertexBindingUnit 是要绑定的顶点输入绑定编号。

有效用法
  • VUID-VkIndirectCommandsVertexBufferTokenEXT-vertexBindingUnit-11134
    vertexBindingUnit 必须小于当前图形状态使用的顶点输入绑定总数

VkIndirectCommandsIndexBufferTokenEXT 结构体指定 VK_INDIRECT_COMMANDS_TOKEN_TYPE_INDEX_BUFFER_EXT 令牌的布局令牌信息。

// Provided by VK_EXT_device_generated_commands
typedef struct VkIndirectCommandsIndexBufferTokenEXT {
    VkIndirectCommandsInputModeFlagBitsEXT    mode;
} VkIndirectCommandsIndexBufferTokenEXT;
  • mode 指定此令牌使用的模式。

这允许在其他 API 之上轻松分层 Vulkan。当指定 VK_INDIRECT_COMMANDS_INPUT_MODE_DXGI_INDEX_BUFFER_EXT 时,间接缓冲区可以包含 D3D12_INDEX_BUFFER_VIEW 而不是 VkBindIndexBufferIndirectCommandEXT,因为 D3D 的 DXGI 格式值映射到 VkIndexType。它的工作原理与两种结构体在其他方面都是二进制兼容的。

有效用法
  • VUID-VkIndirectCommandsIndexBufferTokenEXT-mode-11135
    mode 必须为非零

  • VUID-VkIndirectCommandsIndexBufferTokenEXT-mode-11136
    mode 必须是在 VkPhysicalDeviceDeviceGeneratedCommandsPropertiesEXT::supportedIndirectCommandsInputModes 中支持的位之一

有效用法(隐式)

VkIndirectCommandsIndexBufferTokenEXT::mode 中设置的位,指定索引缓冲区的使用方式,为

// Provided by VK_EXT_device_generated_commands
typedef enum VkIndirectCommandsInputModeFlagBitsEXT {
    VK_INDIRECT_COMMANDS_INPUT_MODE_VULKAN_INDEX_BUFFER_EXT = 0x00000001,
    VK_INDIRECT_COMMANDS_INPUT_MODE_DXGI_INDEX_BUFFER_EXT = 0x00000002,
} VkIndirectCommandsInputModeFlagBitsEXT;
  • VK_INDIRECT_COMMANDS_INPUT_MODE_VULKAN_INDEX_BUFFER_EXT 指定间接缓冲区包含 VkBindIndexBufferIndirectCommandEXT

  • VK_INDIRECT_COMMANDS_INPUT_MODE_DXGI_INDEX_BUFFER_EXT 指定间接缓冲区包含 D3D12_INDEX_BUFFER_VIEW

// Provided by VK_EXT_device_generated_commands
typedef VkFlags VkIndirectCommandsInputModeFlagsEXT;

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

VkIndirectCommandsExecutionSetTokenEXT 结构体指定 VK_INDIRECT_COMMANDS_TOKEN_TYPE_EXECUTION_SET_EXT 令牌的输入数据。

// Provided by VK_EXT_device_generated_commands
typedef struct VkIndirectCommandsExecutionSetTokenEXT {
    VkIndirectExecutionSetInfoTypeEXT    type;
    VkShaderStageFlags                   shaderStages;
} VkIndirectCommandsExecutionSetTokenEXT;
  • type 描述正在使用的间接执行集的类型。

  • shaderStages 指定将由此令牌更改的着色器。

有效用法
有效用法(隐式)
  • VUID-VkIndirectCommandsExecutionSetTokenEXT-type-parameter
    type 必须是有效的 VkIndirectExecutionSetInfoTypeEXT

  • VUID-VkIndirectCommandsExecutionSetTokenEXT-shaderStages-parameter
    shaderStages **必须**是 VkShaderStageFlagBits 值的有效组合。

  • VUID-VkIndirectCommandsExecutionSetTokenEXT-shaderStages-requiredbitmask
    shaderStages **必须**不能为 0

指定命令令牌的 VkIndirectCommandsLayoutCreateInfoNV::pTokens 数组的这些元素的可能值(数组的其他元素指定命令参数)为

// Provided by VK_NV_device_generated_commands
typedef enum VkIndirectCommandsTokenTypeNV {
    VK_INDIRECT_COMMANDS_TOKEN_TYPE_SHADER_GROUP_NV = 0,
    VK_INDIRECT_COMMANDS_TOKEN_TYPE_STATE_FLAGS_NV = 1,
    VK_INDIRECT_COMMANDS_TOKEN_TYPE_INDEX_BUFFER_NV = 2,
    VK_INDIRECT_COMMANDS_TOKEN_TYPE_VERTEX_BUFFER_NV = 3,
    VK_INDIRECT_COMMANDS_TOKEN_TYPE_PUSH_CONSTANT_NV = 4,
    VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_INDEXED_NV = 5,
    VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_NV = 6,
    VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_TASKS_NV = 7,
  // Provided by VK_EXT_mesh_shader with VK_NV_device_generated_commands
    VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_MESH_TASKS_NV = 1000328000,
  // Provided by VK_NV_device_generated_commands_compute
    VK_INDIRECT_COMMANDS_TOKEN_TYPE_PIPELINE_NV = 1000428003,
  // Provided by VK_NV_device_generated_commands_compute
    VK_INDIRECT_COMMANDS_TOKEN_TYPE_DISPATCH_NV = 1000428004,
} VkIndirectCommandsTokenTypeNV;
表 2. 支持的间接命令令牌
令牌类型 等效命令

VK_INDIRECT_COMMANDS_TOKEN_TYPE_SHADER_GROUP_NV

vkCmdBindPipelineShaderGroupNV

VK_INDIRECT_COMMANDS_TOKEN_TYPE_STATE_FLAGS_NV

-

VK_INDIRECT_COMMANDS_TOKEN_TYPE_INDEX_BUFFER_NV

vkCmdBindIndexBuffer

VK_INDIRECT_COMMANDS_TOKEN_TYPE_VERTEX_BUFFER_NV

vkCmdBindVertexBuffers

VK_INDIRECT_COMMANDS_TOKEN_TYPE_PUSH_CONSTANT_NV

vkCmdPushConstants

VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_INDEXED_NV

vkCmdDrawIndexedIndirect

VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_NV

vkCmdDrawIndirect

VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_TASKS_NV

vkCmdDrawMeshTasksIndirectNV

VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_MESH_TASKS_NV

vkCmdDrawMeshTasksIndirectEXT

VK_INDIRECT_COMMANDS_TOKEN_TYPE_PIPELINE_NV

vkCmdBindPipeline

VK_INDIRECT_COMMANDS_TOKEN_TYPE_DISPATCH_NV

vkCmdDispatchIndirect

VkIndirectCommandsLayoutTokenNV 结构体指定布局创建时需要知道的函数参数的详细信息

// Provided by VK_NV_device_generated_commands
typedef struct VkIndirectCommandsLayoutTokenNV {
    VkStructureType                  sType;
    const void*                      pNext;
    VkIndirectCommandsTokenTypeNV    tokenType;
    uint32_t                         stream;
    uint32_t                         offset;
    uint32_t                         vertexBindingUnit;
    VkBool32                         vertexDynamicStride;
    VkPipelineLayout                 pushconstantPipelineLayout;
    VkShaderStageFlags               pushconstantShaderStageFlags;
    uint32_t                         pushconstantOffset;
    uint32_t                         pushconstantSize;
    VkIndirectStateFlagsNV           indirectStateFlags;
    uint32_t                         indexTypeCount;
    const VkIndexType*               pIndexTypes;
    const uint32_t*                  pIndexTypeValues;
} VkIndirectCommandsLayoutTokenNV;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • tokenType 是一个 VkIndirectCommandsTokenTypeNV,指定令牌命令类型。

  • stream 是包含令牌参数数据的输入流的索引。

  • offset 是令牌参数数据在输入流内存中的相对起始偏移量。

  • vertexBindingUnit 用于顶点缓冲区绑定命令。

  • vertexDynamicStride 设置顶点缓冲区步幅是否由绑定命令提供,而不是由当前绑定的图形管线状态提供。

  • pushconstantPipelineLayout 是用于推送常量命令的 VkPipelineLayout

  • pushconstantShaderStageFlags 是用于推送常量命令的着色器阶段标志。

  • pushconstantOffset 是用于推送常量命令的偏移量。

  • pushconstantSize 是用于推送常量命令的大小。

  • indirectStateFlags 是一个 VkIndirectStateFlagsNV 位字段,指示状态标志命令的活动状态。

  • indexTypeCountpIndexTypespIndexTypeValues 数组配对的可选大小。如果非零,则允许注册一个自定义的 uint32_t 值,并将其视为特定的 VkIndexType

  • pIndexTypespIndexTypeValues 中相应 uint32_t 值条目使用的 VkIndexType

有效用法
  • VUID-VkIndirectCommandsLayoutTokenNV-stream-02951
    stream 必须 小于 VkIndirectCommandsLayoutCreateInfoNV::streamCount

  • VUID-VkIndirectCommandsLayoutTokenNV-offset-02952
    offset 必须 小于或等于 VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV::maxIndirectCommandsTokenOffset

  • VUID-VkIndirectCommandsLayoutTokenNV-offset-06888
    offset 必须 对齐到 tokenType 的标量对齐或 minIndirectCommandsBufferOffsetAlignment 中较小的那个。

  • VUID-VkIndirectCommandsLayoutTokenNV-tokenType-02976
    如果 tokenTypeVK_INDIRECT_COMMANDS_TOKEN_TYPE_VERTEX_BUFFER_NV,则 vertexBindingUnit 必须 在设备支持的相应命令的限制范围内。

  • VUID-VkIndirectCommandsLayoutTokenNV-tokenType-02977
    如果 tokenTypeVK_INDIRECT_COMMANDS_TOKEN_TYPE_PUSH_CONSTANT_NV,则 pushconstantPipelineLayout 必须 有效。

  • VUID-VkIndirectCommandsLayoutTokenNV-tokenType-02978
    如果 tokenTypeVK_INDIRECT_COMMANDS_TOKEN_TYPE_PUSH_CONSTANT_NV,则 pushconstantOffset 必须4 的倍数。

  • VUID-VkIndirectCommandsLayoutTokenNV-tokenType-02979
    如果 tokenTypeVK_INDIRECT_COMMANDS_TOKEN_TYPE_PUSH_CONSTANT_NV,则 pushconstantSize 必须4 的倍数。

  • VUID-VkIndirectCommandsLayoutTokenNV-tokenType-02980
    如果 tokenTypeVK_INDIRECT_COMMANDS_TOKEN_TYPE_PUSH_CONSTANT_NV,则 pushconstantOffset 必须 小于 VkPhysicalDeviceLimits::maxPushConstantsSize

  • VUID-VkIndirectCommandsLayoutTokenNV-tokenType-02981
    如果 tokenTypeVK_INDIRECT_COMMANDS_TOKEN_TYPE_PUSH_CONSTANT_NV,则 pushconstantSize 必须 小于或等于 VkPhysicalDeviceLimits::maxPushConstantsSize 减去 pushconstantOffset

  • VUID-VkIndirectCommandsLayoutTokenNV-tokenType-02982
    如果 tokenTypeVK_INDIRECT_COMMANDS_TOKEN_TYPE_PUSH_CONSTANT_NV,对于由 pushconstantOffsetpushconstantSize 指定的范围内的每个字节,以及 pushconstantShaderStageFlags 中的每个着色器阶段,在 pushconstantPipelineLayout必须 有一个包含该字节和该阶段的推送常量范围。

  • VUID-VkIndirectCommandsLayoutTokenNV-tokenType-02983
    如果 tokenTypeVK_INDIRECT_COMMANDS_TOKEN_TYPE_PUSH_CONSTANT_NV,对于由 pushconstantOffsetpushconstantSize 指定的范围内的每个字节,以及每个与该字节重叠的推送常量范围,pushconstantShaderStageFlags 必须 包含该推送常量范围的 VkPushConstantRange::stageFlags 中的所有阶段。

  • VUID-VkIndirectCommandsLayoutTokenNV-tokenType-02984
    如果 tokenTypeVK_INDIRECT_COMMANDS_TOKEN_TYPE_STATE_FLAGS_NV,则 indirectStateFlags 必须 不为 0

有效用法(隐式)
  • VUID-VkIndirectCommandsLayoutTokenNV-sType-sType
    sType 必须VK_STRUCTURE_TYPE_INDIRECT_COMMANDS_LAYOUT_TOKEN_NV

  • VUID-VkIndirectCommandsLayoutTokenNV-pNext-pNext
    pNext 必须NULL

  • VUID-VkIndirectCommandsLayoutTokenNV-tokenType-parameter
    tokenType 必须 是有效的 VkIndirectCommandsTokenTypeNV 值。

  • VUID-VkIndirectCommandsLayoutTokenNV-pushconstantPipelineLayout-parameter
    如果 pushconstantPipelineLayout 不是 VK_NULL_HANDLE,则 pushconstantPipelineLayout 必须 是有效的 VkPipelineLayout 句柄。

  • VUID-VkIndirectCommandsLayoutTokenNV-pushconstantShaderStageFlags-parameter
    pushconstantShaderStageFlags 必须VkShaderStageFlagBits 值的有效组合。

  • VUID-VkIndirectCommandsLayoutTokenNV-indirectStateFlags-parameter
    indirectStateFlags 必须VkIndirectStateFlagBitsNV 值的有效组合。

  • VUID-VkIndirectCommandsLayoutTokenNV-pIndexTypes-parameter
    如果 indexTypeCount 不为 0,则 pIndexTypes 必须 是指向 indexTypeCount 个有效的 VkIndexType 值的数组的有效指针。

  • VUID-VkIndirectCommandsLayoutTokenNV-pIndexTypeValues-parameter
    如果 indexTypeCount 不为 0,则 pIndexTypeValues 必须 是指向 indexTypeCountuint32_t 值的数组的有效指针。

以下代码提供了关于如何处理单个序列的详细信息。 对于有效使用,所有来自常规命令的限制都适用。

void cmdProcessSequence(cmd, pipeline, indirectCommandsLayout, pIndirectCommandsStreams, s)
{
  for (uint32_t t = 0; t < indirectCommandsLayout.tokenCount; t++){
    token = indirectCommandsLayout.pTokens[t];

    uint32_t stride   = indirectCommandsLayout.pStreamStrides[token.stream];
    stream            = pIndirectCommandsStreams[token.stream];
    uint32_t offset   = stream.offset + stride * s + token.offset;
    const void* input = stream.buffer.pointer( offset )

    switch(input.type){
    case VK_INDIRECT_COMMANDS_TOKEN_TYPE_SHADER_GROUP_NV:
      VkBindShaderGroupIndirectCommandNV* bind = input;

      vkCmdBindPipelineShaderGroupNV(cmd, indirectCommandsLayout.pipelineBindPoint,
        pipeline, bind->groupIndex);
    break;

    case VK_INDIRECT_COMMANDS_TOKEN_TYPE_STATE_FLAGS_NV:
      VkSetStateFlagsIndirectCommandNV* state = input;

      if (token.indirectStateFlags & VK_INDIRECT_STATE_FLAG_FRONTFACE_BIT_NV){
        if (state.data & (1 << 0)){
          set VK_FRONT_FACE_CLOCKWISE;
        } else {
          set VK_FRONT_FACE_COUNTER_CLOCKWISE;
        }
      }
    break;

    case VK_INDIRECT_COMMANDS_TOKEN_TYPE_PUSH_CONSTANT_NV:
      uint32_t* data = input;

      vkCmdPushConstants(cmd,
        token.pushconstantPipelineLayout
        token.pushconstantStageFlags,
        token.pushconstantOffset,
        token.pushconstantSize, data);
    break;

    case VK_INDIRECT_COMMANDS_TOKEN_TYPE_INDEX_BUFFER_NV:
      VkBindIndexBufferIndirectCommandNV* data = input;

      // the indexType may optionally be remapped
      // from a custom uint32_t value, via
      // VkIndirectCommandsLayoutTokenNV::pIndexTypeValues

      vkCmdBindIndexBuffer(cmd,
        deriveBuffer(data->bufferAddress),
        deriveOffset(data->bufferAddress),
        data->indexType);
    break;

    case VK_INDIRECT_COMMANDS_TOKEN_TYPE_VERTEX_BUFFER_NV:
      VkBindVertexBufferIndirectCommandNV* data = input;

      // if token.vertexDynamicStride is VK_TRUE
      // then the stride for this binding is set
      // using data->stride as well

      vkCmdBindVertexBuffers(cmd,
        token.vertexBindingUnit, 1,
        &deriveBuffer(data->bufferAddress),
        &deriveOffset(data->bufferAddress));
    break;

    case VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_INDEXED_NV:
      vkCmdDrawIndexedIndirect(cmd,
        stream.buffer, offset, 1, 0);
    break;

    case VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_NV:
      vkCmdDrawIndirect(cmd,
        stream.buffer,
        offset, 1, 0);
    break;

    // only available if VK_NV_mesh_shader is supported
    case VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_TASKS_NV:
      vkCmdDrawMeshTasksIndirectNV(cmd,
        stream.buffer, offset, 1, 0);
    break;

    // only available if VK_EXT_mesh_shader is supported
    case VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_MESH_TASKS_NV:
      vkCmdDrawMeshTasksIndirectEXT(cmd,
        stream.buffer, offset, 1, 0);
    break;

    case VK_INDIRECT_COMMANDS_TOKEN_TYPE_PIPELINE_NV:
      VkBindPipelineIndirectCommandNV *data = input;
      VkPipeline computePipeline = deriveFromDeviceAddress(data->pipelineAddress);
      vkCmdBindPipeline(cmd, VK_PIPELINE_BIND_POINT_COMPUTE, computePipeline);
    break;

    case VK_INDIRECT_COMMANDS_TOKEN_TYPE_DISPATCH_NV:
      vkCmdDispatchIndirect(cmd, stream.buffer, offset);
    break;
    }
  }
}

间接命令生成和执行

在设备上生成命令需要一个 preprocess 缓冲区。

使用 VK_EXT_device_generated_commands,要检索特定执行状态的内存大小和对齐要求,请调用

// Provided by VK_EXT_device_generated_commands
void vkGetGeneratedCommandsMemoryRequirementsEXT(
    VkDevice                                    device,
    const VkGeneratedCommandsMemoryRequirementsInfoEXT* pInfo,
    VkMemoryRequirements2*                      pMemoryRequirements);

如果返回的大小为零,则可以跳过此布局的预处理步骤。

有效用法(隐式)
  • VUID-vkGetGeneratedCommandsMemoryRequirementsEXT-device-parameter
    device 必须是有效的 VkDevice 句柄

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

  • VUID-vkGetGeneratedCommandsMemoryRequirementsEXT-pMemoryRequirements-parameter
    pMemoryRequirements 必须 是指向 VkMemoryRequirements2 结构的有效指针。

// Provided by VK_EXT_device_generated_commands
typedef struct VkGeneratedCommandsMemoryRequirementsInfoEXT {
    VkStructureType                sType;
    const void*                    pNext;
    VkIndirectExecutionSetEXT      indirectExecutionSet;
    VkIndirectCommandsLayoutEXT    indirectCommandsLayout;
    uint32_t                       maxSequenceCount;
    uint32_t                       maxDrawCount;
} VkGeneratedCommandsMemoryRequirementsInfoEXT;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • indirectExecutionSet 是用于绑定着色器的间接执行集。

  • indirectCommandsLayout 是此缓冲区内存计划使用的 VkIndirectCommandsLayoutEXT

  • maxSequenceCount 是此缓冲区内存可使用的最大序列数。

  • maxDrawCount 是任何 COUNT 类型多重间接绘制令牌可以执行的最大间接绘制次数。对于这些令牌类型,间接缓冲区中的绘制计数将被钳制为此值。

如果布局的操作命令令牌不是 COUNT 类型多重间接绘制令牌,则 maxDrawCount 将被忽略。

有效用法
  • VUID-VkGeneratedCommandsMemoryRequirementsInfoEXT-maxSequencesCount-11009
    maxSequencesCount 必须 小于或等于 VkPhysicalDeviceDeviceGeneratedCommandsPropertiesEXT::maxIndirectSequenceCount

  • VUID-VkGeneratedCommandsMemoryRequirementsInfoEXT-indirectCommandsLayout-11010
    如果使用包含 VK_INDIRECT_COMMANDS_TOKEN_TYPE_EXECUTION_SET_EXT 令牌的令牌序列创建了 indirectCommandsLayout,则 indirectExecutionSet 必须 不能是 VK_NULL_HANDLE

  • VUID-VkGeneratedCommandsMemoryRequirementsInfoEXT-indirectCommandsLayout-11151
    如果使用包含 VK_INDIRECT_COMMANDS_TOKEN_TYPE_EXECUTION_SET_EXT 令牌的令牌序列创建了 indirectCommandsLayout,则用于创建 indirectExecutionSet 初始着色器状态的着色器阶段必须 等于用于创建 indirectCommandsLayoutVkIndirectCommandsExecutionSetTokenEXT::shaderStages

  • VUID-VkGeneratedCommandsMemoryRequirementsInfoEXT-indirectCommandsLayout-11011
    如果使用不包含 VK_INDIRECT_COMMANDS_TOKEN_TYPE_EXECUTION_SET_EXT 令牌的令牌序列创建了 indirectCommandsLayout,则 indirectExecutionSet 必须VK_NULL_HANDLE

  • VUID-VkGeneratedCommandsMemoryRequirementsInfoEXT-maxDrawCount-11146
    当不被忽略时,maxDrawCount × maxSequenceCount 必须 小于 2^24

  • VUID-VkGeneratedCommandsMemoryRequirementsInfoEXT-indirectExecutionSet-11012
    如果 indirectExecutionSetVK_NULL_HANDLE,则在 pNext 链中必须 包含 VkGeneratedCommandsPipelineInfoEXTVkGeneratedCommandsShaderInfoEXT

有效用法(隐式)
  • VUID-VkGeneratedCommandsMemoryRequirementsInfoEXT-sType-sType
    sType 必须VK_STRUCTURE_TYPE_GENERATED_COMMANDS_MEMORY_REQUIREMENTS_INFO_EXT

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

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

  • VUID-VkGeneratedCommandsMemoryRequirementsInfoEXT-indirectExecutionSet-parameter
    如果 indirectExecutionSet 不是 VK_NULL_HANDLE,则 indirectExecutionSet 必须 是一个有效的 VkIndirectExecutionSetEXT 句柄

  • VUID-VkGeneratedCommandsMemoryRequirementsInfoEXT-indirectCommandsLayout-parameter
    indirectCommandsLayout 必须 是一个有效的 VkIndirectCommandsLayoutEXT 句柄

  • VUID-VkGeneratedCommandsMemoryRequirementsInfoEXT-commonparent
    indirectCommandsLayoutindirectExecutionSet(均为非忽略参数的有效句柄)都必须是从同一个 VkDevice 创建、分配或检索的。

// Provided by VK_EXT_device_generated_commands
typedef struct VkGeneratedCommandsPipelineInfoEXT {
    VkStructureType    sType;
    void*              pNext;
    VkPipeline         pipeline;
} VkGeneratedCommandsPipelineInfoEXT;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • pipeline 是一个有效的管道对象。

有效用法(隐式)
  • VUID-VkGeneratedCommandsPipelineInfoEXT-sType-sType
    sType 必须VK_STRUCTURE_TYPE_GENERATED_COMMANDS_PIPELINE_INFO_EXT

  • VUID-VkGeneratedCommandsPipelineInfoEXT-pipeline-parameter
    pipeline 必须 是一个有效的 VkPipeline 句柄

// Provided by VK_EXT_device_generated_commands
typedef struct VkGeneratedCommandsShaderInfoEXT {
    VkStructureType       sType;
    void*                 pNext;
    uint32_t              shaderCount;
    const VkShaderEXT*    pShaders;
} VkGeneratedCommandsShaderInfoEXT;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • shaderCountpShaders 数组的大小。

  • pShaders 是指向着色器对象数组的指针。

有效用法
  • VUID-VkGeneratedCommandsShaderInfoEXT-pShaders-11127
    对于给定的 VkShaderStageFlagBits 阶段,pShaders 必须 不能包含多个着色器对象

有效用法(隐式)
  • VUID-VkGeneratedCommandsShaderInfoEXT-sType-sType
    sType 必须VK_STRUCTURE_TYPE_GENERATED_COMMANDS_SHADER_INFO_EXT

  • VUID-VkGeneratedCommandsShaderInfoEXT-pShaders-parameter
    pShaders 必须 是指向 shaderCount 个有效 VkShaderEXT 句柄的数组的有效指针

  • VUID-VkGeneratedCommandsShaderInfoEXT-shaderCount-arraylength
    shaderCount 必须 大于 0

使用 VK_NV_device_generated_commands,要检索特定执行状态的内存大小和对齐要求,请调用

// Provided by VK_NV_device_generated_commands
void vkGetGeneratedCommandsMemoryRequirementsNV(
    VkDevice                                    device,
    const VkGeneratedCommandsMemoryRequirementsInfoNV* pInfo,
    VkMemoryRequirements2*                      pMemoryRequirements);
有效用法
有效用法(隐式)
  • VUID-vkGetGeneratedCommandsMemoryRequirementsNV-device-parameter
    device 必须是有效的 VkDevice 句柄

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

  • VUID-vkGetGeneratedCommandsMemoryRequirementsNV-pMemoryRequirements-parameter
    pMemoryRequirements 必须 是指向 VkMemoryRequirements2 结构的有效指针。

// Provided by VK_NV_device_generated_commands
typedef struct VkGeneratedCommandsMemoryRequirementsInfoNV {
    VkStructureType               sType;
    const void*                   pNext;
    VkPipelineBindPoint           pipelineBindPoint;
    VkPipeline                    pipeline;
    VkIndirectCommandsLayoutNV    indirectCommandsLayout;
    uint32_t                      maxSequencesCount;
} VkGeneratedCommandsMemoryRequirementsInfoNV;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • pipelineBindPointVkPipelineBindPoint,此缓冲区内存计划在执行期间与 pipeline 一起使用。

  • pipelineVkPipeline,此缓冲区内存计划在执行期间与此管道一起使用。

  • indirectCommandsLayout 是此缓冲区内存计划使用的 VkIndirectCommandsLayoutNV

  • maxSequencesCount 是此缓冲区内存与其他提供的状态组合后可以使用的最大序列数。

有效用法
  • VUID-VkGeneratedCommandsMemoryRequirementsInfoNV-maxSequencesCount-02907
    maxSequencesCount 必须小于或等于 VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV::maxIndirectSequenceCount

  • VUID-VkGeneratedCommandsMemoryRequirementsInfoNV-pipelineBindPoint-09075
    如果 pipelineBindPoint 的类型为 VK_PIPELINE_BIND_POINT_GRAPHICS,则 pipeline 必须是有效的 VkPipeline 句柄

  • VUID-VkGeneratedCommandsMemoryRequirementsInfoNV-pipelineBindPoint-09076
    如果 pipelineBindPoint 的类型为 VK_PIPELINE_BIND_POINT_COMPUTE,并且 indirectCommandsLayout 不是使用 VK_INDIRECT_COMMANDS_TOKEN_TYPE_PIPELINE_NV 令牌创建的,则 pipeline 必须是有效的 VkPipeline 句柄

  • VUID-VkGeneratedCommandsMemoryRequirementsInfoNV-pipelineBindPoint-09077
    如果 pipelineBindPoint 的类型为 VK_PIPELINE_BIND_POINT_COMPUTE,并且 indirectCommandsLayout 包含 VK_INDIRECT_COMMANDS_TOKEN_TYPE_PIPELINE_NV 令牌,则 pipeline 必须VK_NULL_HANDLE

有效用法(隐式)
  • VUID-VkGeneratedCommandsMemoryRequirementsInfoNV-sType-sType
    sType 必须VK_STRUCTURE_TYPE_GENERATED_COMMANDS_MEMORY_REQUIREMENTS_INFO_NV

  • VUID-VkGeneratedCommandsMemoryRequirementsInfoNV-pNext-pNext
    pNext 必须NULL

  • VUID-VkGeneratedCommandsMemoryRequirementsInfoNV-pipelineBindPoint-parameter
    pipelineBindPoint 必须 是有效的 VkPipelineBindPoint 值。

  • VUID-VkGeneratedCommandsMemoryRequirementsInfoNV-pipeline-parameter
    如果 pipeline 不是 VK_NULL_HANDLE,则 pipeline 必须是有效的 VkPipeline 句柄

  • VUID-VkGeneratedCommandsMemoryRequirementsInfoNV-indirectCommandsLayout-parameter
    indirectCommandsLayout 必须是有效的 VkIndirectCommandsLayoutNV 句柄

  • VUID-VkGeneratedCommandsMemoryRequirementsInfoNV-commonparent
    indirectCommandsLayoutpipeline(它们是非忽略参数的有效句柄)都必须已从同一个 VkDevice 创建、分配或检索。

使用 VK_NV_device_generated_commands,要在设备生成的命令中绑定计算管线,应用程序必须查询该管线的设备地址。

要查询计算管线的 64 位设备地址,请调用

// Provided by VK_NV_device_generated_commands_compute
VkDeviceAddress vkGetPipelineIndirectDeviceAddressNV(
    VkDevice                                    device,
    const VkPipelineIndirectDeviceAddressInfoNV* pInfo);
有效用法
有效用法(隐式)
  • VUID-vkGetPipelineIndirectDeviceAddressNV-device-parameter
    device 必须是有效的 VkDevice 句柄

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

VkPipelineIndirectDeviceAddressInfoNV 结构的定义如下:

// Provided by VK_NV_device_generated_commands_compute
typedef struct VkPipelineIndirectDeviceAddressInfoNV {
    VkStructureType        sType;
    const void*            pNext;
    VkPipelineBindPoint    pipelineBindPoint;
    VkPipeline             pipeline;
} VkPipelineIndirectDeviceAddressInfoNV;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • pipelineBindPoint 是一个 VkPipelineBindPoint 值,指定要查询其设备地址的管线类型。

  • pipeline 指定要查询其设备地址的管线。

有效用法
  • VUID-VkPipelineIndirectDeviceAddressInfoNV-pipelineBindPoint-09079
    提供的 pipelineBindPoint 必须VK_PIPELINE_BIND_POINT_COMPUTE 类型

  • VUID-VkPipelineIndirectDeviceAddressInfoNV-pipeline-09080
    pipeline 必须已使用设置的标志 VK_PIPELINE_CREATE_INDIRECT_BINDABLE_BIT_NV 创建

  • VUID-VkPipelineIndirectDeviceAddressInfoNV-pipeline-09081
    pipeline 必须已使用 VkComputePipelineIndirectBufferInfoNV 结构创建,该结构指定将保存其元数据的有效地址

有效用法(隐式)
  • VUID-VkPipelineIndirectDeviceAddressInfoNV-sType-sType
    sType 必须VK_STRUCTURE_TYPE_PIPELINE_INDIRECT_DEVICE_ADDRESS_INFO_NV

  • VUID-VkPipelineIndirectDeviceAddressInfoNV-pNext-pNext
    pNext 必须NULL

  • VUID-VkPipelineIndirectDeviceAddressInfoNV-pipelineBindPoint-parameter
    pipelineBindPoint 必须 是有效的 VkPipelineBindPoint 值。

  • VUID-VkPipelineIndirectDeviceAddressInfoNV-pipeline-parameter
    pipeline 必须 是一个有效的 VkPipeline 句柄

要确定计算管线元数据的内存要求,请调用

// Provided by VK_NV_device_generated_commands_compute
void vkGetPipelineIndirectMemoryRequirementsNV(
    VkDevice                                    device,
    const VkComputePipelineCreateInfo*          pCreateInfo,
    VkMemoryRequirements2*                      pMemoryRequirements);
  • device 是拥有缓冲区的逻辑设备。

  • pCreateInfo 是一个 VkComputePipelineCreateInfo 结构,用于指定要查询其内存要求的计算管线的创建参数。

  • pMemoryRequirements 是指向 VkMemoryRequirements2 结构的指针,其中返回所请求管线的内存要求。

如果 pCreateInfo->pNext 链包含指向 VkComputePipelineIndirectBufferInfoNV 结构的指针,则忽略该结构的内容。

有效用法
有效用法(隐式)
  • VUID-vkGetPipelineIndirectMemoryRequirementsNV-device-parameter
    device 必须是有效的 VkDevice 句柄

  • VUID-vkGetPipelineIndirectMemoryRequirementsNV-pCreateInfo-parameter
    pCreateInfo 必须是指向有效的 VkComputePipelineCreateInfo 结构的有效指针

  • VUID-vkGetPipelineIndirectMemoryRequirementsNV-pMemoryRequirements-parameter
    pMemoryRequirements 必须 是指向 VkMemoryRequirements2 结构的有效指针。

间接执行集

间接执行集包含可以单独绑定的管线或着色器对象集合。

// Provided by VK_EXT_device_generated_commands
VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkIndirectExecutionSetEXT)

间接执行集允许设备使用设备生成的命令绑定不同的着色器和管线状态。

间接执行集通过调用以下函数创建:

// Provided by VK_EXT_device_generated_commands
VkResult vkCreateIndirectExecutionSetEXT(
    VkDevice                                    device,
    const VkIndirectExecutionSetCreateInfoEXT*  pCreateInfo,
    const VkAllocationCallbacks*                pAllocator,
    VkIndirectExecutionSetEXT*                  pIndirectExecutionSet);
  • device 是创建间接执行集的逻辑设备。

  • pCreateInfo 是指向 VkIndirectExecutionSetCreateInfoEXT 结构的指针,该结构包含影响间接执行集创建的参数。

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

  • pIndirectExecutionSet 是指向 VkIndirectExecutionSetEXT 句柄的指针,其中返回生成的间接执行集。

有效用法
有效用法(隐式)
  • VUID-vkCreateIndirectExecutionSetEXT-device-parameter
    device 必须是有效的 VkDevice 句柄

  • VUID-vkCreateIndirectExecutionSetEXT-pCreateInfo-parameter
    pCreateInfo 必须是指向有效的 VkIndirectExecutionSetCreateInfoEXT 结构的有效指针

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

  • VUID-vkCreateIndirectExecutionSetEXT-pIndirectExecutionSet-parameter
    pIndirectExecutionSet 必须是指向 VkIndirectExecutionSetEXT 句柄的有效指针

返回码
成功
  • VK_SUCCESS

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_OUT_OF_DEVICE_MEMORY

VkIndirectExecutionSetCreateInfoEXT 结构定义如下:

// Provided by VK_EXT_device_generated_commands
typedef struct VkIndirectExecutionSetCreateInfoEXT {
    VkStructureType                      sType;
    const void*                          pNext;
    VkIndirectExecutionSetInfoTypeEXT    type;
    VkIndirectExecutionSetInfoEXT        info;
} VkIndirectExecutionSetCreateInfoEXT;
有效用法
  • VUID-VkIndirectExecutionSetCreateInfoEXT-maxIndirectShaderObjectCount-11014
    如果 VkPhysicalDeviceDeviceGeneratedCommandsPropertiesEXT::maxIndirectShaderObjectCount 为零或者 shaderObject 功能未启用,则 type 必须不能是 VK_INDIRECT_EXECUTION_SET_INFO_TYPE_SHADER_OBJECTS_EXT

有效用法(隐式)
  • VUID-VkIndirectExecutionSetCreateInfoEXT-sType-sType
    sType 必须VK_STRUCTURE_TYPE_INDIRECT_EXECUTION_SET_CREATE_INFO_EXT

  • VUID-VkIndirectExecutionSetCreateInfoEXT-type-parameter
    type 必须是有效的 VkIndirectExecutionSetInfoTypeEXT

  • VUID-VkIndirectExecutionSetCreateInfoEXT-pPipelineInfo-parameter
    如果 typeVK_INDIRECT_EXECUTION_SET_INFO_TYPE_PIPELINES_EXT,则 infopPipelineInfo 成员 必须是指向有效的 VkIndirectExecutionSetPipelineInfoEXT 结构的有效指针

  • VUID-VkIndirectExecutionSetCreateInfoEXT-pShaderInfo-parameter
    如果 typeVK_INDIRECT_EXECUTION_SET_INFO_TYPE_SHADER_OBJECTS_EXT,则 infopShaderInfo 成员 必须是指向有效的 VkIndirectExecutionSetShaderInfoEXT 结构的有效指针

可以在 VkIndirectExecutionSetCreateInfoEXT::type 中设置的值,指定间接执行集的内容为:

// Provided by VK_EXT_device_generated_commands
typedef enum VkIndirectExecutionSetInfoTypeEXT {
    VK_INDIRECT_EXECUTION_SET_INFO_TYPE_PIPELINES_EXT = 0,
    VK_INDIRECT_EXECUTION_SET_INFO_TYPE_SHADER_OBJECTS_EXT = 1,
} VkIndirectExecutionSetInfoTypeEXT;
  • VK_INDIRECT_EXECUTION_SET_INFO_TYPE_PIPELINES_EXT 指定间接执行集包含 VkPipeline 对象。

  • VK_INDIRECT_EXECUTION_SET_INFO_TYPE_SHADER_OBJECTS_EXT 指定间接执行集包含 VkShaderEXT 对象。

VkIndirectExecutionSetInfoEXT 联合体定义如下:

// Provided by VK_EXT_device_generated_commands
typedef union VkIndirectExecutionSetInfoEXT {
    const VkIndirectExecutionSetPipelineInfoEXT*    pPipelineInfo;
    const VkIndirectExecutionSetShaderInfoEXT*      pShaderInfo;
} VkIndirectExecutionSetInfoEXT;

VkIndirectExecutionSetPipelineInfoEXT 结构定义如下:

// Provided by VK_EXT_device_generated_commands
typedef struct VkIndirectExecutionSetPipelineInfoEXT {
    VkStructureType    sType;
    const void*        pNext;
    VkPipeline         initialPipeline;
    uint32_t           maxPipelineCount;
} VkIndirectExecutionSetPipelineInfoEXT;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • initialPipeline 是该集合的初始管线。此管线将自动添加到集合的索引 0

  • maxPipelineCount 是集合中存储的最大管线数。

即使 initialPipeline 从集合中删除或销毁,其特性也将用于验证添加到集合的所有管线。

当使用使用管线创建的间接执行集时,initialPipeline 构成初始着色器状态。

有效用法
  • VUID-VkIndirectExecutionSetPipelineInfoEXT-supportedIndirectCommandsShaderStagesPipelineBinding-11015
    如果 VkPhysicalDeviceDeviceGeneratedCommandsPropertiesEXT::supportedIndirectCommandsShaderStagesPipelineBinding 不包含 VK_SHADER_STAGE_COMPUTE_BIT,则 initialPipelineVkPipelineBindPoint 必须不能是 VK_PIPELINE_BIND_POINT_COMPUTE

  • VUID-VkIndirectExecutionSetPipelineInfoEXT-supportedIndirectCommandsShaderStagesPipelineBinding-11016
    如果 VkPhysicalDeviceDeviceGeneratedCommandsPropertiesEXT::supportedIndirectCommandsShaderStagesPipelineBinding 不包含 VK_SHADER_STAGE_FRAGMENT_BIT,则 initialPipelineVkPipelineBindPoint 必须不能是 VK_PIPELINE_BIND_POINT_GRAPHICS

  • VUID-VkIndirectExecutionSetPipelineInfoEXT-supportedIndirectCommandsShaderStagesPipelineBinding-11017
    如果 VkPhysicalDeviceDeviceGeneratedCommandsPropertiesEXT::supportedIndirectCommandsShaderStagesPipelineBinding 不包含光线追踪阶段,则 initialPipelineVkPipelineBindPoint 必须不能是 VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR

  • VUID-VkIndirectExecutionSetPipelineInfoEXT-maxPipelineCount-11018
    maxPipelineCount 必须介于 1VkPhysicalDeviceDeviceGeneratedCommandsPropertiesEXT::maxIndirectPipelineCount 之间

  • VUID-VkIndirectExecutionSetPipelineInfoEXT-initialPipeline-11019
    initialPipeline 必须 不使用类型为 VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMICVK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC 的描述符。

  • VUID-VkIndirectExecutionSetPipelineInfoEXT-initialPipeline-11153
    initialPipeline 必须 使用 VK_PIPELINE_CREATE_2_INDIRECT_BINDABLE_BIT_EXT 创建。

有效用法(隐式)
  • VUID-VkIndirectExecutionSetPipelineInfoEXT-sType-sType
    sType 必须VK_STRUCTURE_TYPE_INDIRECT_EXECUTION_SET_PIPELINE_INFO_EXT

  • VUID-VkIndirectExecutionSetPipelineInfoEXT-initialPipeline-parameter
    initialPipeline 必须 是有效的 VkPipeline 句柄。

VkIndirectExecutionSetShaderInfoEXT 结构定义如下:

// Provided by VK_EXT_device_generated_commands
typedef struct VkIndirectExecutionSetShaderInfoEXT {
    VkStructureType                                     sType;
    const void*                                         pNext;
    uint32_t                                            shaderCount;
    const VkShaderEXT*                                  pInitialShaders;
    const VkIndirectExecutionSetShaderLayoutInfoEXT*    pSetLayoutInfos;
    uint32_t                                            maxShaderCount;
    uint32_t                                            pushConstantRangeCount;
    const VkPushConstantRange*                          pPushConstantRanges;
} VkIndirectExecutionSetShaderInfoEXT;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • shaderCountpInitialShaderspSetLayoutInfos 数组中的成员数量。

  • pInitialShaders 是一个指针,指向一个数组,该数组包含集合中将使用的每个着色器阶段的 VkShaderEXT 对象。这些着色器将自动添加到集合中,从索引 0 开始。

  • pSetLayoutInfos 是一个指针,指向一个数组,该数组包含集合中每个对应的 pInitialShaders 着色器阶段使用的 VkIndirectExecutionSetShaderLayoutInfoEXT

  • maxShaderCount 是集合中存储的最大着色器对象数量。

  • pushConstantRangeCountpPushConstantRanges 数组中的成员数量。

  • pPushConstantRanges 是一个指针,指向集合中所有着色器使用的 VkPushConstantRange 范围的数组。

即使从集合中删除或销毁 pInitialShaders,其特征也将用于验证添加到集合中的所有着色器。

当使用着色器对象创建的间接执行集时,pInitialShaders 构成初始着色器状态。

有效用法
  • VUID-VkIndirectExecutionSetShaderInfoEXT-pInitialShaders-11020
    pInitialShaders 的所有成员的 stage 必须VkPhysicalDeviceDeviceGeneratedCommandsPropertiesEXT::supportedIndirectCommandsShaderStagesShaderBinding 支持。

  • VUID-VkIndirectExecutionSetShaderInfoEXT-maxShaderCount-11021
    maxShaderCount 必须 不为零。

  • VUID-VkIndirectExecutionSetShaderInfoEXT-maxShaderCount-11022
    maxShaderCount 必须 小于或等于 VkPhysicalDeviceDeviceGeneratedCommandsPropertiesEXT::maxIndirectShaderObjectCount

  • VUID-VkIndirectExecutionSetShaderInfoEXT-maxShaderCount-11036
    maxShaderCount 必须 大于或等于 shaderCount

  • VUID-VkIndirectExecutionSetShaderInfoEXT-stage-11023
    pInitialShaders 数组中每个元素的 stage 必须 是唯一的。

  • VUID-VkIndirectExecutionSetShaderInfoEXT-pInitialShaders-11154
    pInitialShaders 的每个成员 必须 使用 VK_SHADER_CREATE_INDIRECT_BINDABLE_BIT_EXT 创建。

有效用法(隐式)
  • VUID-VkIndirectExecutionSetShaderInfoEXT-sType-sType
    sType 必须VK_STRUCTURE_TYPE_INDIRECT_EXECUTION_SET_SHADER_INFO_EXT

  • VUID-VkIndirectExecutionSetShaderInfoEXT-pInitialShaders-parameter
    pInitialShaders 必须 是一个有效指针,指向包含 shaderCount 个有效 VkShaderEXT 句柄的数组。

  • VUID-VkIndirectExecutionSetShaderInfoEXT-pSetLayoutInfos-parameter
    如果 pSetLayoutInfos 不是 NULL,则 pSetLayoutInfos 必须 是一个有效指针,指向包含 shaderCount 个有效 VkIndirectExecutionSetShaderLayoutInfoEXT 结构的数组。

  • VUID-VkIndirectExecutionSetShaderInfoEXT-pPushConstantRanges-parameter
    如果 pushConstantRangeCount 不为 0,则 pPushConstantRanges 必须 是一个有效指针,指向包含 pushConstantRangeCount 个有效 VkPushConstantRange 结构的数组。

  • VUID-VkIndirectExecutionSetShaderInfoEXT-shaderCount-arraylength
    shaderCount 必须 大于 0

VkIndirectExecutionSetShaderLayoutInfoEXT 结构定义如下:

// Provided by VK_EXT_device_generated_commands
typedef struct VkIndirectExecutionSetShaderLayoutInfoEXT {
    VkStructureType                 sType;
    const void*                     pNext;
    uint32_t                        setLayoutCount;
    const VkDescriptorSetLayout*    pSetLayouts;
} VkIndirectExecutionSetShaderLayoutInfoEXT;
  • setLayoutCountpSetLayouts 数组中的成员数量。

  • pSetLayouts 是一个指针,指向一个数组,该数组包含着色器阶段使用的 VkDescriptorSetLayout 对象。

有效用法
  • VUID-VkIndirectExecutionSetShaderLayoutInfoEXT-pSetLayouts-11024
    pSetLayouts 的所有成员 必须 不包含类型为 VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMICVK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC 的描述符。

有效用法(隐式)
  • VUID-VkIndirectExecutionSetShaderLayoutInfoEXT-sType-sType
    sType 必须VK_STRUCTURE_TYPE_INDIRECT_EXECUTION_SET_SHADER_LAYOUT_INFO_EXT

  • VUID-VkIndirectExecutionSetShaderLayoutInfoEXT-pSetLayouts-parameter
    如果 setLayoutCount 不为 0,则 pSetLayouts 必须 是一个有效指针,指向包含 setLayoutCount 个有效或 VK_NULL_HANDLEVkDescriptorSetLayout 句柄的数组。

通过调用以下函数销毁间接执行集:

// Provided by VK_EXT_device_generated_commands
void vkDestroyIndirectExecutionSetEXT(
    VkDevice                                    device,
    VkIndirectExecutionSetEXT                   indirectExecutionSet,
    const VkAllocationCallbacks*                pAllocator);
  • device 是拥有间接执行集的逻辑设备。

  • indirectExecutionSet 是要销毁的间接执行集。

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

有效用法
  • VUID-vkDestroyIndirectExecutionSetEXT-indirectExecutionSet-11025
    所有引用 indirectExecutionSet 的已提交命令 必须 已完成执行。

有效用法(隐式)
  • VUID-vkDestroyIndirectExecutionSetEXT-device-parameter
    device 必须是有效的 VkDevice 句柄

  • VUID-vkDestroyIndirectExecutionSetEXT-indirectExecutionSet-parameter
    如果 indirectExecutionSet 不是 VK_NULL_HANDLE,则 indirectExecutionSet 必须 是一个有效的 VkIndirectExecutionSetEXT 句柄

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

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

主机同步
  • indirectExecutionSet 的主机访问 必须 在外部同步。

VkWriteIndirectExecutionSetPipelineEXT 结构定义如下:

// Provided by VK_EXT_device_generated_commands
typedef struct VkWriteIndirectExecutionSetPipelineEXT {
    VkStructureType    sType;
    const void*        pNext;
    uint32_t           index;
    VkPipeline         pipeline;
} VkWriteIndirectExecutionSetPipelineEXT;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • index 是要更新的集合的元素。

  • pipeline 是要存储在间接执行集中的管线。

有效用法
  • VUID-VkWriteIndirectExecutionSetPipelineEXT-index-11026
    index 必须 小于用于创建该集合的 VkIndirectExecutionSetPipelineInfoEXT::maxPipelineCount 的值。

  • VUID-VkWriteIndirectExecutionSetPipelineEXT-pipeline-11027
    pipeline 必须 使用 VK_PIPELINE_CREATE_2_INDIRECT_BINDABLE_BIT_EXT 创建。

  • VUID-VkWriteIndirectExecutionSetPipelineEXT-index-11029
    提交的命令缓冲区必须不引用 index

  • VUID-VkWriteIndirectExecutionSetPipelineEXT-pipeline-11030
    pipeline 中包含的着色器阶段必须VkPhysicalDeviceDeviceGeneratedCommandsPropertiesEXT::supportedIndirectCommandsShaderStagesPipelineBinding 支持。

有效用法(隐式)
  • VUID-VkWriteIndirectExecutionSetPipelineEXT-sType-sType
    sType 必须VK_STRUCTURE_TYPE_WRITE_INDIRECT_EXECUTION_SET_PIPELINE_EXT

  • VUID-VkWriteIndirectExecutionSetPipelineEXT-pipeline-parameter
    pipeline 必须 是一个有效的 VkPipeline 句柄

VkWriteIndirectExecutionSetShaderEXT 结构体定义如下:

// Provided by VK_EXT_device_generated_commands with VK_EXT_shader_object
typedef struct VkWriteIndirectExecutionSetShaderEXT {
    VkStructureType    sType;
    const void*        pNext;
    uint32_t           index;
    VkShaderEXT        shader;
} VkWriteIndirectExecutionSetShaderEXT;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • index 是要更新的集合的元素。

  • shader 是要存储在间接执行集中的着色器。

着色器不需要按照其阶段存储在间接执行集中。对于集合内的着色器索引,唯一的限制是索引的值必须小于集合中着色器的最大数量。

有效用法
  • VUID-VkWriteIndirectExecutionSetShaderEXT-index-11031
    index 必须 小于 VkIndirectExecutionSetShaderInfoEXT::maxShaderCount

  • VUID-VkWriteIndirectExecutionSetShaderEXT-shader-11032
    shader 必须 使用 VK_SHADER_CREATE_INDIRECT_BINDABLE_BIT_EXT 创建。

  • VUID-VkWriteIndirectExecutionSetShaderEXT-pInitialShaders-11033
    具有相同 VkShaderStageFlagBits 的着色器必须已在 VkIndirectExecutionSetShaderInfoEXT::pInitialShaders 数组中传递。

  • VUID-VkWriteIndirectExecutionSetShaderEXT-index-11034
    提交的命令缓冲区必须未使用 index

有效用法(隐式)
  • VUID-VkWriteIndirectExecutionSetShaderEXT-sType-sType
    sType 必须VK_STRUCTURE_TYPE_WRITE_INDIRECT_EXECUTION_SET_SHADER_EXT

  • VUID-VkWriteIndirectExecutionSetShaderEXT-shader-parameter
    shader 必须 是有效的 VkShaderEXT 句柄。

可以通过调用以下方法更新间接执行集中的管线元素:

// Provided by VK_EXT_device_generated_commands
void vkUpdateIndirectExecutionSetPipelineEXT(
    VkDevice                                    device,
    VkIndirectExecutionSetEXT                   indirectExecutionSet,
    uint32_t                                    executionSetWriteCount,
    const VkWriteIndirectExecutionSetPipelineEXT* pExecutionSetWrites);
  • device 是拥有间接执行集的逻辑设备。

  • indirectExecutionSet 是正在更新的间接执行集。

  • executionSetWriteCountpExecutionSetWrites 数组中的元素数量。

  • pExecutionSetWrites 是指向 VkWriteIndirectExecutionSetPipelineEXT 结构体数组的指针,这些结构体描述了要更新的元素。

有效用法
  • VUID-vkUpdateIndirectExecutionSetPipelineEXT-indirectExecutionSet-11035
    indirectExecutionSet 必须 使用类型 VK_INDIRECT_EXECUTION_SET_INFO_TYPE_PIPELINES_EXT 创建。

  • VUID-vkUpdateIndirectExecutionSetPipelineEXT-executionSetWriteCount-11037
    executionSetWriteCount 必须 小于或等于 VkIndirectExecutionSetPipelineInfoEXT::maxPipelineCount

  • VUID-vkUpdateIndirectExecutionSetPipelineEXT-pExecutionSetWrites-11042
    pExecutionSetWrites 数组中的每个元素都必须具有唯一的 VkWriteIndirectExecutionSetPipelineEXT::index

  • VUID-vkUpdateIndirectExecutionSetPipelineEXT-None-11038
    更新命令引用的间接执行集中的每个成员必须不被设备使用。

  • VUID-vkUpdateIndirectExecutionSetPipelineEXT-None-11039
    pExecutionSetWrites 中每个管线的布局必须与用于创建间接执行集的 initialPipeline 兼容

  • VUID-vkUpdateIndirectExecutionSetPipelineEXT-None-11040
    间接执行集中的每个管线必须与用于创建间接执行集的 initialPipeline 具有相同定义的静态和动态状态值。

  • VUID-vkUpdateIndirectExecutionSetPipelineEXT-initialPipeline-11147
    间接执行集中的每个管线必须与用于创建间接执行集的 initialPipeline 具有相同定义的 片段输出接口

  • VUID-vkUpdateIndirectExecutionSetPipelineEXT-initialPipeline-11152
    间接执行集中的每个管线必须在包含的着色器阶段中与用于创建间接执行集的 initialPipeline 匹配。

  • VUID-vkUpdateIndirectExecutionSetPipelineEXT-initialPipeline-11098
    间接执行集中的每个管线必须在使用 FragDepth 方面与用于创建间接执行集的 initialPipeline 匹配。

  • VUID-vkUpdateIndirectExecutionSetPipelineEXT-initialPipeline-11086
    间接执行集中的每个管线必须在使用 SampleMask 方面与用于创建间接执行集的 initialPipeline 匹配。

  • VUID-vkUpdateIndirectExecutionSetPipelineEXT-initialPipeline-11085
    间接执行集中的每个管线必须在使用 StencilExportEXT 方面与用于创建间接执行集的 initialPipeline 匹配。

有效用法(隐式)
  • VUID-vkUpdateIndirectExecutionSetPipelineEXT-device-parameter
    device 必须是有效的 VkDevice 句柄

  • VUID-vkUpdateIndirectExecutionSetPipelineEXT-indirectExecutionSet-parameter
    indirectExecutionSet 必须 是一个有效的 VkIndirectExecutionSetEXT 句柄

  • VUID-vkUpdateIndirectExecutionSetPipelineEXT-pExecutionSetWrites-parameter
    pExecutionSetWrites 必须 是一个指向 executionSetWriteCount 个有效 VkWriteIndirectExecutionSetPipelineEXT 结构体数组的有效指针

  • VUID-vkUpdateIndirectExecutionSetPipelineEXT-executionSetWriteCount-arraylength
    executionSetWriteCount 必须 大于 0

  • VUID-vkUpdateIndirectExecutionSetPipelineEXT-indirectExecutionSet-parent
    indirectExecutionSet 必须 已从 device 创建、分配或检索

主机同步
  • indirectExecutionSet 的主机访问 必须 在外部同步。

可以通过调用来更新间接执行集中的着色器对象元素

// Provided by VK_EXT_device_generated_commands
void vkUpdateIndirectExecutionSetShaderEXT(
    VkDevice                                    device,
    VkIndirectExecutionSetEXT                   indirectExecutionSet,
    uint32_t                                    executionSetWriteCount,
    const VkWriteIndirectExecutionSetShaderEXT* pExecutionSetWrites);
  • device 是拥有间接执行集的逻辑设备。

  • indirectExecutionSet 是正在更新的间接执行集。

  • executionSetWriteCountpExecutionSetWrites 数组中的元素数量。

  • pExecutionSetWrites 是指向 VkWriteIndirectExecutionSetShaderEXT 结构体数组的指针,描述要更新的元素。

有效用法
  • VUID-vkUpdateIndirectExecutionSetShaderEXT-indirectExecutionSet-11041
    indirectExecutionSet 必须 使用 VK_INDIRECT_EXECUTION_SET_INFO_TYPE_SHADER_OBJECTS_EXT 类型创建

  • VUID-vkUpdateIndirectExecutionSetShaderEXT-pExecutionSetWrites-11043
    pExecutionSetWrites 数组中的每个元素都必须具有唯一的 VkWriteIndirectExecutionSetShaderEXT::index

  • VUID-vkUpdateIndirectExecutionSetShaderEXT-None-11044
    更新命令引用的间接执行集中的每个成员必须不被设备使用。

  • VUID-vkUpdateIndirectExecutionSetShaderEXT-pExecutionSetWrites-11140
    pExecutionSetWrites 中每个着色器的描述符布局必须与用于创建间接执行集的初始布局信息 兼容

  • VUID-vkUpdateIndirectExecutionSetShaderEXT-None-11148
    间接执行集中的每个片段着色器元素必须具有与用于创建间接执行集的初始着色器状态相同的 片段输出接口 定义

  • VUID-vkUpdateIndirectExecutionSetShaderEXT-FragDepth-11054
    间接执行集中的每个片段着色器元素必须与用于创建间接执行集的初始着色器状态在 FragDepth 的使用上匹配

  • VUID-vkUpdateIndirectExecutionSetShaderEXT-SampleMask-11050
    间接执行集中的每个片段着色器元素必须与用于创建间接执行集的初始着色器状态在 SampleMask 的使用上匹配

  • VUID-vkUpdateIndirectExecutionSetShaderEXT-StencilExportEXT-11003
    间接执行集中的每个片段着色器元素必须与用于创建间接执行集的初始着色器状态在 StencilExportEXT 的使用上匹配

有效用法(隐式)
  • VUID-vkUpdateIndirectExecutionSetShaderEXT-device-parameter
    device 必须是有效的 VkDevice 句柄

  • VUID-vkUpdateIndirectExecutionSetShaderEXT-indirectExecutionSet-parameter
    indirectExecutionSet 必须 是一个有效的 VkIndirectExecutionSetEXT 句柄

  • VUID-vkUpdateIndirectExecutionSetShaderEXT-pExecutionSetWrites-parameter
    pExecutionSetWrites 必须 是一个指向 executionSetWriteCount 个有效 VkWriteIndirectExecutionSetShaderEXT 结构体数组的有效指针

  • VUID-vkUpdateIndirectExecutionSetShaderEXT-executionSetWriteCount-arraylength
    executionSetWriteCount 必须 大于 0

  • VUID-vkUpdateIndirectExecutionSetShaderEXT-indirectExecutionSet-parent
    indirectExecutionSet 必须 已从 device 创建、分配或检索

主机同步
  • indirectExecutionSet 的主机访问 必须 在外部同步。

更新正在使用中的间接执行集是合法的,只要 pExecutionSetWrites 中的元素索引没有被使用即可。 对间接执行集的任何更改都需要通过调用 vkGetGeneratedCommandsMemoryRequirementsEXT 重新计算使用该修改状态的命令的内存需求。 正在使用中的命令或那些不使用更新元素的命令不需要更改。

集合中包含的管线和着色器对象的生命周期必须与集合的生命周期匹配或超过集合的生命周期。

使用 VK_NV_device_generated_commands,命令的实际生成以及它们在设备上的执行被作为单个操作处理,使用

// Provided by VK_NV_device_generated_commands
void vkCmdExecuteGeneratedCommandsNV(
    VkCommandBuffer                             commandBuffer,
    VkBool32                                    isPreprocessed,
    const VkGeneratedCommandsInfoNV*            pGeneratedCommandsInfo);
  • commandBuffer 是将命令记录到的命令缓冲区。

  • isPreprocessed 表示输入数据是否已在设备上预处理。 如果为 VK_FALSE,此命令将隐式触发预处理步骤,否则不会。

  • pGeneratedCommandsInfo 是指向 VkGeneratedCommandsInfoNV 结构的指针,该结构包含影响命令生成的参数。

如果使用 VK_INDIRECT_COMMANDS_LAYOUT_USAGE_UNORDERED_SEQUENCES_BIT_NV 标志来创建 VkGeneratedCommandsInfoNV::indirectCommandsLayout,则通过此命令执行的各个绘制操作的顺序可能以任何顺序执行,并且可能不一定与 VkGeneratedCommandsInfoNV::pStreams 中指定的顺序相同。

通过此命令执行的各个分派操作的顺序可能以任何顺序执行,并且可能不一定与 VkGeneratedCommandsInfoNV::pStreams 中指定的顺序相同。

有效用法
  • VUID-vkCmdExecuteGeneratedCommandsNV-magFilter-04553
    如果使用一个 VkSampler (其 magFilterminFilter 等于 VK_FILTER_LINEARreductionMode 等于 VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE,且 compareEnable 等于 VK_FALSE) 来采样一个 VkImageView,作为此命令的结果,则该图像视图的 格式特性 必须包含 VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT

  • VUID-vkCmdExecuteGeneratedCommandsNV-magFilter-09598
    如果使用一个 VkSampler (其 magFilterminFilter 等于 VK_FILTER_LINEAR,且 reductionMode 等于 VK_SAMPLER_REDUCTION_MODE_MINVK_SAMPLER_REDUCTION_MODE_MAX) 来采样一个 VkImageView,作为此命令的结果,则该图像视图的 格式特性 必须包含 VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_MINMAX_BIT

  • VUID-vkCmdExecuteGeneratedCommandsNV-mipmapMode-04770
    如果使用一个 VkSampler (其 mipmapMode 等于 VK_SAMPLER_MIPMAP_MODE_LINEARreductionMode 等于 VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE,且 compareEnable 等于 VK_FALSE) 来采样一个 VkImageView,作为此命令的结果,则该图像视图的 格式特性 必须包含 VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT

  • VUID-vkCmdExecuteGeneratedCommandsNV-mipmapMode-09599
    如果使用一个 VkSampler (其 mipmapMode 等于 VK_SAMPLER_MIPMAP_MODE_LINEAR,且 reductionMode 等于 VK_SAMPLER_REDUCTION_MODE_MINVK_SAMPLER_REDUCTION_MODE_MAX) 来采样一个 VkImageView,作为此命令的结果,则该图像视图的 格式特性 必须包含 VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_MINMAX_BIT

  • VUID-vkCmdExecuteGeneratedCommandsNV-unnormalizedCoordinates-09635
    如果使用一个 VkSampler (其 unnormalizedCoordinates 等于 VK_TRUE) 来采样一个 VkImageView,作为此命令的结果,则该图像视图的 levelCountlayerCount 必须为 1。

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-08609
    如果使用一个 VkSampler (其 unnormalizedCoordinates 等于 VK_TRUE) 来采样一个 VkImageView,作为此命令的结果,则该图像视图的 viewType 必须VK_IMAGE_VIEW_TYPE_1DVK_IMAGE_VIEW_TYPE_2D

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-08610
    如果使用一个 VkSampler (其 unnormalizedCoordinates 等于 VK_TRUE) 来采样一个 VkImageView,作为此命令的结果,则该采样器 不得与任何名称中包含 ImplicitLodDrefProj 的 SPIR-V OpImageSample*OpImageSparseSample* 指令一起使用。

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-08611
    如果使用一个 VkSampler (其 unnormalizedCoordinates 等于 VK_TRUE) 来采样一个 VkImageView,作为此命令的结果,则该采样器 不得与任何包含 LOD 偏差或任何偏移值的 SPIR-V OpImageSample*OpImageSparseSample* 指令一起使用。

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-06479
    如果一个 VkImageView 使用 深度比较 进行采样,则该图像视图的 格式特性 必须包含 VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_DEPTH_COMPARISON_BIT

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-02691
    如果一个 VkImageView 作为此命令的结果使用原子操作进行访问,则该图像视图的 格式特性 必须包含 VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-07888
    如果一个 VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER 描述符作为此命令的结果使用原子操作进行访问,则该存储纹理缓冲区的 格式特性 必须包含 VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-02692
    如果一个 VkImageView 作为此命令的结果使用 VK_FILTER_CUBIC_EXT 进行采样,则该图像视图的 格式特性 必须包含 VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT

  • VUID-vkCmdExecuteGeneratedCommandsNV-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-vkCmdExecuteGeneratedCommandsNV-filterCubic-02694
    任何作为此命令的结果使用 VK_FILTER_CUBIC_EXT 进行采样的 VkImageView 必须具有支持立方体过滤的 VkImageViewType 和格式,如 VkFilterCubicImageViewImageFormatPropertiesEXT::filterCubic (由 vkGetPhysicalDeviceImageFormatProperties2 返回) 所指定。

  • VUID-vkCmdExecuteGeneratedCommandsNV-filterCubicMinmax-02695
    任何作为此命令的结果使用 VK_FILTER_CUBIC_EXT 进行采样 (且其缩减模式为 VK_SAMPLER_REDUCTION_MODE_MINVK_SAMPLER_REDUCTION_MODE_MAX) 的 VkImageView 必须具有支持立方体过滤以及最小值/最大值过滤的 VkImageViewType 和格式,如 VkFilterCubicImageViewImageFormatPropertiesEXT::filterCubicMinmax (由 vkGetPhysicalDeviceImageFormatProperties2 返回) 所指定。

  • VUID-vkCmdExecuteGeneratedCommandsNV-cubicRangeClamp-09212
    如果未启用 cubicRangeClamp 功能,则由此命令采样的任何使用 VK_FILTER_CUBIC_EXTVkImageView 必须 不具有 VkSamplerReductionModeCreateInfo::reductionMode 等于 VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE_RANGECLAMP_QCOM 的情况。

  • VUID-vkCmdExecuteGeneratedCommandsNV-reductionMode-09213
    由此命令采样的任何具有 VkSamplerReductionModeCreateInfo::reductionMode 等于 VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE_RANGECLAMP_QCOMVkImageView 必须 使用 VK_FILTER_CUBIC_EXT 进行采样。

  • VUID-vkCmdExecuteGeneratedCommandsNV-selectableCubicWeights-09214
    如果未启用 selectableCubicWeights 功能,则由此命令采样的任何使用 VK_FILTER_CUBIC_EXTVkImageView 必须 具有 VkSamplerCubicWeightsCreateInfoQCOM::cubicWeights 等于 VK_CUBIC_FILTER_WEIGHTS_CATMULL_ROM_QCOM 的情况。

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

  • VUID-vkCmdExecuteGeneratedCommandsNV-OpTypeImage-07027
    对于任何被写入为存储图像且 OpTypeImage 的图像格式字段为 UnknownVkImageView,该视图的 格式特性 必须 包含 VK_FORMAT_FEATURE_2_STORAGE_WRITE_WITHOUT_FORMAT_BIT

  • VUID-vkCmdExecuteGeneratedCommandsNV-OpTypeImage-07028
    对于任何被读取为存储图像且 OpTypeImage 的图像格式字段为 UnknownVkImageView,该视图的 格式特性 必须 包含 VK_FORMAT_FEATURE_2_STORAGE_READ_WITHOUT_FORMAT_BIT

  • VUID-vkCmdExecuteGeneratedCommandsNV-OpTypeImage-07029
    对于任何被写入为存储纹理缓冲且 OpTypeImage 的图像格式字段为 UnknownVkBufferView,该视图的 缓冲特性 必须 包含 VK_FORMAT_FEATURE_2_STORAGE_WRITE_WITHOUT_FORMAT_BIT

  • VUID-vkCmdExecuteGeneratedCommandsNV-OpTypeImage-07030
    对于任何被读取为存储纹理缓冲且 OpTypeImage 的图像格式字段为 UnknownVkBufferView,该视图的 缓冲特性 必须 包含 VK_FORMAT_FEATURE_2_STORAGE_READ_WITHOUT_FORMAT_BIT

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

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

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

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

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

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-08115
    如果绑定到管线绑定点的 VkPipeline 使用的描述符是通过 vkCmdBindDescriptorSets 指定的,则绑定的 VkPipeline 必须在创建时未使用 VK_PIPELINE_CREATE_DESCRIPTOR_BUFFER_BIT_EXT

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

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

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

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

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-08605
    如果描述符被使用以 VK_DESCRIPTOR_SET_LAYOUT_CREATE_DESCRIPTOR_BUFFER_BIT_EXT 创建的 VkDescriptorSetLayout 创建的 VkShaderEXT 动态使用,则描述符内存必须是常驻的。

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-08606
    如果 shaderObject 功能未启用,则必须将一个有效的管线绑定到此命令所用的管线绑定点。

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

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-08607
    如果 shaderObject 功能已启用,则必须将一个有效的管线绑定到此命令所用的管线绑定点,或者必须将有效的和 VK_NULL_HANDLE 着色器对象的有效组合绑定到此命令所用管线绑定点对应的每个支持的着色器阶段。

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

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

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

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

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

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

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

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

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

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

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

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

  • VUID-vkCmdExecuteGeneratedCommandsNV-SampledType-04470
    如果由于此命令访问了具有 64 位组件宽度的 VkFormatVkImageView,则该指令的 OpTypeImage 操作数的 SampledTypeWidth 必须为 64。

  • VUID-vkCmdExecuteGeneratedCommandsNV-SampledType-04471
    如果由于此命令访问了具有小于 64 位组件宽度的 VkFormatVkImageView,则该指令的 OpTypeImage 操作数的 SampledTypeWidth 必须为 32。

  • VUID-vkCmdExecuteGeneratedCommandsNV-SampledType-04472
    如果由于此命令访问了具有 64 位组件宽度的 VkFormatVkBufferView,则该指令的 OpTypeImage 操作数的 SampledTypeWidth 必须为 64。

  • VUID-vkCmdExecuteGeneratedCommandsNV-SampledType-04473
    如果由于此命令访问了具有小于 64 位组件宽度的 VkFormatVkBufferView,则该指令的 OpTypeImage 操作数的 SampledTypeWidth 必须为 32。

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

  • VUID-vkCmdExecuteGeneratedCommandsNV-sparseImageInt64Atomics-04475
    如果未启用 sparseImageInt64Atomics 功能,则使用 VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT 标志创建的 VkBuffer 对象必须不能通过 SampledTypeWidth 为 64 的 OpTypeImage 被此命令的原子指令访问。

  • VUID-vkCmdExecuteGeneratedCommandsNV-OpImageWeightedSampleQCOM-06971
    如果使用 OpImageWeightedSampleQCOMVkImageView 进行采样,则该图像视图的格式特征必须包含 VK_FORMAT_FEATURE_2_WEIGHT_SAMPLED_IMAGE_BIT_QCOM

  • VUID-vkCmdExecuteGeneratedCommandsNV-OpImageWeightedSampleQCOM-06972
    如果 OpImageWeightedSampleQCOM 使用 VkImageView 作为采样权重图像,则该图像视图的格式特征必须包含 VK_FORMAT_FEATURE_2_WEIGHT_IMAGE_BIT_QCOM

  • VUID-vkCmdExecuteGeneratedCommandsNV-OpImageBoxFilterQCOM-06973
    如果使用 OpImageBoxFilterQCOMVkImageView 进行采样,则该图像视图的格式特征必须包含 VK_FORMAT_FEATURE_2_BOX_FILTER_SAMPLED_BIT_QCOM

  • VUID-vkCmdExecuteGeneratedCommandsNV-OpImageBlockMatchSSDQCOM-06974
    如果使用 OpImageBlockMatchSSDQCOMVkImageView 读取数据,则该图像视图的格式特征必须包含 VK_FORMAT_FEATURE_2_BLOCK_MATCHING_BIT_QCOM

  • VUID-vkCmdExecuteGeneratedCommandsNV-OpImageBlockMatchSADQCOM-06975
    如果使用 OpImageBlockMatchSADQCOMVkImageView 读取数据,则该图像视图的格式特征必须包含 VK_FORMAT_FEATURE_2_BLOCK_MATCHING_BIT_QCOM

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

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

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

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

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

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

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

  • VUID-vkCmdExecuteGeneratedCommandsNV-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-vkCmdExecuteGeneratedCommandsNV-renderPass-02684
    当前的渲染通道必须与创建绑定到 VK_PIPELINE_BIND_POINT_GRAPHICSVkPipeline 时指定的 VkGraphicsPipelineCreateInfo 结构的 renderPass 成员兼容

  • VUID-vkCmdExecuteGeneratedCommandsNV-subpass-02685
    当前渲染通道的子通道索引必须等于创建绑定到 VK_PIPELINE_BIND_POINT_GRAPHICSVkPipeline 时指定的 VkGraphicsPipelineCreateInfo 结构的 subpass 成员。

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-07748
    如果任何着色器静态访问输入附件,则必须通过描述符集将有效的描述符绑定到管线。

  • VUID-vkCmdExecuteGeneratedCommandsNV-OpTypeImage-07468
    如果此管线执行的任何着色器访问 Dim 操作数为 SubpassDataOpTypeImage 变量,则它必须使用与当前子通道中的有效输入附件对应的 InputAttachmentIndex 进行修饰。

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-07469
    子通道中访问的输入附件视图必须使用与相应子通道定义相同的 VkFormat 创建,并且使用与绑定的 VkFramebuffer 中子通道的 pInputAttachments[InputAttachmentIndex] 引用的附件兼容的 VkImageView 创建,如 Fragment Input Attachment Compatibility 中所指定。

  • VUID-vkCmdExecuteGeneratedCommandsNV-pDepthInputAttachmentIndex-09595
    动态渲染通道中访问的输入附件视图,其 InputAttachmentIndexVkRenderingInputAttachmentIndexInfo 引用,或者如果 VkRenderingInputAttachmentIndexInfo:pDepthInputAttachmentIndexVkRenderingInputAttachmentIndexInfo:pStencilInputAttachmentIndexNULL 则没有 InputAttachmentIndex,则必须使用与 VkRenderingInfo 中对应的颜色、深度或模板附件兼容的 VkImageView 创建。

  • VUID-vkCmdExecuteGeneratedCommandsNV-pDepthInputAttachmentIndex-09596
    如果 VkRenderingInputAttachmentIndexInfo:pDepthInputAttachmentIndexVkRenderingInputAttachmentIndexInfo:pStencilInputAttachmentIndex 均不为 NULL,则通过着色器对象在动态渲染通道中访问的输入附件视图必须具有 InputAttachmentIndex

  • VUID-vkCmdExecuteGeneratedCommandsNV-InputAttachmentIndex-09597
    如果通过着色器对象在动态渲染通道中访问的输入附件视图具有 InputAttachmentIndex,则 InputAttachmentIndex必须VkRenderingInputAttachmentIndexInfo 中的索引匹配。

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-06537
    作为当前渲染通道中的附件使用的图像子资源的内存后备存储必须不能以任何方式写入,除非通过此命令作为附件写入

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-09000
    如果颜色附件被此子通道中的任何先前命令或此子通道的加载、存储或解析操作写入,且它不在 VK_IMAGE_LAYOUT_ATTACHMENT_FEEDBACK_LOOP_OPTIMAL_EXT 图像布局中,并且满足以下任一条件:

    • 绑定的管线上设置了 VK_PIPELINE_CREATE_COLOR_ATTACHMENT_FEEDBACK_LOOP_BIT_EXT

    • 上次调用 vkCmdSetAttachmentFeedbackLoopEnableEXT 时包含了 VK_IMAGE_ASPECT_COLOR_BIT 并且

      • 没有绑定的图形管线 或

      • 绑定的图形管线是使用 VK_DYNAMIC_STATE_ATTACHMENT_FEEDBACK_LOOP_ENABLE_EXT 创建的

    那么它必须不能以任何方式访问,除非通过此命令作为附件访问

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-09001
    如果深度附件被此子通道中的任何先前命令或此子通道的加载、存储或解析操作写入,且它不在 VK_IMAGE_LAYOUT_ATTACHMENT_FEEDBACK_LOOP_OPTIMAL_EXT 图像布局中,并且满足以下任一条件:

    • 绑定的管线上设置了 VK_PIPELINE_CREATE_DEPTH_STENCIL_ATTACHMENT_FEEDBACK_LOOP_BIT_EXT

    • 上次调用 vkCmdSetAttachmentFeedbackLoopEnableEXT 时包含了 VK_IMAGE_ASPECT_DEPTH_BIT 并且

      • 没有绑定的图形管线 或

      • 绑定的图形管线是使用 VK_DYNAMIC_STATE_ATTACHMENT_FEEDBACK_LOOP_ENABLE_EXT 创建的

    那么它必须不能以任何方式访问,除非通过此命令作为附件访问

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-09002
    如果模板附件被此子通道中的任何先前命令或此子通道的加载、存储或解析操作写入,且它不在 VK_IMAGE_LAYOUT_ATTACHMENT_FEEDBACK_LOOP_OPTIMAL_EXT 图像布局中,并且满足以下任一条件:

    • 绑定的管线上设置了 VK_PIPELINE_CREATE_DEPTH_STENCIL_ATTACHMENT_FEEDBACK_LOOP_BIT_EXT

    • 上次调用 vkCmdSetAttachmentFeedbackLoopEnableEXT 时包含了 VK_IMAGE_ASPECT_STENCIL_BIT 并且

      • 没有绑定的图形管线 或

      • 绑定的图形管线是使用 VK_DYNAMIC_STATE_ATTACHMENT_FEEDBACK_LOOP_ENABLE_EXT 创建的

    那么它必须不能以任何方式访问,除非通过此命令作为附件访问

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-09003
    如果一个附件被此子通道中的任何先前命令或此子通道的加载、存储或解析操作写入,那么它必须不能以任何方式访问,除非通过此命令作为附件、存储图像或采样图像访问

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-06539
    如果当前子通道中任何先前记录的命令以除附件之外的任何方式访问了在此子通道中用作附件的图像子资源,则此命令必须不能将该图像子资源作为附件写入

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-06886
    如果当前渲染通道实例对深度方面使用了只读布局的深度/模板附件,则必须禁用深度写入

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-06887
    如果当前渲染通道实例对模板方面使用了只读布局的深度/模板附件,并且前后writeMask都不是零,并且启用了模板测试,则所有模板操作必须VK_STENCIL_OP_KEEP

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-07831
    如果绑定的图形管线状态创建时启用了 VK_DYNAMIC_STATE_VIEWPORT 动态状态,那么在本次绘制命令之前,当前命令缓冲区中必须已调用过 vkCmdSetViewport 且没有随后失效

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-07832
    如果绑定的图形管线状态创建时启用了 VK_DYNAMIC_STATE_SCISSOR 动态状态,那么在本次绘制命令之前,当前命令缓冲区中必须已调用过 vkCmdSetScissor 且没有随后失效

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-07833
    如果绑定的图形管线状态创建时启用了 VK_DYNAMIC_STATE_LINE_WIDTH 动态状态,那么在本次绘制命令之前,当前命令缓冲区中必须已调用过 vkCmdSetLineWidth 且没有随后失效

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-08617
    如果着色器对象绑定到任何图形阶段,并且当前命令缓冲区中最近一次调用 vkCmdSetRasterizerDiscardEnablerasterizerDiscardEnable 设置为 VK_FALSE,并且当前命令缓冲区中最近一次调用 vkCmdSetPolygonModeEXTpolygonMode 设置为 VK_POLYGON_MODE_LINE,那么在本次绘制命令之前,当前命令缓冲区中必须已调用过 vkCmdSetLineWidth 且没有随后失效

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-08618
    如果着色器对象绑定到任何图形阶段,并且当前命令缓冲区中最近一次调用 vkCmdSetRasterizerDiscardEnablerasterizerDiscardEnable 设置为 VK_FALSE,并且当前命令缓冲区中最近一次调用 vkCmdSetPrimitiveTopologyprimitiveTopology 设置为任何线拓扑,那么在本次绘制命令之前,当前命令缓冲区中必须已调用过 vkCmdSetLineWidth 且没有随后失效

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-08619
    如果一个输出线图元的着色器对象绑定到 VK_SHADER_STAGE_TESSELLATION_EVALUATION_BITVK_SHADER_STAGE_GEOMETRY_BIT 阶段,并且当前命令缓冲区中最近一次调用 vkCmdSetRasterizerDiscardEnablerasterizerDiscardEnable 设置为 VK_FALSE,那么在此绘制命令之前,必须已调用过 vkCmdSetLineWidth 且未在当前命令缓冲区中随后失效

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-07834
    如果一个着色器对象绑定到任何图形阶段,或者绑定了一个启用了 VK_DYNAMIC_STATE_DEPTH_BIAS 动态状态的图形管线,并且 rasterizerDiscardEnable当前值VK_FALSE,且 depthBiasEnable当前值VK_TRUE,那么在此绘制命令之前,必须已调用过 vkCmdSetDepthBiasvkCmdSetDepthBias2EXT 且未在当前命令缓冲区中随后失效

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-07835
    如果绑定的图形管线状态创建时启用了 VK_DYNAMIC_STATE_BLEND_CONSTANTS 动态状态,那么在此绘制命令之前,必须已调用过 vkCmdSetBlendConstants 且未在当前命令缓冲区中随后失效

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-08621
    如果一个着色器对象绑定到 VK_SHADER_STAGE_FRAGMENT_BIT 阶段,并且当前命令缓冲区中最近一次调用 vkCmdSetRasterizerDiscardEnablerasterizerDiscardEnable 设置为 VK_FALSE,并且当前命令缓冲区中最近一次调用 vkCmdSetColorBlendEnableEXTpColorBlendEnables 的任何元素设置为 VK_TRUE,并且当前命令缓冲区中最近一次调用 vkCmdSetColorBlendEquationEXTpColorBlendEquations 的相同元素设置为一个 VkColorBlendEquationEXT 结构,且该结构的任何 VkBlendFactor 成员的值为 VK_BLEND_FACTOR_CONSTANT_COLORVK_BLEND_FACTOR_ONE_MINUS_CONSTANT_COLORVK_BLEND_FACTOR_CONSTANT_ALPHAVK_BLEND_FACTOR_ONE_MINUS_CONSTANT_ALPHA,那么在此绘制命令之前,必须已调用过 vkCmdSetBlendConstants 且未在当前命令缓冲区中随后失效

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-07836
    如果一个着色器对象绑定到任何图形阶段,或者绑定了一个启用了 VK_DYNAMIC_STATE_DEPTH_BOUNDS 动态状态的图形管线,并且 rasterizerDiscardEnable当前值VK_FALSE,且 depthBoundsTestEnable当前值VK_TRUE,那么在此绘制命令之前,必须已调用过 vkCmdSetDepthBounds 且未在当前命令缓冲区中随后失效

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-07837
    如果一个着色器对象绑定到任何图形阶段,或者绑定了一个启用了 VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK 动态状态的图形管线,并且 rasterizerDiscardEnable当前值VK_FALSE,且 stencilTestEnable当前值VK_TRUE,那么在此绘制命令之前,必须已调用过 vkCmdSetStencilCompareMask 且未在当前命令缓冲区中随后失效

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-07838
    如果一个着色器对象绑定到任何图形阶段,或者绑定了一个启用了 VK_DYNAMIC_STATE_STENCIL_WRITE_MASK 动态状态的图形管线,并且 rasterizerDiscardEnable当前值VK_FALSE,且 stencilTestEnable当前值VK_TRUE,那么在此绘制命令之前,必须已调用过 vkCmdSetStencilWriteMask 且未在当前命令缓冲区中随后失效

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-07839
    如果一个着色器对象绑定到任何图形阶段,或者绑定了一个启用了 VK_DYNAMIC_STATE_STENCIL_REFERENCE 动态状态的图形管线,并且 rasterizerDiscardEnable当前值VK_FALSE,且 stencilTestEnable当前值VK_TRUE,那么在此绘制命令之前,必须已调用过 vkCmdSetStencilReference 且未在当前命令缓冲区中随后失效

  • VUID-vkCmdExecuteGeneratedCommandsNV-maxMultiviewInstanceIndex-02688
    如果在启用了多视图的渲染通道实例中记录绘制,则最大实例索引必须小于或等于 VkPhysicalDeviceMultiviewProperties::maxMultiviewInstanceIndex

  • VUID-vkCmdExecuteGeneratedCommandsNV-sampleLocationsEnable-02689
    如果绑定的图形管线创建时将 VkPipelineSampleLocationsStateCreateInfoEXT::sampleLocationsEnable 设置为 VK_TRUE,并且当前子通道具有深度/模板附件,则该附件必须已使用 VK_IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT 位集创建

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-07634
    如果启用了 VK_EXT_sample_locations 扩展,并且着色器对象绑定到任何图形阶段,或者绑定了一个启用了 VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_ENABLE_EXT 动态状态的图形管线,并且 rasterizerDiscardEnable当前值VK_FALSE,那么在此绘制命令之前,必须已调用过 vkCmdSetSampleLocationsEnableEXT 且未在当前命令缓冲区中随后失效

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-06666
    如果启用了 VK_EXT_sample_locations 扩展,并且着色器对象绑定到任何图形阶段,或者绑定了一个启用了 VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_EXT 动态状态的图形管线,并且 rasterizerDiscardEnable当前值VK_FALSE,且 sampleLocationsEnable当前值VK_TRUE,则在此绘制命令之前,必须已调用过 vkCmdSetSampleLocationsEXT,并且在当前命令缓冲区中没有被随后失效

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-07840
    如果着色器对象绑定到任何图形阶段,或者绑定了一个启用了 VK_DYNAMIC_STATE_CULL_MODE 动态状态的图形管线,并且 rasterizerDiscardEnable当前值VK_FALSE,则在此绘制命令之前,必须已调用过 vkCmdSetCullMode,并且在当前命令缓冲区中没有被随后失效

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-07841
    如果着色器对象绑定到任何图形阶段,或者绑定了一个启用了 VK_DYNAMIC_STATE_FRONT_FACE 动态状态的图形管线,并且 rasterizerDiscardEnable当前值VK_FALSE,则在此绘制命令之前,必须已调用过 vkCmdSetFrontFace,并且在当前命令缓冲区中没有被随后失效

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-07843
    如果着色器对象绑定到任何图形阶段,或者绑定了一个启用了 VK_DYNAMIC_STATE_DEPTH_TEST_ENABLE 动态状态的图形管线,并且 rasterizerDiscardEnable当前值VK_FALSE,则在此绘制命令之前,必须已调用过 vkCmdSetDepthTestEnable,并且在当前命令缓冲区中没有被随后失效

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-07844
    如果着色器对象绑定到任何图形阶段,或者绑定了一个启用了 VK_DYNAMIC_STATE_DEPTH_WRITE_ENABLE 动态状态的图形管线,并且 rasterizerDiscardEnable当前值VK_FALSE,则在此绘制命令之前,必须已调用过 vkCmdSetDepthWriteEnable,并且在当前命令缓冲区中没有被随后失效

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-07845
    如果着色器对象绑定到任何图形阶段,或者绑定了一个启用了 VK_DYNAMIC_STATE_DEPTH_COMPARE_OP 动态状态的图形管线,并且 rasterizerDiscardEnable当前值VK_FALSE,且 depthTestEnable当前值VK_TRUE,则在此绘制命令之前,必须已调用过 vkCmdSetDepthCompareOp,并且在当前命令缓冲区中没有被随后失效

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-07846
    如果启用了depthBounds特性,并且着色器对象绑定到任何图形阶段,或者绑定了一个启用了 VK_DYNAMIC_STATE_DEPTH_BOUNDS_TEST_ENABLE 动态状态的图形管线,且 rasterizerDiscardEnable当前值VK_FALSE,则在此绘制命令之前,必须已调用过 vkCmdSetDepthBoundsTestEnable,并且在当前命令缓冲区中没有被随后失效

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-07847
    如果着色器对象绑定到任何图形阶段,或者绑定了一个启用了 VK_DYNAMIC_STATE_STENCIL_TEST_ENABLE 动态状态的图形管线,并且 rasterizerDiscardEnable当前值VK_FALSE,则在此绘制命令之前,必须已调用过 vkCmdSetStencilTestEnable,并且在当前命令缓冲区中没有被随后失效

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-07848
    如果着色器对象绑定到任何图形阶段,或者绑定了一个启用了 VK_DYNAMIC_STATE_STENCIL_OP 动态状态的图形管线,并且 rasterizerDiscardEnable当前值VK_FALSE,且 stencilTestEnable当前值VK_TRUE,则在此绘制命令之前,必须已调用过 vkCmdSetStencilOp,并且在当前命令缓冲区中没有被随后失效

  • VUID-vkCmdExecuteGeneratedCommandsNV-viewportCount-03417
    如果着色器对象绑定到任何图形阶段,或者绑定了一个启用了 VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT 动态状态的图形管线,并且该状态没有被继承,则在此绘制命令之前,必须已调用过 vkCmdSetViewportWithCount,并且在当前命令缓冲区中没有被随后失效

  • VUID-vkCmdExecuteGeneratedCommandsNV-scissorCount-03418
    如果着色器对象绑定到任何图形阶段,或者绑定了一个启用了 VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT 动态状态的图形管线,并且该状态没有被继承,则在此绘制命令之前,必须已调用过 vkCmdSetScissorWithCount,并且在当前命令缓冲区中没有被随后失效

  • VUID-vkCmdExecuteGeneratedCommandsNV-viewportCount-03419
    如果着色器对象绑定到任何图形阶段,或者绑定了使用 VK_DYNAMIC_STATE_SCISSOR_WITH_COUNTVK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT 动态状态创建的图形管线,并且该状态未被继承,那么 vkCmdSetViewportWithCountviewportCount 参数必须vkCmdSetScissorWithCountscissorCount 参数匹配。

  • VUID-vkCmdExecuteGeneratedCommandsNV-viewportCount-04137
    如果绑定的图形管线状态是用 VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT 动态状态启用的创建的,但没有启用 VK_DYNAMIC_STATE_VIEWPORT_W_SCALING_NV 动态状态,则绑定的图形管线必须已使用 VkPipelineViewportWScalingStateCreateInfoNV::viewportCount 创建,且该值大于或等于上次调用 vkCmdSetViewportWithCount 中的 viewportCount 参数。

  • VUID-vkCmdExecuteGeneratedCommandsNV-viewportCount-04138
    如果启用了 VK_NV_clip_space_w_scaling 扩展,并且着色器对象绑定到任何图形阶段,或者绑定了使用 VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNTVK_DYNAMIC_STATE_VIEWPORT_W_SCALING_NV 动态状态创建的图形管线,当前值 viewportWScalingEnableVK_TRUE,则必须调用过 vkCmdSetViewportWScalingNV 且在当前命令缓冲区中,在此绘制命令之前没有被失效

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-08636
    如果启用了 VK_NV_clip_space_w_scaling 扩展,并且着色器对象绑定到任何图形阶段,或者绑定了使用 VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNTVK_DYNAMIC_STATE_VIEWPORT_W_SCALING_NV 动态状态创建的图形管线,当前值 viewportWScalingEnableVK_TRUE,则上次调用 vkCmdSetViewportWScalingNV 中的 viewportCount 参数必须大于或等于上次调用 vkCmdSetViewportWithCount 中的 viewportCount 参数。

  • VUID-vkCmdExecuteGeneratedCommandsNV-viewportCount-04139
    如果绑定的图形管线状态是用 VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT 动态状态启用的创建的,但没有启用 VK_DYNAMIC_STATE_VIEWPORT_SHADING_RATE_PALETTE_NV 动态状态,则绑定的图形管线必须已使用 VkPipelineViewportShadingRateImageStateCreateInfoNV::viewportCount 创建,且该值大于或等于上次调用 vkCmdSetViewportWithCount 中的 viewportCount 参数。

  • VUID-vkCmdExecuteGeneratedCommandsNV-shadingRateImage-09233
    如果启用了 shadingRateImage 功能,并且着色器对象绑定到任何图形阶段,或者绑定了使用 VK_DYNAMIC_STATE_VIEWPORT_COARSE_SAMPLE_ORDER_NV 创建的图形管线,并且 当前值 rasterizerDiscardEnableVK_FALSE,则必须调用过 vkCmdSetCoarseSampleOrderNV 且在当前命令缓冲区中,在此绘制命令之前没有被失效

  • VUID-vkCmdExecuteGeneratedCommandsNV-shadingRateImage-09234
    如果启用了 shadingRateImage 功能,并且着色器对象绑定到任何图形阶段,或者绑定了使用 VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNTVK_DYNAMIC_STATE_VIEWPORT_SHADING_RATE_PALETTE_NV 动态状态创建的图形管线,当前值 rasterizerDiscardEnableVK_FALSE,并且 当前值 shadingRateImageEnableVK_TRUE,则必须调用过 vkCmdSetViewportShadingRatePaletteNV 且在当前命令缓冲区中,在此绘制命令之前没有被失效

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-08637
    如果启用了 shadingRateImage 功能,并且着色器对象绑定到任何图形阶段,或者绑定了使用 VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNTVK_DYNAMIC_STATE_VIEWPORT_SHADING_RATE_PALETTE_NV 动态状态创建的图形管线,当前值 rasterizerDiscardEnableVK_FALSE,并且 当前值 shadingRateImageEnableVK_TRUE,则上次调用 vkCmdSetViewportShadingRatePaletteNV 中的 viewportCount 参数必须大于或等于上次调用 vkCmdSetViewportWithCount 中的 viewportCount 参数。

  • VUID-vkCmdExecuteGeneratedCommandsNV-VkPipelineVieportCreateInfo-04141
    如果绑定的图形管线状态是用启用了 VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT 动态状态并且从 VkPipelineViewportStateCreateInfo 链接了 VkPipelineViewportSwizzleStateCreateInfoNV 结构创建的,则绑定的图形管线必须已使用 VkPipelineViewportSwizzleStateCreateInfoNV::viewportCount 创建,且该值大于或等于上次调用 vkCmdSetViewportWithCount 中的 viewportCount 参数。

  • VUID-vkCmdExecuteGeneratedCommandsNV-VkPipelineVieportCreateInfo-04142
    如果绑定的图形管线状态是使用启用了 VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT 动态状态创建的,并且从 VkPipelineViewportStateCreateInfo 链接了 VkPipelineViewportExclusiveScissorStateCreateInfoNV 结构体,则绑定的图形管线必须已使用 VkPipelineViewportExclusiveScissorStateCreateInfoNV::exclusiveScissorCount 创建,其值大于或等于最后一次调用 vkCmdSetViewportWithCount 中的 viewportCount 参数。

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-07878
    如果启用了 exclusiveScissor 特性,并且将着色器对象绑定到任何图形阶段,或者绑定了使用启用了 VK_DYNAMIC_STATE_EXCLUSIVE_SCISSOR_ENABLE_NV 动态状态创建的图形管线,则在执行此绘制命令之前,必须已调用过 vkCmdSetExclusiveScissorEnableNV 并且在当前命令缓冲区中没有随后被 失效

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-07879
    如果启用了 exclusiveScissor 特性,并且将着色器对象绑定到任何图形阶段,或者绑定了使用启用了 VK_DYNAMIC_STATE_EXCLUSIVE_SCISSOR_NV 动态状态创建的图形管线,并且当前命令缓冲区中最近一次调用 vkCmdSetExclusiveScissorEnableNVpExclusiveScissorEnables 的任何元素设置为 VK_TRUE,则在执行此绘制命令之前,必须已调用过 vkCmdSetExclusiveScissorNV 并且在当前命令缓冲区中没有随后被 失效

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-04876
    如果将着色器对象绑定到任何图形阶段,或者绑定了使用启用了 VK_DYNAMIC_STATE_RASTERIZER_DISCARD_ENABLE 动态状态创建的图形管线,则在执行此绘制命令之前,必须已调用过 vkCmdSetRasterizerDiscardEnable 并且在当前命令缓冲区中没有随后被 失效

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-04877
    如果将着色器对象绑定到任何图形阶段,或者绑定了使用启用了 VK_DYNAMIC_STATE_DEPTH_BIAS_ENABLE 动态状态创建的图形管线,并且 rasterizerDiscardEnable当前值VK_FALSE,则在执行此绘制命令之前,必须已调用过 vkCmdSetDepthBiasEnable 并且在当前命令缓冲区中没有随后被 失效

  • VUID-vkCmdExecuteGeneratedCommandsNV-logicOp-04878
    如果将着色器对象绑定到 VK_SHADER_STAGE_FRAGMENT_BIT,或者绑定了使用启用了 VK_DYNAMIC_STATE_LOGIC_OP_EXT 动态状态创建的图形管线,rasterizerDiscardEnable当前值VK_FALSE,并且 logicOpEnable当前值VK_TRUE,则在执行此绘制命令之前,必须已调用过 vkCmdSetLogicOpEXT 并且在当前命令缓冲区中没有随后被 失效

  • VUID-vkCmdExecuteGeneratedCommandsNV-primitiveFragmentShadingRateWithMultipleViewports-04552
    如果不支持 primitiveFragmentShadingRateWithMultipleViewports 限制,并且绑定的图形管线是使用启用了 VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT 动态状态创建的,并且绑定的图形管线的任何着色器阶段写入 PrimitiveShadingRateKHR 内置变量,则在执行此绘制命令之前,当前命令缓冲区中必须已调用过 vkCmdSetViewportWithCount,并且 vkCmdSetViewportWithCountviewportCount 参数必须1

  • VUID-vkCmdExecuteGeneratedCommandsNV-primitiveFragmentShadingRateWithMultipleViewports-08642
    如果不支持 primitiveFragmentShadingRateWithMultipleViewports 限制,并且绑定到图形阶段的任何着色器对象写入 PrimitiveShadingRateKHR 内置变量,则在执行此绘制命令之前,当前命令缓冲区中必须已调用过 vkCmdSetViewportWithCount,并且 vkCmdSetViewportWithCountviewportCount 参数必须1

  • VUID-vkCmdExecuteGeneratedCommandsNV-blendEnable-04727
    如果绑定的图形管线中未禁用光栅化,则对于子通道中的每个颜色附件,如果对应的图像视图的 格式特性 不包含 VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT,则 pColorBlendStatepAttachments 成员的对应元素的 blendEnable 成员必须VK_FALSE

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-08643
    如果将着色器对象绑定到 VK_SHADER_STAGE_FRAGMENT_BIT 阶段,并且当前命令缓冲区中最近一次调用 vkCmdSetRasterizerDiscardEnablerasterizerDiscardEnable 设置为 VK_FALSE,则对于渲染过程中的每个颜色附件,如果对应的图像视图的 格式特性 不包含 VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT,则在当前命令缓冲区中最近一次调用 vkCmdSetColorBlendEnableEXT 中影响该附件索引的 pColorBlendEnables 的对应成员必须VK_FALSE

  • VUID-vkCmdExecuteGeneratedCommandsNV-multisampledRenderToSingleSampled-07284
    如果绑定的图形管线中未禁用光栅化,并且未启用以下任何一项:

    则绑定的图形管线的 rasterizationSamples 必须与当前子通道颜色和/或深度/模板附件相同。

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-08644
    如果着色器对象绑定到任何图形阶段,并且当前命令缓冲区中最近一次调用 vkCmdSetRasterizerDiscardEnablerasterizerDiscardEnable 设置为 VK_FALSE,并且以下任何一项都未启用

    则当前命令缓冲区中最近一次调用 vkCmdSetRasterizationSamplesEXT 必须rasterizationSamples 设置为与当前渲染通道颜色和/或深度/模板附件的样本数相同

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-08876
    如果着色器对象绑定到任何图形阶段,则当前渲染通道实例必须已使用 vkCmdBeginRendering 启动

  • VUID-vkCmdExecuteGeneratedCommandsNV-imageView-06172
    如果当前渲染通道实例使用 vkCmdBeginRendering 启动,pDepthAttachmentimageView 成员不是 VK_NULL_HANDLE,并且 pDepthAttachmentlayout 成员是 VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL,则此命令必须不向深度附件写入任何值

  • VUID-vkCmdExecuteGeneratedCommandsNV-imageView-06173
    如果当前渲染通道实例使用 vkCmdBeginRendering 启动,pStencilAttachmentimageView 成员不是 VK_NULL_HANDLE,并且 pStencilAttachmentlayout 成员是 VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL,则此命令必须不向模板附件写入任何值

  • VUID-vkCmdExecuteGeneratedCommandsNV-imageView-06174
    如果当前渲染通道实例使用 vkCmdBeginRendering 启动,pDepthAttachmentimageView 成员不是 VK_NULL_HANDLE,并且 pDepthAttachmentlayout 成员是 VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL,则此命令必须不向深度附件写入任何值

  • VUID-vkCmdExecuteGeneratedCommandsNV-imageView-06175
    如果当前渲染通道实例使用 vkCmdBeginRendering 启动,pStencilAttachmentimageView 成员不是 VK_NULL_HANDLE,并且 pStencilAttachmentlayout 成员是 VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL,则此命令必须不向模板附件写入任何值

  • VUID-vkCmdExecuteGeneratedCommandsNV-imageView-06176
    如果当前渲染通道实例使用 vkCmdBeginRendering 启动,pDepthAttachmentimageView 成员不是 VK_NULL_HANDLE,并且 pDepthAttachmentlayout 成员是 VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL,则此命令必须不向深度附件写入任何值

  • VUID-vkCmdExecuteGeneratedCommandsNV-imageView-06177
    如果当前渲染通道实例使用 vkCmdBeginRendering 启动,pStencilAttachmentimageView 成员不是 VK_NULL_HANDLE,并且 pStencilAttachmentlayout 成员是 VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL,则此命令必须不向模板附件写入任何值

  • VUID-vkCmdExecuteGeneratedCommandsNV-viewMask-06178
    如果当前渲染通道实例使用 vkCmdBeginRendering 启动,则绑定的图形管线必须使用 VkPipelineRenderingCreateInfo::viewMask 等于 VkRenderingInfo::viewMask 创建

  • VUID-vkCmdExecuteGeneratedCommandsNV-colorAttachmentCount-06179
    如果未启用 dynamicRenderingUnusedAttachments 功能,并且当前渲染通道实例使用 vkCmdBeginRendering 启动,则绑定的图形管线必须使用 VkPipelineRenderingCreateInfo::colorAttachmentCount 等于 VkRenderingInfo::colorAttachmentCount 创建

  • VUID-vkCmdExecuteGeneratedCommandsNV-dynamicRenderingUnusedAttachments-08910
    如果未启用 dynamicRenderingUnusedAttachments 功能,并且当前渲染通道实例使用 vkCmdBeginRendering 启动,并且 VkRenderingInfo::colorAttachmentCount 大于 0,则 VkRenderingInfo::pColorAttachments 数组中 imageView 不等于 VK_NULL_HANDLE 的每个元素必须使用与用于创建绑定图形管线的 VkPipelineRenderingCreateInfo::pColorAttachmentFormats 的对应元素相等的 VkFormat 创建

  • VUID-vkCmdExecuteGeneratedCommandsNV-dynamicRenderingUnusedAttachments-08912
    如果未启用 dynamicRenderingUnusedAttachments 功能,并且当前渲染通道实例使用 vkCmdBeginRendering 启动,并且 VkRenderingInfo::colorAttachmentCount 大于 0,则 VkRenderingInfo::pColorAttachments 数组中 imageView 等于 VK_NULL_HANDLE 的每个元素必须具有用于创建绑定管线的 VkPipelineRenderingCreateInfo::pColorAttachmentFormats 的对应元素等于 VK_FORMAT_UNDEFINED

  • VUID-vkCmdExecuteGeneratedCommandsNV-dynamicRenderingUnusedAttachments-08911
    如果启用了 dynamicRenderingUnusedAttachments 特性,并且当前渲染过程实例是通过 vkCmdBeginRendering 开始的,并且 VkRenderingInfo::colorAttachmentCount 大于 0,那么 VkRenderingInfo::pColorAttachments 数组中每个 imageView 不等于 VK_NULL_HANDLE 的元素必须使用与创建绑定图形管线时使用的 VkPipelineRenderingCreateInfo::pColorAttachmentFormats 的对应元素相同的 VkFormat 创建,或者,如果存在 VkPipelineRenderingCreateInfo::pColorAttachmentFormats 的对应元素,则该元素必须VK_FORMAT_UNDEFINED

  • VUID-vkCmdExecuteGeneratedCommandsNV-colorAttachmentCount-09362
    如果当前渲染过程实例是通过 vkCmdBeginRendering 开始的,VkRenderingInfo::colorAttachmentCount 等于 1,并且没有着色器对象绑定到任何图形阶段,并且颜色附件的解析模式为 VK_RESOLVE_MODE_EXTERNAL_FORMAT_DOWNSAMPLE_ANDROID,那么 VkRenderingInfo::pColorAttachments 数组中每个 resolveImageView 不等于 VK_NULL_HANDLE 的元素必须使用通过 VkExternalFormatANDROID::externalFormat 值创建的图像创建,该值与用于创建绑定图形管线的 VkExternalFormatANDROID::externalFormat 值相同。

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-09363
    如果没有着色器对象绑定到任何图形阶段,当前渲染过程实例是通过 vkCmdBeginRendering 开始的,并且 VkRenderingInfo::colorAttachmentCount 等于 1,并且颜色附件的解析模式为 VK_RESOLVE_MODE_EXTERNAL_FORMAT_DOWNSAMPLE_ANDROID,那么 VkRenderingInfo::pColorAttachments 数组中每个 imageView 不等于 VK_NULL_HANDLE 的元素必须使用通过 VkExternalFormatANDROID::externalFormat 值创建的图像创建,该值与用于创建绑定图形管线的 VkExternalFormatANDROID::externalFormat 值相同。

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-09364
    如果当前渲染过程实例是通过 vkCmdBeginRendering 开始的,并且没有着色器对象绑定到任何图形阶段,并且绑定的图形管线是使用非零的 VkExternalFormatANDROID::externalFormat 值创建的,并且启用了 VK_DYNAMIC_STATE_COLOR_BLEND_ENABLE_EXT 动态状态,那么在执行此绘制命令之前,vkCmdSetColorBlendEnableEXT 必须已将混合启用设置为 VK_FALSE

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-09365
    如果当前渲染过程实例是通过 vkCmdBeginRendering 开始的,并且没有着色器对象绑定到任何图形阶段,并且绑定的图形管线是使用非零的 VkExternalFormatANDROID::externalFormat 值创建的,并且启用了 VK_DYNAMIC_STATE_RASTERIZATION_SAMPLES_EXT 动态状态,那么在执行此绘制命令之前,vkCmdSetRasterizationSamplesEXT 必须已将 rasterizationSamples 设置为 VK_SAMPLE_COUNT_1_BIT

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-09366
    如果存在着色器对象绑定到任何图形阶段,并且当前渲染过程包含使用 VK_RESOLVE_MODE_EXTERNAL_FORMAT_DOWNSAMPLE_ANDROID 解析模式的颜色附件,那么在执行此绘制命令之前,vkCmdSetColorBlendEnableEXT 必须已将混合启用设置为 VK_FALSE

  • VUID-vkCmdExecuteGeneratedCommandsNV-rasterizationSamples-09367
    如果存在着色器对象绑定到任何图形阶段,并且当前渲染过程包含使用 VK_RESOLVE_MODE_EXTERNAL_FORMAT_DOWNSAMPLE_ANDROID 解析模式的颜色附件,那么在执行此绘制命令之前,vkCmdSetRasterizationSamplesEXT 必须已将 rasterizationSamples 设置为 VK_SAMPLE_COUNT_1_BIT

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-09368
    如果当前渲染过程实例是通过 vkCmdBeginRendering 开始的,并且没有着色器对象绑定到任何图形阶段,并且绑定的图形管线是使用非零的 VkExternalFormatANDROID::externalFormat 值创建的,并且启用了 VK_DYNAMIC_STATE_FRAGMENT_SHADING_RATE_KHR 动态状态,那么在执行此绘制命令之前,vkCmdSetFragmentShadingRateKHR 必须已将 pFragmentSize->width 设置为 1

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-09369
    如果当前渲染过程实例是通过 vkCmdBeginRendering 开始的,并且没有着色器对象绑定到任何图形阶段,并且绑定的图形管线是使用非零的 VkExternalFormatANDROID::externalFormat 值创建的,并且启用了 VK_DYNAMIC_STATE_FRAGMENT_SHADING_RATE_KHR 动态状态,那么在执行此绘制命令之前,vkCmdSetFragmentShadingRateKHR 必须已将 pFragmentSize->height 设置为 1

  • VUID-vkCmdExecuteGeneratedCommandsNV-pFragmentSize-09370
    如果任何图形管线阶段绑定了着色器对象,并且当前渲染通道包含一个使用 VK_RESOLVE_MODE_EXTERNAL_FORMAT_DOWNSAMPLE_ANDROID 解析模式的颜色附件,那么在此绘制命令之前,vkCmdSetFragmentShadingRateKHR 必须已将 pFragmentSize->width 设置为 1

  • VUID-vkCmdExecuteGeneratedCommandsNV-pFragmentSize-09371
    如果任何图形管线阶段绑定了着色器对象,并且当前渲染通道包含一个使用 VK_RESOLVE_MODE_EXTERNAL_FORMAT_DOWNSAMPLE_ANDROID 解析模式的颜色附件,那么在此绘制命令之前,vkCmdSetFragmentShadingRateKHR 必须已将 pFragmentSize->height 设置为 1

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-07749
    如果绑定的图形管线状态是在启用 VK_DYNAMIC_STATE_COLOR_WRITE_ENABLE_EXT 动态状态的情况下创建的,那么在此绘制命令之前,必须已调用 vkCmdSetColorWriteEnableEXT,并且在当前命令缓冲区中没有被后续的 无效化

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-08646
    如果启用了 colorWriteEnable 功能,并且着色器对象绑定到 VK_SHADER_STAGE_FRAGMENT_BIT 阶段,并且当前命令缓冲区中最近一次调用 vkCmdSetRasterizerDiscardEnablerasterizerDiscardEnable 设置为 VK_FALSE,那么在此绘制命令之前,必须已调用 vkCmdSetColorWriteEnableEXT,并且在当前命令缓冲区中没有被后续的 无效化

  • VUID-vkCmdExecuteGeneratedCommandsNV-attachmentCount-07750
    如果绑定的图形管线状态是在启用 VK_DYNAMIC_STATE_COLOR_WRITE_ENABLE_EXT 动态状态的情况下创建的,那么 vkCmdSetColorWriteEnableEXTattachmentCount 参数必须大于或等于绑定图形管线的 VkPipelineColorBlendStateCreateInfo::attachmentCount

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-08647
    如果启用了 colorWriteEnable 功能,并且着色器对象绑定到 VK_SHADER_STAGE_FRAGMENT_BIT 阶段,并且当前命令缓冲区中最近一次调用 vkCmdSetRasterizerDiscardEnablerasterizerDiscardEnable 设置为 VK_FALSE,那么当前命令缓冲区中最近一次调用 vkCmdSetColorWriteEnableEXTattachmentCount 参数必须大于或等于当前渲染通道实例中的颜色附件数量

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-07751
    如果启用了 VK_EXT_discard_rectangles 扩展,绑定了一个图形管线,该管线是在启用 VK_DYNAMIC_STATE_DISCARD_RECTANGLE_EXT 动态状态的情况下创建的,并且 VkGraphicsPipelineCreateInfopNext 链包含一个 VkPipelineDiscardRectangleStateCreateInfoEXT 结构,rasterizerDiscardEnable当前值VK_FALSE,并且 discardRectangleEnable当前值VK_TRUE,那么在此绘制命令之前,对于 VkPipelineDiscardRectangleStateCreateInfoEXT::discardRectangleCount 中的每个丢弃矩形,必须已调用 vkCmdSetDiscardRectangleEXT,并且在当前命令缓冲区中没有被后续的 无效化

  • VUID-vkCmdExecuteGeneratedCommandsNV-rasterizerDiscardEnable-09236
    如果启用了 VK_EXT_discard_rectangles 扩展,着色器对象绑定到任何图形阶段,或者绑定了一个图形管线,该管线是在启用 VK_DYNAMIC_STATE_DISCARD_RECTANGLE_EXT 动态状态的情况下创建的,并且 VkGraphicsPipelineCreateInfopNext 链不包含 VkPipelineDiscardRectangleStateCreateInfoEXT 结构,rasterizerDiscardEnable当前值VK_FALSE,并且 discardRectangleEnable当前值VK_TRUE,那么在此绘制命令之前,对于 VkPhysicalDeviceDiscardRectanglePropertiesEXT::maxDiscardRectangles 中的每个丢弃矩形,必须已调用 vkCmdSetDiscardRectangleEXT,并且在当前命令缓冲区中没有被后续的 无效化

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-07880
    如果启用了 VK_EXT_discard_rectangles 扩展,着色器对象绑定到任何图形阶段,或者绑定了一个图形管线,该管线是在启用 VK_DYNAMIC_STATE_DISCARD_RECTANGLE_ENABLE_EXT 动态状态的情况下创建的,rasterizerDiscardEnable当前值VK_FALSE,那么在此绘制命令之前,必须已调用 vkCmdSetDiscardRectangleEnableEXT,并且在当前命令缓冲区中没有被后续的 无效化

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-07881
    如果启用了 VK_EXT_discard_rectangles 扩展,着色器对象绑定到任何图形阶段,或者绑定了一个图形管线,该管线是在启用 VK_DYNAMIC_STATE_DISCARD_RECTANGLE_MODE_EXT 动态状态的情况下创建的,rasterizerDiscardEnable当前值VK_FALSE,并且 discardRectangleEnable当前值VK_TRUE,那么在此绘制命令之前,必须已调用 vkCmdSetDiscardRectangleModeEXT,并且在当前命令缓冲区中没有被后续的 无效化

  • VUID-vkCmdExecuteGeneratedCommandsNV-dynamicRenderingUnusedAttachments-08913
    如果当前渲染过程实例是通过 vkCmdBeginRendering 开始的,且 dynamicRenderingUnusedAttachments 功能未启用,并且 VkRenderingInfo::pDepthAttachment->imageViewVK_NULL_HANDLE,则用于创建绑定的图形管线的 VkPipelineRenderingCreateInfo::depthAttachmentFormat 的值必须等于 VK_FORMAT_UNDEFINED

  • VUID-vkCmdExecuteGeneratedCommandsNV-dynamicRenderingUnusedAttachments-08914
    如果当前渲染过程实例是通过 vkCmdBeginRendering 开始的,且 dynamicRenderingUnusedAttachments 功能未启用,并且 VkRenderingInfo::pDepthAttachment->imageView 不为 VK_NULL_HANDLE,则用于创建绑定的图形管线的 VkPipelineRenderingCreateInfo::depthAttachmentFormat 的值必须等于用于创建 VkRenderingInfo::pDepthAttachment->imageViewVkFormat

  • VUID-vkCmdExecuteGeneratedCommandsNV-dynamicRenderingUnusedAttachments-08915
    如果当前渲染过程实例是通过 vkCmdBeginRendering 开始的,且 dynamicRenderingUnusedAttachments 功能已启用,VkRenderingInfo::pDepthAttachment->imageView 不为 VK_NULL_HANDLE,并且用于创建绑定的图形管线的 VkPipelineRenderingCreateInfo::depthAttachmentFormat 的值不等于用于创建 VkRenderingInfo::pDepthAttachment->imageViewVkFormat,则该格式的值必须VK_FORMAT_UNDEFINED

  • VUID-vkCmdExecuteGeneratedCommandsNV-dynamicRenderingUnusedAttachments-08916
    如果当前渲染过程实例是通过 vkCmdBeginRendering 开始的,且 dynamicRenderingUnusedAttachments 功能未启用,并且 VkRenderingInfo::pStencilAttachment->imageViewVK_NULL_HANDLE,则用于创建绑定的图形管线的 VkPipelineRenderingCreateInfo::stencilAttachmentFormat 的值必须等于 VK_FORMAT_UNDEFINED

  • VUID-vkCmdExecuteGeneratedCommandsNV-dynamicRenderingUnusedAttachments-08917
    如果当前渲染过程实例是通过 vkCmdBeginRendering 开始的,且 dynamicRenderingUnusedAttachments 功能未启用,并且 VkRenderingInfo::pStencilAttachment->imageView 不为 VK_NULL_HANDLE,则用于创建绑定的图形管线的 VkPipelineRenderingCreateInfo::stencilAttachmentFormat 的值必须等于用于创建 VkRenderingInfo::pStencilAttachment->imageViewVkFormat

  • VUID-vkCmdExecuteGeneratedCommandsNV-dynamicRenderingUnusedAttachments-08918
    如果当前渲染过程实例是通过 vkCmdBeginRendering 开始的,且 dynamicRenderingUnusedAttachments 功能已启用,VkRenderingInfo::pStencilAttachment->imageView 不为 VK_NULL_HANDLE,并且用于创建绑定的图形管线的 VkPipelineRenderingCreateInfo::stencilAttachmentFormat 的值不等于用于创建 VkRenderingInfo::pStencilAttachment->imageViewVkFormat,则该格式的值必须VK_FORMAT_UNDEFINED

  • VUID-vkCmdExecuteGeneratedCommandsNV-imageView-06183
    如果当前渲染过程实例是通过 vkCmdBeginRendering 开始的,且 VkRenderingFragmentShadingRateAttachmentInfoKHR::imageView 不为 VK_NULL_HANDLE,则绑定的图形管线必须使用 VK_PIPELINE_CREATE_RENDERING_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR 创建

  • VUID-vkCmdExecuteGeneratedCommandsNV-imageView-06184
    如果当前渲染过程实例是通过 vkCmdBeginRendering 开始的,且 VkRenderingFragmentDensityMapAttachmentInfoEXT::imageView 不为 VK_NULL_HANDLE,则绑定的图形管线必须使用 VK_PIPELINE_CREATE_RENDERING_FRAGMENT_DENSITY_MAP_ATTACHMENT_BIT_EXT 创建

  • VUID-vkCmdExecuteGeneratedCommandsNV-colorAttachmentCount-06185
    如果绑定的管线是使用 VkAttachmentSampleCountInfoAMDVkAttachmentSampleCountInfoNV 结构体创建的,并且当前渲染过程实例是通过 vkCmdBeginRendering 开始的,VkRenderingInfo::colorAttachmentCount 参数大于 0,则 VkRenderingInfo::pColorAttachments 数组中每个 imageView 不等于 VK_NULL_HANDLE 的元素,其创建时使用的采样计数必须等于用于创建绑定的图形管线的 VkAttachmentSampleCountInfoAMDVkAttachmentSampleCountInfoNVpColorAttachmentSamples 成员的对应元素

  • VUID-vkCmdExecuteGeneratedCommandsNV-pDepthAttachment-06186
    如果当前渲染通道实例是通过 vkCmdBeginRendering 开始的,并且绑定的管线是使用 VkAttachmentSampleCountInfoAMDVkAttachmentSampleCountInfoNV 结构创建的,并且 VkRenderingInfo::pDepthAttachment->imageView 不是 VK_NULL_HANDLE,那么用于创建绑定图形管线的 VkAttachmentSampleCountInfoAMDVkAttachmentSampleCountInfoNVdepthStencilAttachmentSamples 成员的值必须等于用于创建 VkRenderingInfo::pDepthAttachment->imageView 的采样计数。

  • VUID-vkCmdExecuteGeneratedCommandsNV-pStencilAttachment-06187
    如果当前渲染通道实例是通过 vkCmdBeginRendering 开始的,并且绑定的管线是使用 VkAttachmentSampleCountInfoAMDVkAttachmentSampleCountInfoNV 结构创建的,并且 VkRenderingInfo::pStencilAttachment->imageView 不是 VK_NULL_HANDLE,那么用于创建绑定图形管线的 VkAttachmentSampleCountInfoAMDVkAttachmentSampleCountInfoNVdepthStencilAttachmentSamples 成员的值必须等于用于创建 VkRenderingInfo::pStencilAttachment->imageView 的采样计数。

  • VUID-vkCmdExecuteGeneratedCommandsNV-multisampledRenderToSingleSampled-07285
    如果绑定的管线在创建时没有使用 VkAttachmentSampleCountInfoAMDVkAttachmentSampleCountInfoNV 结构,并且 multisampledRenderToSingleSampled 功能未启用,并且当前渲染通道实例是通过 vkCmdBeginRendering 开始的,并且 VkRenderingInfo::colorAttachmentCount 参数大于 0,那么 VkRenderingInfo::pColorAttachments 数组中每个 imageView 不等于 VK_NULL_HANDLE 的元素必须已使用与绑定图形管线的 rasterizationSamples 值相等的采样计数创建。

  • VUID-vkCmdExecuteGeneratedCommandsNV-multisampledRenderToSingleSampled-07286
    如果绑定的管线在创建时没有使用 VkAttachmentSampleCountInfoAMDVkAttachmentSampleCountInfoNV 结构,并且 multisampledRenderToSingleSampled 功能未启用,并且 VkRenderingInfo::pDepthAttachment->imageView 不是 VK_NULL_HANDLE,那么绑定图形管线的 rasterizationSamples 的值必须等于用于创建 VkRenderingInfo::pDepthAttachment->imageView 的采样计数。

  • VUID-vkCmdExecuteGeneratedCommandsNV-multisampledRenderToSingleSampled-07287
    如果绑定的管线在创建时没有使用 VkAttachmentSampleCountInfoAMDVkAttachmentSampleCountInfoNV 结构,并且 multisampledRenderToSingleSampled 功能未启用,并且 VkRenderingInfo::pStencilAttachment->imageView 不是 VK_NULL_HANDLE,那么绑定图形管线的 rasterizationSamples 的值必须等于用于创建 VkRenderingInfo::pStencilAttachment->imageView 的采样计数。

  • VUID-vkCmdExecuteGeneratedCommandsNV-pNext-07935
    如果此命令是在使用 vkCmdBeginRendering 启动的渲染通道实例中调用的,并且 VkRenderingInfopNext 链包含一个 VkMultisampledRenderToSingleSampledInfoEXT 结构,其中 multisampledRenderToSingleSampledEnable 等于 VK_TRUE,那么绑定图形管线的 rasterizationSamples 的值必须等于 VkMultisampledRenderToSingleSampledInfoEXT::rasterizationSamples

  • VUID-vkCmdExecuteGeneratedCommandsNV-renderPass-06198
    如果当前渲染通道实例是通过 vkCmdBeginRendering 开始的,那么绑定的管线必须是使用 VkGraphicsPipelineCreateInfo::renderPass 等于 VK_NULL_HANDLE 创建的。

  • VUID-vkCmdExecuteGeneratedCommandsNV-pColorAttachments-08963
    如果当前渲染通道实例是通过 vkCmdBeginRendering 开始的,并且绑定了一个片段着色器静态写入颜色附件的图形管线,颜色写入掩码不为零,颜色写入已启用,并且 VkRenderingInfo::pColorAttachments->imageView 的对应元素不是 VK_NULL_HANDLE,那么用于创建管线的 VkPipelineRenderingCreateInfo::pColorAttachmentFormats 的对应元素必须不是 VK_FORMAT_UNDEFINED

  • VUID-vkCmdExecuteGeneratedCommandsNV-pDepthAttachment-08964
    如果当前渲染通道实例是通过 vkCmdBeginRendering 开始的,并且绑定了一个图形管线,深度测试已启用,深度写入已启用,并且 VkRenderingInfo::pDepthAttachment->imageView 不是 VK_NULL_HANDLE,那么用于创建管线的 VkPipelineRenderingCreateInfo::depthAttachmentFormat必须不是 VK_FORMAT_UNDEFINED

  • VUID-vkCmdExecuteGeneratedCommandsNV-pStencilAttachment-08965
    如果当前渲染过程实例是通过 vkCmdBeginRendering 开始的,并且绑定了图形管线,启用了模板测试,且 VkRenderingInfo::pStencilAttachment->imageView 不为 VK_NULL_HANDLE,那么用于创建管线的 VkPipelineRenderingCreateInfo::stencilAttachmentFormat 必须不能是 VK_FORMAT_UNDEFINED

  • VUID-vkCmdExecuteGeneratedCommandsNV-primitivesGeneratedQueryWithRasterizerDiscard-06708
    如果 primitivesGeneratedQueryWithRasterizerDiscard 功能未启用,并且 VK_QUERY_TYPE_PRIMITIVES_GENERATED_EXT 查询处于活动状态,则必须未启用光栅化丢弃

  • VUID-vkCmdExecuteGeneratedCommandsNV-primitivesGeneratedQueryWithNonZeroStreams-06709
    如果 primitivesGeneratedQueryWithNonZeroStreams 功能未启用,并且 VK_QUERY_TYPE_PRIMITIVES_GENERATED_EXT 查询处于活动状态,则绑定的图形管线必须不是使用 VkPipelineRasterizationStateStreamCreateInfoEXT::rasterizationStream 中非零值创建的。

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-07620
    如果 depthClamp 功能已启用,并且着色器对象绑定到任何图形阶段,或者绑定了一个使用 VK_DYNAMIC_STATE_DEPTH_CLAMP_ENABLE_EXT 动态状态创建的图形管线,并且 rasterizerDiscardEnable当前值VK_FALSE,那么在当前命令缓冲区中,在此绘制命令之前,必须已调用过 vkCmdSetDepthClampEnableEXT 并且没有随后失效

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-07621
    如果着色器对象绑定到任何图形阶段,或者绑定了一个使用 VK_DYNAMIC_STATE_POLYGON_MODE_EXT 动态状态创建的图形管线,并且 rasterizerDiscardEnable当前值VK_FALSE,那么在当前命令缓冲区中,在此绘制命令之前,必须已调用过 vkCmdSetPolygonModeEXT 并且没有随后失效

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-07622
    如果着色器对象绑定到任何图形阶段,或者绑定了一个使用 VK_DYNAMIC_STATE_RASTERIZATION_SAMPLES_EXT 动态状态创建的图形管线,并且 rasterizerDiscardEnable当前值VK_FALSE,那么在当前命令缓冲区中,在此绘制命令之前,必须已调用过 vkCmdSetRasterizationSamplesEXT 并且没有随后失效

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-07623
    如果着色器对象绑定到任何图形阶段,或者绑定了一个使用 VK_DYNAMIC_STATE_SAMPLE_MASK_EXT 动态状态创建的图形管线,并且 rasterizerDiscardEnable当前值VK_FALSE,那么在当前命令缓冲区中,在此绘制命令之前,必须已调用过 vkCmdSetSampleMaskEXT 并且没有随后失效

  • VUID-vkCmdExecuteGeneratedCommandsNV-alphaToCoverageEnable-08919
    如果绑定的图形管线状态是使用启用了 VK_DYNAMIC_STATE_ALPHA_TO_COVERAGE_ENABLE_EXT 动态状态创建的,并且在上一次调用 vkCmdSetAlphaToCoverageEnableEXTalphaToCoverageEnableVK_TRUE,那么片段输出接口必须Location 0 的 Index 0 处包含 alpha Component 字的变量。

  • VUID-vkCmdExecuteGeneratedCommandsNV-alphaToCoverageEnable-08920
    如果着色器对象绑定到任何图形阶段,并且在当前命令缓冲区中最近一次调用 vkCmdSetAlphaToCoverageEnableEXT 时将 alphaToCoverageEnable 设置为 VK_TRUE,那么片段输出接口必须Location 0 的 Index 0 处包含 alpha Component 字的变量。

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-07624
    如果着色器对象绑定到任何图形阶段,或者绑定了一个使用 VK_DYNAMIC_STATE_ALPHA_TO_COVERAGE_ENABLE_EXT 动态状态创建的图形管线,并且 rasterizerDiscardEnable当前值VK_FALSE,那么在当前命令缓冲区中,在此绘制命令之前,必须已调用过 vkCmdSetAlphaToCoverageEnableEXT 并且没有随后失效

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-07625
    如果启用了 alphaToOne 功能,并且着色器对象绑定到任何图形阶段,或者绑定了一个使用 VK_DYNAMIC_STATE_ALPHA_TO_ONE_ENABLE_EXT 动态状态创建的图形管线,并且 rasterizerDiscardEnable当前值VK_FALSE,那么在当前命令缓冲区中,在此绘制命令之前,必须已调用过 vkCmdSetAlphaToOneEnableEXT 并且没有随后失效

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-07626
    如果启用了logicOp特性,并且着色器对象绑定到了VK_SHADER_STAGE_FRAGMENT_BIT阶段,或者绑定了一个使用启用了VK_DYNAMIC_STATE_LOGIC_OP_ENABLE_EXT动态状态创建的图形管线,并且rasterizerDiscardEnable当前值VK_FALSE,则在执行此绘图命令之前,必须调用过vkCmdSetLogicOpEnableEXT,并且在当前的命令缓冲区中没有随后被失效

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-07627
    如果绑定的图形管线状态是使用启用了VK_DYNAMIC_STATE_COLOR_BLEND_ENABLE_EXT动态状态创建的,则在执行此绘图命令之前,必须调用过vkCmdSetColorBlendEnableEXT,并且在当前的命令缓冲区中没有随后被失效

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-08657
    如果一个着色器对象绑定到了VK_SHADER_STAGE_FRAGMENT_BIT阶段,并且当前命令缓冲区中最近一次调用vkCmdSetRasterizerDiscardEnablerasterizerDiscardEnable设置为VK_FALSE,并且存在绑定的颜色附件,则在执行此绘图命令之前,必须调用过vkCmdSetColorBlendEnableEXT,并且在当前的命令缓冲区中没有随后被失效

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-07628
    如果绑定的图形管线状态是使用启用了VK_DYNAMIC_STATE_COLOR_BLEND_EQUATION_EXT动态状态创建的,则在执行此绘图命令之前,必须调用过vkCmdSetColorBlendEquationEXT,并且在当前的命令缓冲区中没有随后被失效

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-08658
    如果一个着色器对象绑定到了VK_SHADER_STAGE_FRAGMENT_BIT阶段,并且当前命令缓冲区中最近一次调用vkCmdSetRasterizerDiscardEnablerasterizerDiscardEnable设置为VK_FALSE,并且最近一次调用vkCmdSetColorBlendEnableEXT为任何附件设置了该附件在pColorBlendEnables中的值为VK_TRUE,则在执行此绘图命令之前,必须调用过vkCmdSetColorBlendEquationEXT,并且在当前的命令缓冲区中没有随后被失效

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-07629
    如果绑定的图形管线状态是使用启用了VK_DYNAMIC_STATE_COLOR_WRITE_MASK_EXT动态状态创建的,则在执行此绘图命令之前,必须调用过vkCmdSetColorWriteMaskEXT,并且在当前的命令缓冲区中没有随后被失效

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-08659
    如果一个着色器对象绑定到了VK_SHADER_STAGE_FRAGMENT_BIT阶段,并且当前命令缓冲区中最近一次调用vkCmdSetRasterizerDiscardEnablerasterizerDiscardEnable设置为VK_FALSE,并且存在绑定的颜色附件,则在执行此绘图命令之前,必须调用过vkCmdSetColorWriteMaskEXT,并且在当前的命令缓冲区中没有随后被失效

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-07630
    如果启用了geometryStreams特性,并且着色器对象绑定到了VK_SHADER_STAGE_GEOMETRY_BIT阶段,或者绑定了一个使用启用了VK_DYNAMIC_STATE_RASTERIZATION_STREAM_EXT动态状态创建的图形管线,则在执行此绘图命令之前,必须调用过vkCmdSetRasterizationStreamEXT,并且在当前的命令缓冲区中没有随后被失效

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-07631
    如果启用了VK_EXT_conservative_rasterization扩展,并且着色器对象绑定到了任何图形阶段,或者绑定了一个使用启用了VK_DYNAMIC_STATE_CONSERVATIVE_RASTERIZATION_MODE_EXT动态状态创建的图形管线,并且rasterizerDiscardEnable当前值VK_FALSE,则在执行此绘图命令之前,必须调用过vkCmdSetConservativeRasterizationModeEXT,并且在当前的命令缓冲区中没有随后被失效

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-07632
    如果启用了VK_EXT_conservative_rasterization扩展,并且着色器对象绑定到了任何图形阶段,或者绑定了一个使用启用了VK_DYNAMIC_STATE_EXTRA_PRIMITIVE_OVERESTIMATION_SIZE_EXT动态状态创建的图形管线,并且rasterizerDiscardEnable当前值VK_FALSE,并且conservativeRasterizationMode当前值VK_CONSERVATIVE_RASTERIZATION_MODE_OVERESTIMATE_EXT,则在执行此绘图命令之前,必须调用过vkCmdSetExtraPrimitiveOverestimationSizeEXT,并且在当前的命令缓冲区中没有随后被失效

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-07633
    如果启用了 depthClipEnable 特性,并且着色器对象绑定到任何图形阶段,或者绑定了使用 VK_DYNAMIC_STATE_DEPTH_CLIP_ENABLE_EXT 动态状态创建的图形管线,则在执行此绘制命令之前,必须已调用过 vkCmdSetDepthClipEnableEXT 并且在当前命令缓冲区中没有随后被 失效

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-07635
    如果绑定的图形管线状态是使用启用了 VK_DYNAMIC_STATE_COLOR_BLEND_ADVANCED_EXT 动态状态创建的,则在执行此绘制命令之前,必须已调用过 vkCmdSetColorBlendAdvancedEXT 并且在当前命令缓冲区中没有随后被 失效

  • VUID-vkCmdExecuteGeneratedCommandsNV-rasterizerDiscardEnable-09416
    如果启用了 VK_EXT_blend_operation_advanced 扩展,并且着色器对象绑定到 VK_SHADER_STAGE_FRAGMENT_BIT 阶段,并且在当前命令缓冲区中最近一次调用 vkCmdSetRasterizerDiscardEnablerasterizerDiscardEnable 设置为 VK_FALSE,则在执行此绘制命令之前,必须至少调用过 vkCmdSetColorBlendEquationEXTvkCmdSetColorBlendAdvancedEXT 中的一个,并且在当前命令缓冲区中没有随后被 失效

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-07636
    如果启用了 VK_EXT_provoking_vertex 扩展,并且着色器对象绑定到 VK_SHADER_STAGE_VERTEX_BIT 阶段,或者绑定了使用启用了 VK_DYNAMIC_STATE_PROVOKING_VERTEX_MODE_EXT 动态状态创建的图形管线,并且 rasterizerDiscardEnable当前值VK_FALSE,则在执行此绘制命令之前,必须已调用过 vkCmdSetProvokingVertexModeEXT 并且在当前命令缓冲区中没有随后被 失效

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-07637
    如果绑定的图形管线状态是使用启用了 VK_DYNAMIC_STATE_LINE_RASTERIZATION_MODE_EXT 动态状态创建的,则在执行此绘制命令之前,必须已调用过 vkCmdSetLineRasterizationModeEXT 并且在当前命令缓冲区中没有随后被 失效

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-08666
    如果启用了 stippledRectangularLinesstippledBresenhamLinesstippledSmoothLines 中的任何特性,并且着色器对象绑定到任何图形阶段,并且在当前命令缓冲区中最近一次调用 vkCmdSetRasterizerDiscardEnablerasterizerDiscardEnable 设置为 VK_FALSE,并且在当前命令缓冲区中最近一次调用 vkCmdSetPolygonModeEXTpolygonMode 设置为 VK_POLYGON_MODE_LINE,则在执行此绘制命令之前,必须已调用过 vkCmdSetLineRasterizationModeEXT 并且在当前命令缓冲区中没有随后被 失效

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-08667
    如果启用了 stippledRectangularLinesstippledBresenhamLinesstippledSmoothLines 中的任何特性,并且着色器对象绑定到 VK_SHADER_STAGE_VERTEX_BIT 阶段,并且在当前命令缓冲区中最近一次调用 vkCmdSetRasterizerDiscardEnablerasterizerDiscardEnable 设置为 VK_FALSE,并且在当前命令缓冲区中最近一次调用 vkCmdSetPrimitiveTopologyprimitiveTopology 设置为任何线拓扑,则在执行此绘制命令之前,必须已调用过 vkCmdSetLineRasterizationModeEXT 并且在当前命令缓冲区中没有随后被 失效

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-08668
    如果启用了 stippledRectangularLinesstippledBresenhamLinesstippledSmoothLines 中的任何特性,并且一个输出线图元的着色器对象绑定到 VK_SHADER_STAGE_TESSELLATION_EVALUATION_BITVK_SHADER_STAGE_GEOMETRY_BIT 阶段,并且在当前命令缓冲区中最近一次调用 vkCmdSetRasterizerDiscardEnablerasterizerDiscardEnable 设置为 VK_FALSE,则在执行此绘制命令之前,必须已调用过 vkCmdSetLineRasterizationModeEXT 并且在当前命令缓冲区中没有随后被 失效

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-07638
    如果绑定的图形管线状态是使用启用了 VK_DYNAMIC_STATE_LINE_STIPPLE_ENABLE_EXT 动态状态创建的,则在执行此绘制命令之前,必须已调用过 vkCmdSetLineStippleEnableEXT 并且在当前命令缓冲区中没有随后被 失效

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-08669
    如果启用了 stippledRectangularLinesstippledBresenhamLinesstippledSmoothLines 中的任何特性,并且着色器对象绑定到任何图形阶段,并且在当前命令缓冲区中最近一次调用 vkCmdSetRasterizerDiscardEnablerasterizerDiscardEnable 设置为 VK_FALSE,并且在当前命令缓冲区中最近一次调用 vkCmdSetPolygonModeEXTpolygonMode 设置为 VK_POLYGON_MODE_LINE,则在执行此绘制命令之前,必须已调用过 vkCmdSetLineStippleEnableEXT 并且在当前命令缓冲区中没有随后被 失效

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-08670
    如果启用了 stippledRectangularLines stippledBresenhamLines stippledSmoothLines 中的任何一个特性,并且有一个着色器对象绑定到 VK_SHADER_STAGE_VERTEX_BIT 阶段,并且当前命令缓冲区中最近一次调用 vkCmdSetRasterizerDiscardEnablerasterizerDiscardEnable 设置为 VK_FALSE,并且当前命令缓冲区中最近一次调用 vkCmdSetPrimitiveTopologyprimitiveTopology 设置为任何线拓扑,则在执行此绘制命令之前,必须已调用 vkCmdSetLineStippleEnableEXT 并且没有在当前命令缓冲区中被后续失效

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-08671
    如果启用了 stippledRectangularLines stippledBresenhamLines stippledSmoothLines 中的任何一个特性,并且一个输出线图元的着色器对象绑定到 VK_SHADER_STAGE_TESSELLATION_EVALUATION_BITVK_SHADER_STAGE_GEOMETRY_BIT 阶段,并且当前命令缓冲区中最近一次调用 vkCmdSetRasterizerDiscardEnablerasterizerDiscardEnable 设置为 VK_FALSE,则在执行此绘制命令之前,必须已调用 vkCmdSetLineStippleEnableEXT 并且没有在当前命令缓冲区中被后续失效

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-07849
    如果启用了 stippledRectangularLines stippledBresenhamLines stippledSmoothLines 中的任何一个特性,并且一个着色器对象绑定到任何图形阶段,或者绑定的图形管线状态是通过启用 VK_DYNAMIC_STATE_LINE_STIPPLE 动态状态创建的,rasterizerDiscardEnable当前值VK_FALSE,并且 stippledLineEnable当前值VK_TRUE,则在执行此绘制命令之前,必须已调用 vkCmdSetLineStipple 并且没有在当前命令缓冲区中被后续失效

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-07639
    如果启用了 depthClipControl 特性,并且一个着色器对象绑定到任何图形阶段,或者绑定了一个通过启用 VK_DYNAMIC_STATE_DEPTH_CLIP_NEGATIVE_ONE_TO_ONE_EXT 动态状态创建的图形管线,则在执行此绘制命令之前,必须已调用 vkCmdSetDepthClipNegativeOneToOneEXT 并且没有在当前命令缓冲区中被后续失效

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-09650
    如果启用了 depthClampControl 特性,并且一个着色器对象绑定到任何图形阶段,或者绑定了一个通过启用 VK_DYNAMIC_STATE_DEPTH_CLAMP_RANGE_EXT 动态状态创建的图形管线,并且 depthClampEnable当前值VK_TRUE,则在执行此绘制命令之前,必须已调用 vkCmdSetDepthClampRangeEXT 并且没有在当前命令缓冲区中被后续失效

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-07640
    如果启用了 VK_NV_clip_space_w_scaling 扩展,并且一个着色器对象绑定到任何图形阶段,或者绑定了一个通过启用 VK_DYNAMIC_STATE_VIEWPORT_W_SCALING_ENABLE_NV 动态状态创建的图形管线,则在执行此绘制命令之前,必须已调用 vkCmdSetViewportWScalingEnableNV 并且没有在当前命令缓冲区中被后续失效

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-07641
    如果启用了 VK_NV_viewport_swizzle 扩展,并且一个着色器对象绑定到任何图形阶段,或者绑定了一个通过启用 VK_DYNAMIC_STATE_VIEWPORT_SWIZZLE_NV 动态状态创建的图形管线,则在执行此绘制命令之前,必须已调用 vkCmdSetViewportSwizzleNV 并且没有在当前命令缓冲区中被后续失效

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-07642
    如果启用了 VK_NV_fragment_coverage_to_color 扩展,并且一个着色器对象绑定到 VK_SHADER_STAGE_FRAGMENT_BIT 阶段,或者绑定了一个通过启用 VK_DYNAMIC_STATE_COVERAGE_TO_COLOR_ENABLE_NV 动态状态创建的图形管线,并且 rasterizerDiscardEnable当前值VK_FALSE,则在执行此绘制命令之前,必须已调用 vkCmdSetCoverageToColorEnableNV 并且没有在当前命令缓冲区中被后续失效

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-07643
    如果启用了 VK_NV_fragment_coverage_to_color 扩展,并且一个着色器对象绑定到 VK_SHADER_STAGE_FRAGMENT_BIT 阶段,或者绑定了一个通过启用 VK_DYNAMIC_STATE_COVERAGE_TO_COLOR_LOCATION_NV 动态状态创建的图形管线,并且 rasterizerDiscardEnable当前值VK_FALSE,并且 coverageToColorEnable当前值VK_TRUE,则在执行此绘制命令之前,必须已调用 vkCmdSetCoverageToColorLocationNV 并且没有在当前命令缓冲区中被后续失效

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-07644
    如果启用了 VK_NV_framebuffer_mixed_samples 扩展,并且着色器对象绑定到任何图形阶段,或者绑定了使用 VK_DYNAMIC_STATE_COVERAGE_MODULATION_MODE_NV 动态状态创建的图形管线,并且 rasterizerDiscardEnable当前值VK_FALSE,则在执行此绘图命令之前,必须已调用过 vkCmdSetCoverageModulationModeNV 并且在当前的命令缓冲区中未随后失效

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-07645
    如果启用了 VK_NV_framebuffer_mixed_samples 扩展,并且着色器对象绑定到任何图形阶段,或者绑定了使用 VK_DYNAMIC_STATE_COVERAGE_MODULATION_TABLE_ENABLE_NV 动态状态创建的图形管线,并且 rasterizerDiscardEnable当前值VK_FALSE,并且 coverageModulationMode当前值为除 VK_COVERAGE_MODULATION_MODE_NONE_NV 以外的任何值,则在执行此绘图命令之前,必须已调用过 vkCmdSetCoverageModulationTableEnableNV 并且在当前的命令缓冲区中未随后失效

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-07646
    如果启用了 VK_NV_framebuffer_mixed_samples 扩展,并且着色器对象绑定到任何图形阶段,或者绑定了使用 VK_DYNAMIC_STATE_COVERAGE_MODULATION_TABLE_NV 动态状态创建的图形管线,并且 rasterizerDiscardEnable当前值VK_FALSE,并且 coverageModulationTableEnable当前值VK_TRUE,则在执行此绘图命令之前,必须已调用过 vkCmdSetCoverageModulationTableNV 并且在当前的命令缓冲区中未随后失效

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-07647
    如果启用了 shadingRateImage 特性,并且着色器对象绑定到任何图形阶段,或者绑定了使用 VK_DYNAMIC_STATE_SHADING_RATE_IMAGE_ENABLE_NV 动态状态创建的图形管线,并且 rasterizerDiscardEnable当前值VK_FALSE,则在执行此绘图命令之前,必须已调用过 vkCmdSetShadingRateImageEnableNV 并且在当前的命令缓冲区中未随后失效

  • VUID-vkCmdExecuteGeneratedCommandsNV-pipelineFragmentShadingRate-09238
    如果启用了 pipelineFragmentShadingRate 特性,并且着色器对象绑定到 VK_SHADER_STAGE_FRAGMENT_BIT 阶段,或者绑定了使用 VK_DYNAMIC_STATE_FRAGMENT_SHADING_RATE_KHR 动态状态创建的图形管线,并且 rasterizerDiscardEnable当前值VK_FALSE,则在执行此绘图命令之前,必须已调用过 vkCmdSetFragmentShadingRateKHR 并且在当前的命令缓冲区中未随后失效

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-07648
    如果启用了 representativeFragmentTest 特性,并且着色器对象绑定到任何图形阶段,或者绑定了使用 VK_DYNAMIC_STATE_REPRESENTATIVE_FRAGMENT_TEST_ENABLE_NV 动态状态创建的图形管线,并且 rasterizerDiscardEnable当前值VK_FALSE,则在执行此绘图命令之前,必须已调用过 vkCmdSetRepresentativeFragmentTestEnableNV 并且在当前的命令缓冲区中未随后失效

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-07649
    如果启用了 coverageReductionMode 特性,并且着色器对象绑定到任何图形阶段,或者绑定了使用 VK_DYNAMIC_STATE_COVERAGE_REDUCTION_MODE_NV 动态状态创建的图形管线,并且 rasterizerDiscardEnable当前值VK_FALSE,则在执行此绘图命令之前,必须已调用过 vkCmdSetCoverageReductionModeNV 并且在当前的命令缓冲区中未随后失效

  • VUID-vkCmdExecuteGeneratedCommandsNV-pColorBlendEnables-07470
    如果绑定的图形管线状态是使用启用了 VK_DYNAMIC_STATE_COLOR_BLEND_ENABLE_EXT 状态创建的,并且最后一次调用 vkCmdSetColorBlendEnableEXT 将任何附件的 pColorBlendEnables 设置为 VK_TRUE,则对于子通道中的那些附件,对应的图像视图的 格式特性 必须包含 VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT

  • VUID-vkCmdExecuteGeneratedCommandsNV-rasterizationSamples-07471
    如果绑定的图形管线状态是使用启用了 VK_DYNAMIC_STATE_RASTERIZATION_SAMPLES_EXT 状态创建的,并且当前子通道不使用任何颜色和/或深度/模板附件,则最后一次调用 vkCmdSetRasterizationSamplesEXT 中的 rasterizationSamples 必须遵循零附件子通道的规则。

  • VUID-vkCmdExecuteGeneratedCommandsNV-samples-07472
    如果绑定的图形管线状态是在启用 VK_DYNAMIC_STATE_SAMPLE_MASK_EXT 状态且禁用 VK_DYNAMIC_STATE_RASTERIZATION_SAMPLES_EXT 状态的情况下创建的,那么最后一次调用 vkCmdSetSampleMaskEXT 中的 samples 参数必须大于或等于用于创建绑定图形管线的 VkPipelineMultisampleStateCreateInfo::rasterizationSamples 参数。

  • VUID-vkCmdExecuteGeneratedCommandsNV-samples-07473
    如果绑定的图形管线状态是在启用 VK_DYNAMIC_STATE_SAMPLE_MASK_EXT 状态和 VK_DYNAMIC_STATE_RASTERIZATION_SAMPLES_EXT 状态的情况下创建的,那么最后一次调用 vkCmdSetSampleMaskEXT 中的 samples 参数必须大于或等于最后一次调用 vkCmdSetRasterizationSamplesEXT 中的 rasterizationSamples 参数。

  • VUID-vkCmdExecuteGeneratedCommandsNV-rasterizationSamples-07474
    如果绑定的图形管线状态是在启用 VK_DYNAMIC_STATE_RASTERIZATION_SAMPLES_EXT 状态的情况下创建的,并且未启用 multisampledRenderToSingleSampled 功能,并且既没有启用 VK_AMD_mixed_attachment_samples 扩展也没有启用 VK_NV_framebuffer_mixed_samples 扩展,那么最后一次调用 vkCmdSetRasterizationSamplesEXT 中的 rasterizationSamples 参数必须与当前子通道的颜色和/或深度/模板附件相同。

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-09211
    如果绑定的图形管线状态是在启用 VK_DYNAMIC_STATE_RASTERIZATION_SAMPLES_EXT 状态的情况下创建的,或者有着色器对象绑定到任何图形阶段,并且当前渲染通道实例包含一个 multisampledRenderToSingleSampledEnable 等于 VK_TRUEVkMultisampledRenderToSingleSampledInfoEXT 结构,那么最后一次调用 vkCmdSetRasterizationSamplesEXT 中的 rasterizationSamples 参数必须与该结构的 rasterizationSamples 成员相同。

  • VUID-vkCmdExecuteGeneratedCommandsNV-firstAttachment-07476
    如果绑定的图形管线状态是在启用 VK_DYNAMIC_STATE_COLOR_BLEND_ENABLE_EXT 动态状态的情况下创建的,那么在此绘图命令之前,必须在当前命令缓冲区中调用过 vkCmdSetColorBlendEnableEXT,并且 vkCmdSetColorBlendEnableEXT 调用的 firstAttachmentattachmentCount 参数指定的附件必须为当前子通道中的所有活动颜色附件指定启用状态。

  • VUID-vkCmdExecuteGeneratedCommandsNV-rasterizerDiscardEnable-09417
    如果一个着色器对象绑定到 VK_SHADER_STAGE_FRAGMENT_BIT 阶段,并且当前命令缓冲区中最近一次调用 vkCmdSetRasterizerDiscardEnablerasterizerDiscardEnable 设置为 VK_FALSE,那么在此绘图命令之前,必须在当前命令缓冲区中调用过 vkCmdSetColorBlendEnableEXT,并且 vkCmdSetColorBlendEnableEXT 调用的 firstAttachmentattachmentCount 参数指定的附件必须为当前子通道中的所有活动颜色附件指定启用状态。

  • VUID-vkCmdExecuteGeneratedCommandsNV-firstAttachment-07477
    如果绑定的图形管线状态是在启用 VK_DYNAMIC_STATE_COLOR_BLEND_EQUATION_EXT 动态状态的情况下创建的,那么在此绘图命令之前,必须在当前命令缓冲区中调用过 vkCmdSetColorBlendEquationEXT,并且 vkCmdSetColorBlendEquationEXT 调用的 firstAttachmentattachmentCount 参数指定的附件必须为当前子通道中启用了混合的所有活动颜色附件指定混合方程式。

  • VUID-vkCmdExecuteGeneratedCommandsNV-rasterizerDiscardEnable-09418
    如果一个着色器对象绑定到 VK_SHADER_STAGE_FRAGMENT_BIT 阶段,并且当前命令缓冲区中最近一次调用 vkCmdSetRasterizerDiscardEnablerasterizerDiscardEnable 设置为 VK_FALSE 且存在颜色附件绑定,那么在此绘图命令之前,必须在当前命令缓冲区中调用过 vkCmdSetColorBlendEquationEXT,并且 vkCmdSetColorBlendEquationEXT 调用的 firstAttachmentattachmentCount 参数指定的附件必须为当前子通道中启用了混合的所有活动颜色附件指定混合方程式。

  • VUID-vkCmdExecuteGeneratedCommandsNV-firstAttachment-07478
    如果绑定的图形管线状态是在启用 VK_DYNAMIC_STATE_COLOR_WRITE_MASK_EXT 动态状态的情况下创建的,那么在此绘图命令之前,必须在当前命令缓冲区中调用过 vkCmdSetColorWriteMaskEXT,并且 vkCmdSetColorWriteMaskEXT 调用的 firstAttachmentattachmentCount 参数指定的附件必须为当前子通道中的所有活动颜色附件指定颜色写入掩码。

  • VUID-vkCmdExecuteGeneratedCommandsNV-rasterizerDiscardEnable-09419
    如果一个着色器对象绑定到 VK_SHADER_STAGE_FRAGMENT_BIT 阶段,并且当前命令缓冲区中最近一次调用 vkCmdSetRasterizerDiscardEnablerasterizerDiscardEnable 设置为 VK_FALSE,那么在此绘图命令之前,必须在当前命令缓冲区中调用过 vkCmdSetColorWriteMaskEXT,并且 vkCmdSetColorWriteMaskEXT 调用的 firstAttachmentattachmentCount 参数指定的附件必须为当前子通道中的所有活动颜色附件指定颜色写入掩码。

  • VUID-vkCmdExecuteGeneratedCommandsNV-firstAttachment-07479
    如果绑定的图形管线状态在创建时启用了 VK_DYNAMIC_STATE_COLOR_BLEND_ADVANCED_EXT 动态状态,那么在执行此绘制命令之前,当前命令缓冲区中必须已调用过 vkCmdSetColorBlendAdvancedEXT,并且 vkCmdSetColorBlendAdvancedEXT 调用中的 firstAttachmentattachmentCount 参数指定的附件必须为当前子通道中所有启用了混合的活动颜色附件指定高级混合方程式。

  • VUID-vkCmdExecuteGeneratedCommandsNV-advancedBlendMaxColorAttachments-07480
    如果绑定的图形管线状态在创建时启用了 VK_DYNAMIC_STATE_COLOR_BLEND_ADVANCED_EXTVK_DYNAMIC_STATE_COLOR_BLEND_ENABLE_EXT 动态状态,并且最后一次调用 vkCmdSetColorBlendEnableEXTvkCmdSetColorBlendAdvancedEXT 启用了高级混合,那么当前子通道中活动颜色附件的数量必须不超过 advancedBlendMaxColorAttachments

  • VUID-vkCmdExecuteGeneratedCommandsNV-primitivesGeneratedQueryWithNonZeroStreams-07481
    如果未启用 primitivesGeneratedQueryWithNonZeroStreams 功能,且 VK_QUERY_TYPE_PRIMITIVES_GENERATED_EXT 查询处于活动状态,并且绑定的图形管线在创建时启用了 VK_DYNAMIC_STATE_RASTERIZATION_STREAM_EXT 状态,那么最后一次调用 vkCmdSetRasterizationStreamEXT 必须已将 rasterizationStream 设置为零。

  • VUID-vkCmdExecuteGeneratedCommandsNV-sampleLocationsPerPixel-07482
    如果绑定的图形管线状态在创建时启用了 VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_EXT 状态,且禁用了 VK_DYNAMIC_STATE_RASTERIZATION_SAMPLES_EXT 状态,并且 当前值sampleLocationsEnableVK_TRUE,那么最后一次调用 vkCmdSetSampleLocationsEXTpSampleLocationsInfosampleLocationsPerPixel 成员必须等于绑定的图形管线创建时使用的 VkPipelineMultisampleStateCreateInfo 结构的 rasterizationSamples 成员。

  • VUID-vkCmdExecuteGeneratedCommandsNV-sampleLocationsPerPixel-07483
    如果绑定的图形管线状态在创建时启用了 VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_EXT 状态和 VK_DYNAMIC_STATE_RASTERIZATION_SAMPLES_EXT 状态,并且 当前值sampleLocationsEnableVK_TRUE,那么最后一次调用 vkCmdSetSampleLocationsEXTpSampleLocationsInfosampleLocationsPerPixel 成员必须等于最后一次调用 vkCmdSetRasterizationSamplesEXTrasterizationSamples 参数。

  • VUID-vkCmdExecuteGeneratedCommandsNV-sampleLocationsEnable-07484
    如果着色器对象绑定到 VK_SHADER_STAGE_FRAGMENT_BIT 阶段,或者绑定的图形管线在创建时启用了 VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_ENABLE_EXT 状态,并且最后一次调用 vkCmdSetSampleLocationsEnableEXT 中的 sampleLocationsEnableVK_TRUE,并且当前子通道具有深度/模板附件,那么该附件必须已使用设置的 VK_IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT 位创建。

  • VUID-vkCmdExecuteGeneratedCommandsNV-sampleLocationsEnable-07485
    如果着色器对象绑定到 VK_SHADER_STAGE_FRAGMENT_BIT 阶段,或者绑定的图形管线状态在创建时启用了 VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_EXT 状态和 VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_ENABLE_EXT 状态,并且如果最后一次调用 vkCmdSetSampleLocationsEnableEXT 中的 sampleLocationsEnableVK_TRUE,那么最后一次调用 vkCmdSetSampleLocationsEXT 中的 sampleLocationsInfo.sampleLocationGridSize.width 必须能被 VkMultisamplePropertiesEXT::sampleLocationGridSize.width 整除,后者由 vkGetPhysicalDeviceMultisamplePropertiesEXT 返回,且 samples 参数等于 rasterizationSamples

  • VUID-vkCmdExecuteGeneratedCommandsNV-sampleLocationsEnable-07486
    如果着色器对象绑定到 VK_SHADER_STAGE_FRAGMENT_BIT 阶段,或者绑定的图形管线状态在创建时启用了 VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_EXT 状态和 VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_ENABLE_EXT 状态,并且如果最后一次调用 vkCmdSetSampleLocationsEnableEXT 中的 sampleLocationsEnableVK_TRUE,那么最后一次调用 vkCmdSetSampleLocationsEXT 中的 sampleLocationsInfo.sampleLocationGridSize.height 必须能被 VkMultisamplePropertiesEXT::sampleLocationGridSize.height 整除,后者由 vkGetPhysicalDeviceMultisamplePropertiesEXT 返回,且 samples 参数等于 rasterizationSamples

  • VUID-vkCmdExecuteGeneratedCommandsNV-sampleLocationsEnable-07487
    如果着色器对象绑定到 VK_SHADER_STAGE_FRAGMENT_BIT 阶段,或者绑定的图形管线状态在创建时启用了 VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_ENABLE_EXT 状态,并且如果最后一次调用 vkCmdSetSampleLocationsEnableEXT 中的 sampleLocationsEnableVK_TRUE,则片段着色器代码必须不静态使用扩展指令 InterpolateAtSample

  • VUID-vkCmdExecuteGeneratedCommandsNV-sampleLocationsEnable-07936
    如果绑定的图形管线状态在创建时禁用了 VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_EXT 状态,并且启用了 VK_DYNAMIC_STATE_RASTERIZATION_SAMPLES_EXT 状态,并且 当前值sampleLocationsEnableVK_TRUE,那么 sampleLocationsInfo.sampleLocationGridSize.width 必须能被 VkMultisamplePropertiesEXT::sampleLocationGridSize.width 整除,后者由 vkGetPhysicalDeviceMultisamplePropertiesEXT 返回,且 samples 参数等于最后一次调用 vkCmdSetRasterizationSamplesEXTrasterizationSamples 的值。

  • VUID-vkCmdExecuteGeneratedCommandsNV-sampleLocationsEnable-07937
    如果绑定的图形管线状态是在禁用 VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_EXT 状态并启用 VK_DYNAMIC_STATE_RASTERIZATION_SAMPLES_EXT 状态的情况下创建的,并且 sampleLocationsEnable当前值VK_TRUE,则 sampleLocationsInfo.sampleLocationGridSize.height 必须能够被 VkMultisamplePropertiesEXT::sampleLocationGridSize.height 整除,该值由 vkGetPhysicalDeviceMultisamplePropertiesEXT 返回,且其 samples 参数等于上次调用 vkCmdSetRasterizationSamplesEXTrasterizationSamples 的值。

  • VUID-vkCmdExecuteGeneratedCommandsNV-sampleLocationsEnable-07938
    如果绑定的图形管线状态是在禁用 VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_EXT 状态并启用 VK_DYNAMIC_STATE_RASTERIZATION_SAMPLES_EXT 状态的情况下创建的,并且 sampleLocationsEnable当前值VK_TRUE,则 sampleLocationsInfo.sampleLocationsPerPixel 必须等于上次调用 vkCmdSetRasterizationSamplesEXTrasterizationSamples 的值。

  • VUID-vkCmdExecuteGeneratedCommandsNV-coverageModulationTableEnable-07488
    如果着色器对象绑定到任何图形阶段,或者绑定的图形管线状态是在启用 VK_DYNAMIC_STATE_COVERAGE_MODULATION_TABLE_ENABLE_NV 状态的情况下创建的,并且上次调用 vkCmdSetCoverageModulationTableEnableNVcoverageModulationTableEnable 设置为 VK_TRUE,则上次调用 vkCmdSetCoverageModulationTableNVcoverageModulationTableCount 参数必须等于当前 rasterizationSamples 除以当前子通道中颜色样本的数量。

  • VUID-vkCmdExecuteGeneratedCommandsNV-rasterizationSamples-07489
    如果启用了 VK_NV_framebuffer_mixed_samples 扩展,并且如果当前子通道具有深度/模板附件,并且在绑定的管线中启用了深度测试、模板测试或深度边界测试,则当前 rasterizationSamples 必须与深度/模板附件的样本计数相同。

  • VUID-vkCmdExecuteGeneratedCommandsNV-coverageToColorEnable-07490
    如果绑定的图形管线状态是在启用 VK_DYNAMIC_STATE_COVERAGE_TO_COLOR_ENABLE_NV 状态的情况下创建的,并且上次调用 vkCmdSetCoverageToColorEnableNVcoverageToColorEnable 设置为 VK_TRUE,则当前子通道必须在上次调用 vkCmdSetCoverageToColorLocationNVcoverageToColorLocation 选择的位置有一个颜色附件,其 VkFormatVK_FORMAT_R8_UINTVK_FORMAT_R8_SINTVK_FORMAT_R16_UINTVK_FORMAT_R16_SINTVK_FORMAT_R32_UINTVK_FORMAT_R32_SINT

  • VUID-vkCmdExecuteGeneratedCommandsNV-rasterizerDiscardEnable-09420
    如果启用了 VK_NV_fragment_coverage_to_color 扩展,并且着色器对象绑定到 VK_SHADER_STAGE_FRAGMENT_BIT 阶段,并且当前命令缓冲区中最近一次调用 vkCmdSetRasterizerDiscardEnablerasterizerDiscardEnable 设置为 VK_FALSE,并且上次调用 vkCmdSetCoverageToColorEnableNVcoverageToColorEnable 设置为 VK_TRUE,则当前子通道必须在上次调用 vkCmdSetCoverageToColorLocationNVcoverageToColorLocation 选择的位置有一个颜色附件,其 VkFormatVK_FORMAT_R8_UINTVK_FORMAT_R8_SINTVK_FORMAT_R16_UINTVK_FORMAT_R16_SINTVK_FORMAT_R32_UINTVK_FORMAT_R32_SINT

  • VUID-vkCmdExecuteGeneratedCommandsNV-coverageReductionMode-07491
    如果启用了此 VK_NV_coverage_reduction_mode 扩展,绑定的图形管线状态是在启用 VK_DYNAMIC_STATE_COVERAGE_TO_COLOR_ENABLE_NVVK_DYNAMIC_STATE_RASTERIZATION_SAMPLES_EXT 状态的情况下创建的,当前的覆盖率缩减模式 coverageReductionMode,则当前的 rasterizationSamples 以及颜色和深度/模板附件的样本计数(如果子通道有的话)必须是由 vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV 返回的有效组合。

  • VUID-vkCmdExecuteGeneratedCommandsNV-viewportCount-07492
    如果绑定的图形管线状态是在启用 VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT 动态状态但未启用 VK_DYNAMIC_STATE_VIEWPORT_SWIZZLE_NV 动态状态的情况下创建的,则绑定的图形管线必须已使用 VkPipelineViewportSwizzleStateCreateInfoNV::viewportCount 创建,该值大于或等于上次调用 vkCmdSetViewportWithCountviewportCount 参数的值。

  • VUID-vkCmdExecuteGeneratedCommandsNV-viewportCount-07493
    如果绑定的图形管线状态是在启用 VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNTVK_DYNAMIC_STATE_VIEWPORT_SWIZZLE_NV 动态状态的情况下创建的,则上次调用 vkCmdSetViewportSwizzleNVviewportCount 参数的值必须大于或等于上次调用 vkCmdSetViewportWithCountviewportCount 参数的值。

  • VUID-vkCmdExecuteGeneratedCommandsNV-viewportCount-09421
    如果启用了 VK_NV_viewport_swizzle 扩展,并且着色器对象绑定到任何图形阶段,则上次调用 vkCmdSetViewportSwizzleNVviewportCount 参数的值必须大于或等于上次调用 vkCmdSetViewportWithCountviewportCount 参数的值。

  • VUID-vkCmdExecuteGeneratedCommandsNV-rasterizationSamples-07494
    如果启用了 VK_NV_framebuffer_mixed_samples 扩展,并且如果当前子通道有任何颜色附件,并且最后一次调用 vkCmdSetRasterizationSamplesEXT 设置的 rasterizationSamples 大于颜色采样的数量,则管线 sampleShadingEnable 必须VK_FALSE

  • VUID-vkCmdExecuteGeneratedCommandsNV-stippledLineEnable-07495
    如果绑定的图形管线状态在创建时启用了 VK_DYNAMIC_STATE_LINE_STIPPLE_ENABLE_EXTVK_DYNAMIC_STATE_LINE_RASTERIZATION_MODE_EXT 动态状态,并且如果当前 stippledLineEnable 状态为 VK_TRUE 且当前 lineRasterizationMode 状态为 VK_LINE_RASTERIZATION_MODE_RECTANGULAR,则 stippledRectangularLines 特性必须启用

  • VUID-vkCmdExecuteGeneratedCommandsNV-stippledLineEnable-07496
    如果绑定的图形管线状态在创建时启用了 VK_DYNAMIC_STATE_LINE_STIPPLE_ENABLE_EXTVK_DYNAMIC_STATE_LINE_RASTERIZATION_MODE_EXT 动态状态,并且如果当前 stippledLineEnable 状态为 VK_TRUE 且当前 lineRasterizationMode 状态为 VK_LINE_RASTERIZATION_MODE_BRESENHAM,则 stippledBresenhamLines 特性必须启用

  • VUID-vkCmdExecuteGeneratedCommandsNV-stippledLineEnable-07497
    如果绑定的图形管线状态在创建时启用了 VK_DYNAMIC_STATE_LINE_STIPPLE_ENABLE_EXTVK_DYNAMIC_STATE_LINE_RASTERIZATION_MODE_EXT 动态状态,并且如果当前 stippledLineEnable 状态为 VK_TRUE 且当前 lineRasterizationMode 状态为 VK_LINE_RASTERIZATION_MODE_RECTANGULAR_SMOOTH,则 stippledSmoothLines 特性必须启用

  • VUID-vkCmdExecuteGeneratedCommandsNV-stippledLineEnable-07498
    如果绑定的图形管线状态在创建时启用了 VK_DYNAMIC_STATE_LINE_STIPPLE_ENABLE_EXTVK_DYNAMIC_STATE_LINE_RASTERIZATION_MODE_EXT 动态状态,并且如果当前 stippledLineEnable 状态为 VK_TRUE 且当前 lineRasterizationMode 状态为 VK_LINE_RASTERIZATION_MODE_DEFAULT,则 stippledRectangularLines 特性必须启用,并且 VkPhysicalDeviceLimits::strictLines 必须VK_TRUE

  • VUID-vkCmdExecuteGeneratedCommandsNV-conservativePointAndLineRasterization-07499
    如果绑定的图形管线状态在创建时启用了 VK_DYNAMIC_STATE_CONSERVATIVE_RASTERIZATION_MODE_EXT 动态状态,conservativePointAndLineRasterization 不支持,并且最后一个光栅化前着色器阶段输出的有效图元拓扑是线或点,则最后一次调用 vkCmdSetConservativeRasterizationModeEXT 设置的 conservativeRasterizationMode 必须VK_CONSERVATIVE_RASTERIZATION_MODE_DISABLED_EXT

  • VUID-vkCmdExecuteGeneratedCommandsNV-stage-07073
    如果绑定的管线在创建时,VkPipelineShaderStageCreateInfo::stage 成员在 VkGraphicsPipelineCreateInfo::pStages 的一个元素中被设置为 VK_SHADER_STAGE_VERTEX_BITVK_SHADER_STAGE_TESSELLATION_CONTROL_BITVK_SHADER_STAGE_TESSELLATION_EVALUATION_BITVK_SHADER_STAGE_GEOMETRY_BIT,则 网格着色器查询 必须不处于活动状态

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-08877
    如果着色器对象绑定到 VK_SHADER_STAGE_FRAGMENT_BIT 阶段,或者绑定了在创建时启用了 VK_DYNAMIC_STATE_ATTACHMENT_FEEDBACK_LOOP_ENABLE_EXT 动态状态的图形管线,并且 rasterizerDiscardEnable当前值VK_FALSE,则必须在此绘制命令之前调用过 vkCmdSetAttachmentFeedbackLoopEnableEXT 且未在当前命令缓冲区中随后将其失效

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-07850
    如果动态状态是从 VkCommandBufferInheritanceViewportScissorInfoNV 继承的,则必须在当前命令缓冲区中、此绘制命令之前设置该动态状态

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-08688
    如果没有绑定的图形管线,则必须在当前命令缓冲区中调用过 vkCmdBindShadersEXT,并且 pStages 包含 VK_SHADER_STAGE_FRAGMENT_BIT 的一个元素

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-08689
    如果没有绑定的图形管线,并且启用了 taskShader 特性,则必须在当前命令缓冲区中调用过 vkCmdBindShadersEXT,并且 pStages 包含 VK_SHADER_STAGE_TASK_BIT_EXT 的一个元素

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-08690
    如果没有绑定的图形管线,并且启用了 meshShader 特性,则必须在当前命令缓冲区中调用过 vkCmdBindShadersEXT,并且 pStages 包含 VK_SHADER_STAGE_MESH_BIT_EXT 的一个元素

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-08693
    如果没有绑定的图形管线,并且至少启用了 taskShadermeshShader 特性中的一个,则 VK_SHADER_STAGE_VERTEX_BITVK_SHADER_STAGE_MESH_BIT_EXT 阶段中的一个必须绑定有效的 VkShaderEXT,而另一个必须没有绑定 VkShaderEXT

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-08694
    如果没有绑定的图形管线,并且同时启用了 taskShadermeshShader 特性,并且向 VK_SHADER_STAGE_MESH_BIT_EXT 阶段绑定了有效的 VkShaderEXT,并且该 VkShaderEXT 创建时没有使用 VK_SHADER_CREATE_NO_TASK_SHADER_BIT_EXT 标志,则必须VK_SHADER_STAGE_TASK_BIT_EXT 阶段绑定有效的 VkShaderEXT

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-08695
    如果没有绑定图形管线,并且启用了 taskShadermeshShader 功能,并且一个有效的 VkShaderEXT 绑定到了 VK_SHADER_STAGE_MESH_BIT_EXT 阶段,且该 VkShaderEXT 是使用 VK_SHADER_CREATE_NO_TASK_SHADER_BIT_EXT 标志创建的,则 必须 没有 VkShaderEXT 绑定到 VK_SHADER_STAGE_TASK_BIT_EXT 阶段。

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-08696
    如果没有绑定图形管线,并且一个有效的 VkShaderEXT 绑定到了 VK_SHADER_STAGE_VERTEX_BIT 阶段,则 必须 没有 VkShaderEXT 绑定到 VK_SHADER_STAGE_TASK_BIT_EXT 阶段或 VK_SHADER_STAGE_MESH_BIT_EXT 阶段。

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-08698
    如果绑定了任何使用 VK_SHADER_CREATE_LINK_STAGE_BIT_EXT 标志创建的图形着色器,则在同一个 vkCreateShadersEXT 调用中所有使用 VK_SHADER_CREATE_LINK_STAGE_BIT_EXT 标志创建的着色器 必须 也被绑定。

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-08699
    如果绑定了任何使用 VK_SHADER_CREATE_LINK_STAGE_BIT_EXT 标志创建的图形着色器,则在同一个 vkCreateShadersEXT 调用中,没有使用 VK_SHADER_CREATE_LINK_STAGE_BIT_EXT 标志创建着色器的阶段之间的任何阶段 必须 不能绑定任何 VkShaderEXT

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-08878
    所有绑定的图形着色器对象 必须 是使用相同或相同定义的推送常量范围创建的。

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-08879
    所有绑定的图形着色器对象 必须 是使用相同或相同定义的描述符集布局数组创建的。

  • VUID-vkCmdExecuteGeneratedCommandsNV-colorAttachmentCount-09372
    如果当前的渲染通道实例使用 vkCmdBeginRenderingVkRenderingInfo::colorAttachmentCount 等于 1 开始,并且颜色附件的解析模式为 VK_RESOLVE_MODE_EXTERNAL_FORMAT_DOWNSAMPLE_ANDROID,并且绑定了片元着色器,则它 必须 不声明 DepthReplacingStencilRefReplacingEXT 执行模式。

  • VUID-vkCmdExecuteGeneratedCommandsNV-pDynamicStates-08715
    如果绑定的图形管线状态包含片元着色器阶段,并且在 VkPipelineDynamicStateCreateInfo::pDynamicStates 中设置了 VK_DYNAMIC_STATE_DEPTH_WRITE_ENABLE,并且片元着色器声明了 EarlyFragmentTests 执行模式并使用 OpDepthAttachmentReadEXT,则最后一次调用 vkCmdSetDepthWriteEnable 中的 depthWriteEnable 参数 必须VK_FALSE

  • VUID-vkCmdExecuteGeneratedCommandsNV-pDynamicStates-08716
    如果绑定的图形管线状态包含片元着色器阶段,并且在 VkPipelineDynamicStateCreateInfo::pDynamicStates 中设置了 VK_DYNAMIC_STATE_STENCIL_WRITE_MASK,并且片元着色器声明了 EarlyFragmentTests 执行模式并使用 OpStencilAttachmentReadEXT,则最后一次调用 vkCmdSetStencilWriteMask 中的 writeMask 参数 必须0

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-09116
    如果着色器对象绑定到任何图形阶段或绑定的图形管线是使用 VK_DYNAMIC_STATE_COLOR_WRITE_MASK_EXT 创建的,并且任何颜色附件的格式为 VK_FORMAT_E5B9G9R9_UFLOAT_PACK32,则 vkCmdSetColorWriteMaskEXTpColorWriteMasks 参数的相应元素 必须 要么包含 VK_COLOR_COMPONENT_R_BITVK_COLOR_COMPONENT_G_BITVK_COLOR_COMPONENT_B_BIT 的全部,要么都不包含。

  • VUID-vkCmdExecuteGeneratedCommandsNV-maxFragmentDualSrcAttachments-09239
    如果为任何附件启用了 混合,其中该附件的源或目标混合因子 使用辅助颜色输入,则此命令执行的 Fragment Execution Model静态使用的任何输出附件的 Location 最大值 必须 小于 maxFragmentDualSrcAttachments

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-09548
    如果当前的渲染通道是使用 vkCmdBeginRendering 开始的,并且没有任何着色器对象绑定到任何图形阶段,则 vkCmdSetRenderingAttachmentLocations 设置的 VkRenderingAttachmentLocationInfo::pColorAttachmentLocations 的每个元素的值 必须 与绑定管线中相应元素设置的值匹配。

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-09549
    如果当前的渲染通道是使用 vkCmdBeginRendering 开始的,并且没有任何着色器对象绑定到任何图形阶段,则绑定管线中的输入附件索引映射 必须 与通过 VkRenderingInputAttachmentIndexInfo 为当前渲染通道实例设置的映射匹配。

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-09642
    如果当前的渲染通道是使用带有 VK_RENDERING_ENABLE_LEGACY_DITHERING_BIT_EXT 标志的 vkCmdBeginRendering 开始的,则绑定的图形管线 必须 是使用 VK_PIPELINE_CREATE_2_ENABLE_LEGACY_DITHERING_BIT_EXT 创建的。

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-09643
    如果绑定的图形管线是使用 VK_PIPELINE_CREATE_2_ENABLE_LEGACY_DITHERING_BIT_EXT 创建的,则当前的渲染通道 必须 是使用带有 VK_RENDERING_ENABLE_LEGACY_DITHERING_BIT_EXT 标志的 vkCmdBeginRendering 开始的。

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-04007
    所有通过顶点着色器入口点的接口中声明的顶点输入变量访问的顶点输入绑定必须绑定有效的缓冲区或 VK_NULL_HANDLE 缓冲区。

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-04008
    如果未启用nullDescriptor 特性,则所有通过顶点着色器入口点的接口中声明的顶点输入变量访问的顶点输入绑定必须不是 VK_NULL_HANDLE

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-02721
    如果未启用robustBufferAccess 特性,并且该管线在创建时没有为 vertexInputs 启用 VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS,那么对于给定的顶点缓冲区绑定,所获取的任何属性数据必须完全包含在相应的顶点缓冲区绑定中,如顶点输入描述中所述。

  • VUID-vkCmdExecuteGeneratedCommandsNV-format-10389
    对于此命令访问的每个顶点属性,如果其 VkVertexInputAttributeDescription::formatVkVertexInputAttributeDescription2EXT::format 是一个紧凑格式,且未启用 legacyVertexAttributes,则 attribAddress 的值(按照顶点输入计算中所述计算)必须format 大小的倍数。

  • VUID-vkCmdExecuteGeneratedCommandsNV-format-10390
    对于此命令访问的每个顶点属性,如果其 VkVertexInputAttributeDescription::formatVkVertexInputAttributeDescription2EXT::format 不是一个紧凑格式,且未启用 legacyVertexAttributes 或者 format 具有 64 位分量,则 attribAddress 的值(按照顶点输入计算中所述计算)必须format 的分量大小的倍数。

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-07842
    如果有一个着色器对象绑定到 VK_SHADER_STAGE_VERTEX_BIT 阶段,或者绑定的图形管线状态在创建时启用了 VK_DYNAMIC_STATE_PRIMITIVE_TOPOLOGY 动态状态,则在执行此绘制命令之前,必须调用过 vkCmdSetPrimitiveTopology 并且没有随后在当前命令缓冲区中失效

  • VUID-vkCmdExecuteGeneratedCommandsNV-dynamicPrimitiveTopologyUnrestricted-07500
    如果绑定的图形管线状态在创建时启用了 VK_DYNAMIC_STATE_PRIMITIVE_TOPOLOGY 动态状态,并且 dynamicPrimitiveTopologyUnrestrictedVK_FALSE,则 vkCmdSetPrimitiveTopologyprimitiveTopology 参数必须与管线 VkPipelineInputAssemblyStateCreateInfo::topology 状态具有相同的拓扑类别

  • VUID-vkCmdExecuteGeneratedCommandsNV-primitiveTopology-10286
    如果有一个着色器对象绑定到 VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT 阶段,则在执行此绘制命令之前,vkCmdSetPrimitiveTopology 必须已将 primitiveTopology 设置为 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST

  • VUID-vkCmdExecuteGeneratedCommandsNV-pStrides-04913
    如果绑定的图形管线在创建时启用了 VK_DYNAMIC_STATE_VERTEX_INPUT_BINDING_STRIDE 动态状态,但没有启用 VK_DYNAMIC_STATE_VERTEX_INPUT_EXT 动态状态,则在执行此绘制命令之前,必须调用过 vkCmdBindVertexBuffers2 并且没有随后在当前命令缓冲区中失效,并且 vkCmdBindVertexBuffers2pStrides 参数必须不是 NULL

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-04914
    如果有一个着色器对象绑定到 VK_SHADER_STAGE_VERTEX_BIT 阶段,或者绑定的图形管线状态在创建时启用了 VK_DYNAMIC_STATE_VERTEX_INPUT_EXT 动态状态,则在执行此绘制命令之前,必须调用过 vkCmdSetVertexInputEXT 并且没有随后在当前命令缓冲区中失效

  • VUID-vkCmdExecuteGeneratedCommandsNV-Input-07939
    如果未启用 vertexAttributeRobustness 并且有一个着色器对象绑定到 VK_SHADER_STAGE_VERTEX_BIT 阶段,或者绑定的图形管线状态在创建时启用了 VK_DYNAMIC_STATE_VERTEX_INPUT_EXT 动态状态,则 Vertex Execution Model OpEntryPoint 中所有带有 Location 修饰的 Input 存储类变量的 location 必须包含在 VkVertexInputAttributeDescription2EXT::location 中。

  • VUID-vkCmdExecuteGeneratedCommandsNV-Input-08734
    如果有一个着色器对象绑定到 VK_SHADER_STAGE_VERTEX_BIT 阶段,或者绑定的图形管线状态在创建时启用了 VK_DYNAMIC_STATE_VERTEX_INPUT_EXT 动态状态,并且未启用 legacyVertexAttributes 特性,或者与 Vertex Execution Model OpEntryPoint 中给定 LocationInput 变量关联的 SPIR-V Type 是 64 位,则 Vertex Execution Model OpEntryPoint 中相应 Location 的所有 Input 变量关联的数字类型必须VkVertexInputAttributeDescription2EXT::format 相同。

  • VUID-vkCmdExecuteGeneratedCommandsNV-format-08936
    如果有一个着色器对象绑定到 VK_SHADER_STAGE_VERTEX_BIT 阶段,或者绑定的图形管线状态在创建时启用了 VK_DYNAMIC_STATE_VERTEX_INPUT_EXT 动态状态,并且 VkVertexInputAttributeDescription2EXT::format 具有 64 位分量,则 Vertex Execution Model OpEntryPoint 中相应 Location 的所有 Input 变量关联的标量宽度必须为 64 位。

  • VUID-vkCmdExecuteGeneratedCommandsNV-format-08937
    如果着色器对象绑定到 VK_SHADER_STAGE_VERTEX_BIT 阶段,或者绑定的图形管线状态是使用启用了 VK_DYNAMIC_STATE_VERTEX_INPUT_EXT 动态状态创建的,并且在 Vertex Execution Model OpEntryPoint 中,与带有 Location 修饰的 Input 变量相关的标量宽度为 64 位,则对应的 VkVertexInputAttributeDescription2EXT::format 必须 具有 64 位分量。

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-09203
    如果着色器对象绑定到 VK_SHADER_STAGE_VERTEX_BIT 阶段,或者绑定的图形管线状态是使用启用了 VK_DYNAMIC_STATE_VERTEX_INPUT_EXT 动态状态创建的,并且 VkVertexInputAttributeDescription2EXT::format 具有 64 位分量,则在 Vertex Execution Model OpEntryPoint 中,所有位于对应 LocationInput 变量 必须 不使用格式中不存在的分量。

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-04875
    如果着色器对象绑定到 VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT 阶段,或者绑定的图形管线状态是使用启用了 VK_DYNAMIC_STATE_PATCH_CONTROL_POINTS_EXT 动态状态创建的,并且 primitiveTopology当前值VK_PRIMITIVE_TOPOLOGY_PATCH_LIST,则 必须 在此绘制命令之前调用过 vkCmdSetPatchControlPointsEXT,并且未在当前命令缓冲区中随后失效

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-04879
    如果着色器对象绑定到 VK_SHADER_STAGE_VERTEX_BIT 阶段,或者绑定的图形管线状态是使用启用了 VK_DYNAMIC_STATE_PRIMITIVE_RESTART_ENABLE 动态状态创建的,则 必须 在此绘制命令之前调用过 vkCmdSetPrimitiveRestartEnable,并且未在当前命令缓冲区中随后失效

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-09637
    如果 primitiveTopologyListRestart 功能未启用,拓扑结构为 VK_PRIMITIVE_TOPOLOGY_POINT_LISTVK_PRIMITIVE_TOPOLOGY_LINE_LISTVK_PRIMITIVE_TOPOLOGY_TRIANGLE_LISTVK_PRIMITIVE_TOPOLOGY_LINE_LIST_WITH_ADJACENCYVK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST_WITH_ADJACENCY,并且着色器对象绑定到 VK_SHADER_STAGE_VERTEX_BIT 阶段,或者绑定的图形管线状态是使用启用了 VK_DYNAMIC_STATE_PRIMITIVE_RESTART_ENABLE 动态状态创建的,则 vkCmdSetPrimitiveRestartEnable 必须VK_FALSE

  • VUID-vkCmdExecuteGeneratedCommandsNV-stage-06481
    绑定的图形管线 必须 未使用 VkPipelineShaderStageCreateInfo::stage 成员设置为 VK_SHADER_STAGE_TASK_BIT_EXTVK_SHADER_STAGE_MESH_BIT_EXTVkGraphicsPipelineCreateInfo::pStages 的任何元素创建。

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-08885
    必须 没有着色器对象绑定到 VK_SHADER_STAGE_TASK_BIT_EXTVK_SHADER_STAGE_MESH_BIT_EXT 阶段中的任何一个。

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-07619
    如果着色器对象绑定到 VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT 阶段,或者绑定了使用启用了 VK_DYNAMIC_STATE_TESSELLATION_DOMAIN_ORIGIN_EXT 动态状态创建的图形管线,则 必须 在此绘制命令之前调用过 vkCmdSetTessellationDomainOriginEXT,并且未在当前命令缓冲区中随后失效

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-08684
    如果没有绑定的图形管线,则 必须 在当前命令缓冲区中调用过 vkCmdBindShadersEXT,并且 pStages 中包含 VK_SHADER_STAGE_VERTEX_BIT 的元素。

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-08685
    如果没有绑定的图形管线,并且启用了 tessellationShader 功能,则 必须 在当前命令缓冲区中调用过 vkCmdBindShadersEXT,并且 pStages 中包含 VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT 的元素。

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-08686
    如果没有绑定的图形管线,并且启用了 tessellationShader 功能,则 必须 在当前命令缓冲区中调用过 vkCmdBindShadersEXT,并且 pStages 中包含 VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT 的元素。

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-08687
    如果没有绑定的图形管线,并且启用了 geometryShader 功能,则 必须 在当前命令缓冲区中调用过 vkCmdBindShadersEXT,并且 pStages 中包含 VK_SHADER_STAGE_GEOMETRY_BIT 的元素。

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

  • VUID-vkCmdExecuteGeneratedCommandsNV-isPreprocessed-02908
    如果 isPreprocessedVK_TRUE,则 必须 已经使用与 pGeneratedCommandsInfo 内容相同的内容以及其引用的输入缓冲区的内容(除了 VkGeneratedCommandsInfoNV::preprocessBuffer 之外)在设备上执行过 vkCmdPreprocessGeneratedCommandsNV。此外, pGeneratedCommandsInfoindirectCommandsLayout 必须 使用设置的 VK_INDIRECT_COMMANDS_LAYOUT_USAGE_EXPLICIT_PREPROCESS_BIT_NV 位创建。

  • VUID-vkCmdExecuteGeneratedCommandsNV-pipeline-02909
    VkGeneratedCommandsInfoNV::pipeline 必须VkGeneratedCommandsInfoNV::pipelineBindPoint 处当前绑定的管线相匹配

  • VUID-vkCmdExecuteGeneratedCommandsNV-None-02910
    变换反馈必须未处于激活状态

  • VUID-vkCmdExecuteGeneratedCommandsNV-deviceGeneratedCommands-02911
    必须启用 VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV::deviceGeneratedCommands 功能。

有效用法(隐式)
  • VUID-vkCmdExecuteGeneratedCommandsNV-commandBuffer-parameter
    commandBuffer 必须是一个有效的 VkCommandBuffer 句柄

  • VUID-vkCmdExecuteGeneratedCommandsNV-pGeneratedCommandsInfo-parameter
    pGeneratedCommandsInfo 必须是一个指向有效的 VkGeneratedCommandsInfoNV 结构的有效指针

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

  • VUID-vkCmdExecuteGeneratedCommandsNV-commandBuffer-cmdpool
    分配 commandBufferVkCommandPool 必须支持图形或计算操作

  • VUID-vkCmdExecuteGeneratedCommandsNV-renderpass
    此命令必须仅在渲染过程实例内部调用

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

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

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

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


辅助

内部

外部

图形
计算

操作
间接

VkGeneratedCommandsInfoNV 定义如下

// Provided by VK_NV_device_generated_commands
typedef struct VkGeneratedCommandsInfoNV {
    VkStructureType                      sType;
    const void*                          pNext;
    VkPipelineBindPoint                  pipelineBindPoint;
    VkPipeline                           pipeline;
    VkIndirectCommandsLayoutNV           indirectCommandsLayout;
    uint32_t                             streamCount;
    const VkIndirectCommandsStreamNV*    pStreams;
    uint32_t                             sequencesCount;
    VkBuffer                             preprocessBuffer;
    VkDeviceSize                         preprocessOffset;
    VkDeviceSize                         preprocessSize;
    VkBuffer                             sequencesCountBuffer;
    VkDeviceSize                         sequencesCountOffset;
    VkBuffer                             sequencesIndexBuffer;
    VkDeviceSize                         sequencesIndexOffset;
} VkGeneratedCommandsInfoNV;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • pipelineBindPoint 是用于 pipelineVkPipelineBindPoint

  • pipeline 是在生成和执行过程中使用的 VkPipeline

  • indirectCommandsLayout 是提供要生成的命令序列的 VkIndirectCommandsLayoutNV

  • streamCount 定义输入流的数量

  • pStreams 是指向 streamCountVkIndirectCommandsStreamNV 结构数组的指针,该数组提供 indirectCommandsLayout 中使用的令牌的输入数据。

  • sequencesCount 是要保留的最大序列数。如果 sequencesCountBufferVK_NULL_HANDLE,则这也是生成的实际序列数。

  • preprocessBuffer 是用于预处理执行输入数据的 VkBuffer。如果此结构与 vkCmdExecuteGeneratedCommandsNV 一起使用,并且其 isPreprocessed 设置为 VK_TRUE,则会跳过预处理步骤,并且此缓冲区中的数据不会被修改。此缓冲区的内容和布局对于应用程序是不透明的,并且必须不在与设备生成的命令相关的函数之外进行修改,或复制到另一个缓冲区以供重用。

  • preprocessOffset 是存储预处理数据的 preprocessBuffer 中的字节偏移量。

  • preprocessSizepreprocessOffset 之后 preprocessBuffer 中可用于预处理的最大字节大小。

  • sequencesCountBuffer 是一个 VkBuffer,其中实际序列数作为单个 uint32_t 值提供。

  • sequencesCountOffsetsequencesCountBuffer 中存储计数值的字节偏移量。

  • sequencesIndexBuffer 是一个 VkBuffer,它将使用的序列索引编码为 uint32_t 数组。

  • sequencesIndexOffsetsequencesIndexBuffer 中索引值开始处的字节偏移量。

有效用法
  • VUID-VkGeneratedCommandsInfoNV-pipeline-02912
    提供的 pipeline 必须与执行时绑定的管线相匹配

  • VUID-VkGeneratedCommandsInfoNV-indirectCommandsLayout-02913
    如果 indirectCommandsLayout 使用 VK_INDIRECT_COMMANDS_TOKEN_TYPE_SHADER_GROUP_NV 的令牌,则 pipeline 必须已使用多个着色器组创建

  • VUID-VkGeneratedCommandsInfoNV-indirectCommandsLayout-02914
    如果 indirectCommandsLayout 使用 VK_INDIRECT_COMMANDS_TOKEN_TYPE_SHADER_GROUP_NV 的令牌,则 pipeline 必须已在 VkGraphicsPipelineCreateInfo::flags 中设置 VK_PIPELINE_CREATE_INDIRECT_BINDABLE_BIT_NV 创建

  • VUID-VkGeneratedCommandsInfoNV-indirectCommandsLayout-02915
    如果 indirectCommandsLayout 使用 VK_INDIRECT_COMMANDS_TOKEN_TYPE_PUSH_CONSTANT_NV 的令牌,则 pipelineVkPipelineLayout 必须VkIndirectCommandsLayoutTokenNV::pushconstantPipelineLayout 相匹配

  • VUID-VkGeneratedCommandsInfoNV-streamCount-02916
    streamCount 必须indirectCommandsLayoutstreamCount 相匹配

  • VUID-VkGeneratedCommandsInfoNV-pipelineBindPoint-09084
    如果 pipelineBindPoint 的类型为 VK_PIPELINE_BIND_POINT_COMPUTE,则 pipeline 必须已使用标志 VK_PIPELINE_CREATE_INDIRECT_BINDABLE_BIT_NV 创建

  • VUID-VkGeneratedCommandsInfoNV-pipelineBindPoint-09085
    如果 pipelineBindPoint 的类型为 VK_PIPELINE_BIND_POINT_COMPUTE,则 pipeline 必须已使用 VkComputePipelineIndirectBufferInfoNV 结构创建,该结构指定了将保存其元数据的有效地址

  • VUID-VkGeneratedCommandsInfoNV-pipelineBindPoint-09086
    如果 pipelineBindPoint 的类型为 VK_PIPELINE_BIND_POINT_COMPUTE,则必须在该管线上调用 vkCmdUpdatePipelineIndirectBufferNV,以将其元数据保存到设备地址

  • VUID-VkGeneratedCommandsInfoNV-pipelineBindPoint-09087
    如果 pipelineBindPoint 的类型为 VK_PIPELINE_BIND_POINT_COMPUTE,并且如果使用了 VK_INDIRECT_COMMANDS_TOKEN_TYPE_PIPELINE_NV,则 pipeline 必须VK_NULL_HANDLE

  • VUID-VkGeneratedCommandsInfoNV-sequencesCount-02917
    sequencesCount 必须 小于或等于 VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV::maxIndirectSequenceCount 以及用于确定 preprocessSizeVkGeneratedCommandsMemoryRequirementsInfoNV::maxSequencesCount

  • VUID-VkGeneratedCommandsInfoNV-preprocessBuffer-02918
    preprocessBuffer 的使用标志中必须设置了 VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT

  • VUID-VkGeneratedCommandsInfoNV-preprocessOffset-02919
    preprocessOffset 必须对齐到 VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV::minIndirectCommandsBufferOffsetAlignment

  • VUID-VkGeneratedCommandsInfoNV-preprocessBuffer-02971
    如果 preprocessBuffer 是非稀疏的,则它必须完全且连续地绑定到一个单独的 VkDeviceMemory 对象

  • VUID-VkGeneratedCommandsInfoNV-preprocessSize-02920
    preprocessSize 必须至少等于使用匹配的输入(indirectCommandsLayout,...)通过 vkGetGeneratedCommandsMemoryRequirementsNV 返回的内存需求大小,与此结构中的输入一致

  • VUID-VkGeneratedCommandsInfoNV-sequencesCountBuffer-02921
    如果序列的实际使用计数来自提供的缓冲区,则可以设置 sequencesCountBuffer。在这种情况下,sequencesCount 用作上限

  • VUID-VkGeneratedCommandsInfoNV-sequencesCountBuffer-02922
    如果 sequencesCountBuffer 不是 VK_NULL_HANDLE,则其使用标志中必须设置了 VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT

  • VUID-VkGeneratedCommandsInfoNV-sequencesCountBuffer-02923
    如果 sequencesCountBuffer 不是 VK_NULL_HANDLE,则 sequencesCountOffset 必须对齐到 VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV::minSequencesCountBufferOffsetAlignment

  • VUID-VkGeneratedCommandsInfoNV-sequencesCountBuffer-02972
    如果 sequencesCountBuffer 不是 VK_NULL_HANDLE 且是非稀疏的,则它必须完全且连续地绑定到一个单独的 VkDeviceMemory 对象

  • VUID-VkGeneratedCommandsInfoNV-sequencesIndexBuffer-02924
    如果设置了 indirectCommandsLayoutVK_INDIRECT_COMMANDS_LAYOUT_USAGE_INDEXED_SEQUENCES_BIT_NV,则必须设置 sequencesIndexBuffer,否则它必须VK_NULL_HANDLE

  • VUID-VkGeneratedCommandsInfoNV-sequencesIndexBuffer-02925
    如果 sequencesIndexBuffer 不是 VK_NULL_HANDLE,则其使用标志中必须设置了 VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT

  • VUID-VkGeneratedCommandsInfoNV-sequencesIndexBuffer-02926
    如果 sequencesIndexBuffer 不是 VK_NULL_HANDLE,则 sequencesIndexOffset 必须对齐到 VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV::minSequencesIndexBufferOffsetAlignment

  • VUID-VkGeneratedCommandsInfoNV-sequencesIndexBuffer-02973
    如果 sequencesIndexBuffer 不是 VK_NULL_HANDLE 且是非稀疏的,则它必须完全且连续地绑定到一个单独的 VkDeviceMemory 对象

  • VUID-VkGeneratedCommandsInfoNV-indirectCommandsLayout-07078
    如果 indirectCommandsLayout 使用 VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_TASKS_NV 的标记,则 pipeline 必须包含使用 MeshNV Execution Model 的着色器阶段

  • VUID-VkGeneratedCommandsInfoNV-indirectCommandsLayout-07079
    如果 indirectCommandsLayout 使用 VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_MESH_TASKS_NV 的标记,则 pipeline 必须包含使用 MeshEXT Execution Model 的着色器阶段

有效用法(隐式)
  • VUID-VkGeneratedCommandsInfoNV-sType-sType
    sType 必须VK_STRUCTURE_TYPE_GENERATED_COMMANDS_INFO_NV

  • VUID-VkGeneratedCommandsInfoNV-pNext-pNext
    pNext 必须NULL

  • VUID-VkGeneratedCommandsInfoNV-pipelineBindPoint-parameter
    pipelineBindPoint 必须 是有效的 VkPipelineBindPoint 值。

  • VUID-VkGeneratedCommandsInfoNV-pipeline-parameter
    如果 pipeline 不是 VK_NULL_HANDLE,则 pipeline 必须是有效的 VkPipeline 句柄

  • VUID-VkGeneratedCommandsInfoNV-indirectCommandsLayout-parameter
    indirectCommandsLayout 必须是有效的 VkIndirectCommandsLayoutNV 句柄

  • VUID-VkGeneratedCommandsInfoNV-pStreams-parameter
    pStreams 必须是指向 streamCount 个有效 VkIndirectCommandsStreamNV 结构数组的有效指针

  • VUID-VkGeneratedCommandsInfoNV-preprocessBuffer-parameter
    preprocessBuffer 必须是有效的 VkBuffer 句柄

  • VUID-VkGeneratedCommandsInfoNV-sequencesCountBuffer-parameter
    如果 sequencesCountBuffer 不是 VK_NULL_HANDLE,则 sequencesCountBuffer 必须是有效的 VkBuffer 句柄

  • VUID-VkGeneratedCommandsInfoNV-sequencesIndexBuffer-parameter
    如果 sequencesIndexBuffer 不是 VK_NULL_HANDLE,则 sequencesIndexBuffer 必须是有效的 VkBuffer 句柄

  • VUID-VkGeneratedCommandsInfoNV-streamCount-arraylength
    streamCount 必须大于 0

  • VUID-VkGeneratedCommandsInfoNV-commonparent
    indirectCommandsLayoutpipelinepreprocessBuffersequencesCountBuffersequencesIndexBuffer 中作为非忽略参数的有效句柄的每一个,都必须是从同一个 VkDevice 创建、分配或检索的

参考间接命令布局中定义的函数,vkCmdExecuteGeneratedCommandsNV 的行为如下:

uint32_t sequencesCount = sequencesCountBuffer ?
      min(maxSequencesCount, sequencesCountBuffer.load_uint32(sequencesCountOffset) :
      maxSequencesCount;


cmdProcessAllSequences(commandBuffer, pipeline,
                       indirectCommandsLayout, pIndirectCommandsStreams,
                       sequencesCount,
                       sequencesIndexBuffer, sequencesIndexOffset);

// The stateful commands within indirectCommandsLayout will not
// affect the state of subsequent commands in the target
// command buffer (cmd)

请务必注意,此命令之后,与所使用的 pipelineBindPoint 相关的所有状态值都是未定义的

可以使用以下命令在执行之前预处理命令

// Provided by VK_NV_device_generated_commands
void vkCmdPreprocessGeneratedCommandsNV(
    VkCommandBuffer                             commandBuffer,
    const VkGeneratedCommandsInfoNV*            pGeneratedCommandsInfo);
  • commandBuffer 是执行预处理的命令缓冲区。

  • pGeneratedCommandsInfo 是一个指向 VkGeneratedCommandsInfoNV 结构的指针,该结构包含影响预处理步骤的参数。

有效用法
  • VUID-vkCmdPreprocessGeneratedCommandsNV-commandBuffer-02974
    commandBuffer 必须 不是受保护的命令缓冲区。

  • VUID-vkCmdPreprocessGeneratedCommandsNV-pGeneratedCommandsInfo-02927
    pGeneratedCommandsInfoindirectCommandsLayout 必须已使用设置的 VK_INDIRECT_COMMANDS_LAYOUT_USAGE_EXPLICIT_PREPROCESS_BIT_NV 位创建。

  • VUID-vkCmdPreprocessGeneratedCommandsNV-deviceGeneratedCommands-02928
    必须启用 VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV::deviceGeneratedCommands 功能。

有效用法(隐式)
  • VUID-vkCmdPreprocessGeneratedCommandsNV-commandBuffer-parameter
    commandBuffer 必须是一个有效的 VkCommandBuffer 句柄

  • VUID-vkCmdPreprocessGeneratedCommandsNV-pGeneratedCommandsInfo-parameter
    pGeneratedCommandsInfo 必须是一个指向有效的 VkGeneratedCommandsInfoNV 结构的有效指针

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

  • VUID-vkCmdPreprocessGeneratedCommandsNV-commandBuffer-cmdpool
    分配 commandBufferVkCommandPool 必须支持图形或计算操作

  • VUID-vkCmdPreprocessGeneratedCommandsNV-renderpass
    此命令必须仅在渲染通道实例之外调用。

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

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

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

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


辅助

外部

外部

图形
计算

操作

在通过 vkCmdPreprocessGeneratedCommandsNV 预处理命令时,用于计算管线的间接命令生成的已绑定描述符集和推送常量必须已指定。它们必须在通过 vkCmdExecuteGeneratedCommandsNV 提交间接命令执行之前保持不变。

如果计算管线的推送常量也在 VkGeneratedCommandsInfoNV::indirectCommandsLayout 中使用 VK_INDIRECT_COMMANDS_TOKEN_TYPE_PUSH_CONSTANT_NV 标记指定,则这些值将覆盖先前为计算管线推送的推送常量。

使用 VK_EXT_device_generated_commands,命令的实际生成及其在设备上的执行被视为一个单一的操作,使用

// Provided by VK_EXT_device_generated_commands
void vkCmdExecuteGeneratedCommandsEXT(
    VkCommandBuffer                             commandBuffer,
    VkBool32                                    isPreprocessed,
    const VkGeneratedCommandsInfoEXT*           pGeneratedCommandsInfo);
  • commandBuffer 是将命令记录到的命令缓冲区。

  • isPreprocessed 表示输入数据是否已在设备上预处理。 如果为 VK_FALSE,此命令将隐式触发预处理步骤,否则不会。

  • pGeneratedCommandsInfo 是一个指向 VkGeneratedCommandsInfoEXT 结构的指针,该结构包含影响命令生成的参数。

如果使用 VK_INDIRECT_COMMANDS_LAYOUT_USAGE_UNORDERED_SEQUENCES_BIT_EXT 标志创建 VkGeneratedCommandsInfoEXT::indirectCommandsLayout,那么通过此命令执行序列可能会使用实现定义的排序,该排序不能保证在使用相同输入数据时是一致的。这不会影响序列中标记处理的顺序。这是使用 VK_INDIRECT_COMMANDS_TOKEN_TYPE_DISPATCH_EXT 的隐含排序。

在调用 vkCmdExecuteGeneratedCommandsEXT 之后,命令缓冲区状态将根据执行的标记变为未定义。下表指定了所使用的标记与状态失效之间的关系。

表 3. 间接执行状态失效
通用令牌 失效的状态

VK_INDIRECT_COMMANDS_TOKEN_TYPE_EXECUTION_SET_EXT

绑定的着色器和管线

VK_INDIRECT_COMMANDS_TOKEN_TYPE_PUSH_CONSTANT_EXT

推送常量数据

VK_INDIRECT_COMMANDS_TOKEN_TYPE_SEQUENCE_INDEX_EXT

推送常量数据

VK_INDIRECT_COMMANDS_TOKEN_TYPE_INDEX_BUFFER_EXT

索引缓冲区

VK_INDIRECT_COMMANDS_TOKEN_TYPE_VERTEX_BUFFER_EXT

顶点缓冲区

有效用法
  • VUID-vkCmdExecuteGeneratedCommandsEXT-magFilter-04553
    如果使用一个 VkSampler (其 magFilterminFilter 等于 VK_FILTER_LINEARreductionMode 等于 VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE,且 compareEnable 等于 VK_FALSE) 来采样一个 VkImageView,作为此命令的结果,则该图像视图的 格式特性 必须包含 VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT

  • VUID-vkCmdExecuteGeneratedCommandsEXT-magFilter-09598
    如果使用一个 VkSampler (其 magFilterminFilter 等于 VK_FILTER_LINEAR,且 reductionMode 等于 VK_SAMPLER_REDUCTION_MODE_MINVK_SAMPLER_REDUCTION_MODE_MAX) 来采样一个 VkImageView,作为此命令的结果,则该图像视图的 格式特性 必须包含 VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_MINMAX_BIT

  • VUID-vkCmdExecuteGeneratedCommandsEXT-mipmapMode-04770
    如果使用一个 VkSampler (其 mipmapMode 等于 VK_SAMPLER_MIPMAP_MODE_LINEARreductionMode 等于 VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE,且 compareEnable 等于 VK_FALSE) 来采样一个 VkImageView,作为此命令的结果,则该图像视图的 格式特性 必须包含 VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT

  • VUID-vkCmdExecuteGeneratedCommandsEXT-mipmapMode-09599
    如果使用一个 VkSampler (其 mipmapMode 等于 VK_SAMPLER_MIPMAP_MODE_LINEAR,且 reductionMode 等于 VK_SAMPLER_REDUCTION_MODE_MINVK_SAMPLER_REDUCTION_MODE_MAX) 来采样一个 VkImageView,作为此命令的结果,则该图像视图的 格式特性 必须包含 VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_MINMAX_BIT

  • VUID-vkCmdExecuteGeneratedCommandsEXT-unnormalizedCoordinates-09635
    如果使用一个 VkSampler (其 unnormalizedCoordinates 等于 VK_TRUE) 来采样一个 VkImageView,作为此命令的结果,则该图像视图的 levelCountlayerCount 必须为 1。

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-08609
    如果使用一个 VkSampler (其 unnormalizedCoordinates 等于 VK_TRUE) 来采样一个 VkImageView,作为此命令的结果,则该图像视图的 viewType 必须VK_IMAGE_VIEW_TYPE_1DVK_IMAGE_VIEW_TYPE_2D

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-08610
    如果使用一个 VkSampler (其 unnormalizedCoordinates 等于 VK_TRUE) 来采样一个 VkImageView,作为此命令的结果,则该采样器 不得与任何名称中包含 ImplicitLodDrefProj 的 SPIR-V OpImageSample*OpImageSparseSample* 指令一起使用。

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-08611
    如果使用一个 VkSampler (其 unnormalizedCoordinates 等于 VK_TRUE) 来采样一个 VkImageView,作为此命令的结果,则该采样器 不得与任何包含 LOD 偏差或任何偏移值的 SPIR-V OpImageSample*OpImageSparseSample* 指令一起使用。

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-06479
    如果一个 VkImageView 使用 深度比较 进行采样,则该图像视图的 格式特性 必须包含 VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_DEPTH_COMPARISON_BIT

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-02691
    如果一个 VkImageView 作为此命令的结果使用原子操作进行访问,则该图像视图的 格式特性 必须包含 VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-07888
    如果一个 VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER 描述符作为此命令的结果使用原子操作进行访问,则该存储纹理缓冲区的 格式特性 必须包含 VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-02692
    如果一个 VkImageView 作为此命令的结果使用 VK_FILTER_CUBIC_EXT 进行采样,则该图像视图的 格式特性 必须包含 VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT

  • VUID-vkCmdExecuteGeneratedCommandsEXT-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-vkCmdExecuteGeneratedCommandsEXT-filterCubic-02694
    任何作为此命令的结果使用 VK_FILTER_CUBIC_EXT 进行采样的 VkImageView 必须具有支持立方体过滤的 VkImageViewType 和格式,如 VkFilterCubicImageViewImageFormatPropertiesEXT::filterCubic (由 vkGetPhysicalDeviceImageFormatProperties2 返回) 所指定。

  • VUID-vkCmdExecuteGeneratedCommandsEXT-filterCubicMinmax-02695
    任何作为此命令的结果使用 VK_FILTER_CUBIC_EXT 进行采样 (且其缩减模式为 VK_SAMPLER_REDUCTION_MODE_MINVK_SAMPLER_REDUCTION_MODE_MAX) 的 VkImageView 必须具有支持立方体过滤以及最小值/最大值过滤的 VkImageViewType 和格式,如 VkFilterCubicImageViewImageFormatPropertiesEXT::filterCubicMinmax (由 vkGetPhysicalDeviceImageFormatProperties2 返回) 所指定。

  • VUID-vkCmdExecuteGeneratedCommandsEXT-cubicRangeClamp-09212
    如果未启用 cubicRangeClamp 功能,则由此命令采样的任何使用 VK_FILTER_CUBIC_EXTVkImageView 必须 不具有 VkSamplerReductionModeCreateInfo::reductionMode 等于 VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE_RANGECLAMP_QCOM 的情况。

  • VUID-vkCmdExecuteGeneratedCommandsEXT-reductionMode-09213
    由此命令采样的任何具有 VkSamplerReductionModeCreateInfo::reductionMode 等于 VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE_RANGECLAMP_QCOMVkImageView 必须 使用 VK_FILTER_CUBIC_EXT 进行采样。

  • VUID-vkCmdExecuteGeneratedCommandsEXT-selectableCubicWeights-09214
    如果未启用 selectableCubicWeights 功能,则由此命令采样的任何使用 VK_FILTER_CUBIC_EXTVkImageView 必须 具有 VkSamplerCubicWeightsCreateInfoQCOM::cubicWeights 等于 VK_CUBIC_FILTER_WEIGHTS_CATMULL_ROM_QCOM 的情况。

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

  • VUID-vkCmdExecuteGeneratedCommandsEXT-OpTypeImage-07027
    对于任何被写入为存储图像且 OpTypeImage 的图像格式字段为 UnknownVkImageView,该视图的 格式特性 必须 包含 VK_FORMAT_FEATURE_2_STORAGE_WRITE_WITHOUT_FORMAT_BIT

  • VUID-vkCmdExecuteGeneratedCommandsEXT-OpTypeImage-07028
    对于任何被读取为存储图像且 OpTypeImage 的图像格式字段为 UnknownVkImageView,该视图的 格式特性 必须 包含 VK_FORMAT_FEATURE_2_STORAGE_READ_WITHOUT_FORMAT_BIT

  • VUID-vkCmdExecuteGeneratedCommandsEXT-OpTypeImage-07029
    对于任何被写入为存储纹理缓冲且 OpTypeImage 的图像格式字段为 UnknownVkBufferView,该视图的 缓冲特性 必须 包含 VK_FORMAT_FEATURE_2_STORAGE_WRITE_WITHOUT_FORMAT_BIT

  • VUID-vkCmdExecuteGeneratedCommandsEXT-OpTypeImage-07030
    对于任何被读取为存储纹理缓冲且 OpTypeImage 的图像格式字段为 UnknownVkBufferView,该视图的 缓冲特性 必须 包含 VK_FORMAT_FEATURE_2_STORAGE_READ_WITHOUT_FORMAT_BIT

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

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

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

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

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

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-08115
    如果绑定到管线绑定点的 VkPipeline 使用的描述符是通过 vkCmdBindDescriptorSets 指定的,则绑定的 VkPipeline 必须在创建时未使用 VK_PIPELINE_CREATE_DESCRIPTOR_BUFFER_BIT_EXT

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

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

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

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

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-08605
    如果描述符被使用以 VK_DESCRIPTOR_SET_LAYOUT_CREATE_DESCRIPTOR_BUFFER_BIT_EXT 创建的 VkDescriptorSetLayout 创建的 VkShaderEXT 动态使用,则描述符内存必须是常驻的。

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-08606
    如果 shaderObject 功能未启用,则必须将一个有效的管线绑定到此命令所用的管线绑定点。

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

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-08607
    如果 shaderObject 功能已启用,则必须将一个有效的管线绑定到此命令所用的管线绑定点,或者必须将有效的和 VK_NULL_HANDLE 着色器对象的有效组合绑定到此命令所用管线绑定点对应的每个支持的着色器阶段。

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

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

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

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

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

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

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

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

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

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

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

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

  • VUID-vkCmdExecuteGeneratedCommandsEXT-SampledType-04470
    如果由于此命令访问了具有 64 位组件宽度的 VkFormatVkImageView,则该指令的 OpTypeImage 操作数的 SampledTypeWidth 必须为 64。

  • VUID-vkCmdExecuteGeneratedCommandsEXT-SampledType-04471
    如果由于此命令访问了具有小于 64 位组件宽度的 VkFormatVkImageView,则该指令的 OpTypeImage 操作数的 SampledTypeWidth 必须为 32。

  • VUID-vkCmdExecuteGeneratedCommandsEXT-SampledType-04472
    如果由于此命令访问了具有 64 位组件宽度的 VkFormatVkBufferView,则该指令的 OpTypeImage 操作数的 SampledTypeWidth 必须为 64。

  • VUID-vkCmdExecuteGeneratedCommandsEXT-SampledType-04473
    如果由于此命令访问了具有小于 64 位组件宽度的 VkFormatVkBufferView,则该指令的 OpTypeImage 操作数的 SampledTypeWidth 必须为 32。

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

  • VUID-vkCmdExecuteGeneratedCommandsEXT-sparseImageInt64Atomics-04475
    如果未启用 sparseImageInt64Atomics 功能,则使用 VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT 标志创建的 VkBuffer 对象必须不能通过 SampledTypeWidth 为 64 的 OpTypeImage 被此命令的原子指令访问。

  • VUID-vkCmdExecuteGeneratedCommandsEXT-OpImageWeightedSampleQCOM-06971
    如果使用 OpImageWeightedSampleQCOMVkImageView 进行采样,则该图像视图的格式特征必须包含 VK_FORMAT_FEATURE_2_WEIGHT_SAMPLED_IMAGE_BIT_QCOM

  • VUID-vkCmdExecuteGeneratedCommandsEXT-OpImageWeightedSampleQCOM-06972
    如果 OpImageWeightedSampleQCOM 使用 VkImageView 作为采样权重图像,则该图像视图的格式特征必须包含 VK_FORMAT_FEATURE_2_WEIGHT_IMAGE_BIT_QCOM

  • VUID-vkCmdExecuteGeneratedCommandsEXT-OpImageBoxFilterQCOM-06973
    如果使用 OpImageBoxFilterQCOMVkImageView 进行采样,则该图像视图的格式特征必须包含 VK_FORMAT_FEATURE_2_BOX_FILTER_SAMPLED_BIT_QCOM

  • VUID-vkCmdExecuteGeneratedCommandsEXT-OpImageBlockMatchSSDQCOM-06974
    如果使用 OpImageBlockMatchSSDQCOMVkImageView 读取数据,则该图像视图的格式特征必须包含 VK_FORMAT_FEATURE_2_BLOCK_MATCHING_BIT_QCOM

  • VUID-vkCmdExecuteGeneratedCommandsEXT-OpImageBlockMatchSADQCOM-06975
    如果使用 OpImageBlockMatchSADQCOMVkImageView 读取数据,则该图像视图的格式特征必须包含 VK_FORMAT_FEATURE_2_BLOCK_MATCHING_BIT_QCOM

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

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

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

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

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

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

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

  • VUID-vkCmdExecuteGeneratedCommandsEXT-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-vkCmdExecuteGeneratedCommandsEXT-renderPass-02684
    当前的渲染通道必须与创建绑定到 VK_PIPELINE_BIND_POINT_GRAPHICSVkPipeline 时指定的 VkGraphicsPipelineCreateInfo 结构的 renderPass 成员兼容

  • VUID-vkCmdExecuteGeneratedCommandsEXT-subpass-02685
    当前渲染通道的子通道索引必须等于创建绑定到 VK_PIPELINE_BIND_POINT_GRAPHICSVkPipeline 时指定的 VkGraphicsPipelineCreateInfo 结构的 subpass 成员。

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-07748
    如果任何着色器静态访问输入附件,则必须通过描述符集将有效的描述符绑定到管线。

  • VUID-vkCmdExecuteGeneratedCommandsEXT-OpTypeImage-07468
    如果此管线执行的任何着色器访问 Dim 操作数为 SubpassDataOpTypeImage 变量,则它必须使用与当前子通道中的有效输入附件对应的 InputAttachmentIndex 进行修饰。

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-07469
    子通道中访问的输入附件视图必须使用与相应子通道定义相同的 VkFormat 创建,并且使用与绑定的 VkFramebuffer 中子通道的 pInputAttachments[InputAttachmentIndex] 引用的附件兼容的 VkImageView 创建,如 Fragment Input Attachment Compatibility 中所指定。

  • VUID-vkCmdExecuteGeneratedCommandsEXT-pDepthInputAttachmentIndex-09595
    动态渲染通道中访问的输入附件视图,其 InputAttachmentIndexVkRenderingInputAttachmentIndexInfo 引用,或者如果 VkRenderingInputAttachmentIndexInfo:pDepthInputAttachmentIndexVkRenderingInputAttachmentIndexInfo:pStencilInputAttachmentIndexNULL 则没有 InputAttachmentIndex,则必须使用与 VkRenderingInfo 中对应的颜色、深度或模板附件兼容的 VkImageView 创建。

  • VUID-vkCmdExecuteGeneratedCommandsEXT-pDepthInputAttachmentIndex-09596
    如果 VkRenderingInputAttachmentIndexInfo:pDepthInputAttachmentIndexVkRenderingInputAttachmentIndexInfo:pStencilInputAttachmentIndex 均不为 NULL,则通过着色器对象在动态渲染通道中访问的输入附件视图必须具有 InputAttachmentIndex

  • VUID-vkCmdExecuteGeneratedCommandsEXT-InputAttachmentIndex-09597
    如果通过着色器对象在动态渲染通道中访问的输入附件视图具有 InputAttachmentIndex,则 InputAttachmentIndex必须VkRenderingInputAttachmentIndexInfo 中的索引匹配。

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-06537
    作为当前渲染通道中的附件使用的图像子资源的内存后备存储必须不能以任何方式写入,除非通过此命令作为附件写入

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-09000
    如果颜色附件被此子通道中的任何先前命令或此子通道的加载、存储或解析操作写入,且它不在 VK_IMAGE_LAYOUT_ATTACHMENT_FEEDBACK_LOOP_OPTIMAL_EXT 图像布局中,并且满足以下任一条件:

    • 绑定的管线上设置了 VK_PIPELINE_CREATE_COLOR_ATTACHMENT_FEEDBACK_LOOP_BIT_EXT

    • 上次调用 vkCmdSetAttachmentFeedbackLoopEnableEXT 时包含了 VK_IMAGE_ASPECT_COLOR_BIT 并且

      • 没有绑定的图形管线 或

      • 绑定的图形管线是使用 VK_DYNAMIC_STATE_ATTACHMENT_FEEDBACK_LOOP_ENABLE_EXT 创建的

    那么它必须不能以任何方式访问,除非通过此命令作为附件访问

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-09001
    如果深度附件被此子通道中的任何先前命令或此子通道的加载、存储或解析操作写入,且它不在 VK_IMAGE_LAYOUT_ATTACHMENT_FEEDBACK_LOOP_OPTIMAL_EXT 图像布局中,并且满足以下任一条件:

    • 绑定的管线上设置了 VK_PIPELINE_CREATE_DEPTH_STENCIL_ATTACHMENT_FEEDBACK_LOOP_BIT_EXT

    • 上次调用 vkCmdSetAttachmentFeedbackLoopEnableEXT 时包含了 VK_IMAGE_ASPECT_DEPTH_BIT 并且

      • 没有绑定的图形管线 或

      • 绑定的图形管线是使用 VK_DYNAMIC_STATE_ATTACHMENT_FEEDBACK_LOOP_ENABLE_EXT 创建的

    那么它必须不能以任何方式访问,除非通过此命令作为附件访问

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-09002
    如果模板附件被此子通道中的任何先前命令或此子通道的加载、存储或解析操作写入,且它不在 VK_IMAGE_LAYOUT_ATTACHMENT_FEEDBACK_LOOP_OPTIMAL_EXT 图像布局中,并且满足以下任一条件:

    • 绑定的管线上设置了 VK_PIPELINE_CREATE_DEPTH_STENCIL_ATTACHMENT_FEEDBACK_LOOP_BIT_EXT

    • 上次调用 vkCmdSetAttachmentFeedbackLoopEnableEXT 时包含了 VK_IMAGE_ASPECT_STENCIL_BIT 并且

      • 没有绑定的图形管线 或

      • 绑定的图形管线是使用 VK_DYNAMIC_STATE_ATTACHMENT_FEEDBACK_LOOP_ENABLE_EXT 创建的

    那么它必须不能以任何方式访问,除非通过此命令作为附件访问

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-09003
    如果一个附件被此子通道中的任何先前命令或此子通道的加载、存储或解析操作写入,那么它必须不能以任何方式访问,除非通过此命令作为附件、存储图像或采样图像访问

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-06539
    如果当前子通道中任何先前记录的命令以除附件之外的任何方式访问了在此子通道中用作附件的图像子资源,则此命令必须不能将该图像子资源作为附件写入

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-06886
    如果当前渲染通道实例对深度方面使用了只读布局的深度/模板附件,则必须禁用深度写入

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-06887
    如果当前渲染通道实例对模板方面使用了只读布局的深度/模板附件,并且前后writeMask都不是零,并且启用了模板测试,则所有模板操作必须VK_STENCIL_OP_KEEP

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-07831
    如果绑定的图形管线状态创建时启用了 VK_DYNAMIC_STATE_VIEWPORT 动态状态,那么在本次绘制命令之前,当前命令缓冲区中必须已调用过 vkCmdSetViewport 且没有随后失效

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-07832
    如果绑定的图形管线状态创建时启用了 VK_DYNAMIC_STATE_SCISSOR 动态状态,那么在本次绘制命令之前,当前命令缓冲区中必须已调用过 vkCmdSetScissor 且没有随后失效

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-07833
    如果绑定的图形管线状态创建时启用了 VK_DYNAMIC_STATE_LINE_WIDTH 动态状态,那么在本次绘制命令之前,当前命令缓冲区中必须已调用过 vkCmdSetLineWidth 且没有随后失效

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-08617
    如果着色器对象绑定到任何图形阶段,并且当前命令缓冲区中最近一次调用 vkCmdSetRasterizerDiscardEnablerasterizerDiscardEnable 设置为 VK_FALSE,并且当前命令缓冲区中最近一次调用 vkCmdSetPolygonModeEXTpolygonMode 设置为 VK_POLYGON_MODE_LINE,那么在本次绘制命令之前,当前命令缓冲区中必须已调用过 vkCmdSetLineWidth 且没有随后失效

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-08618
    如果着色器对象绑定到任何图形阶段,并且当前命令缓冲区中最近一次调用 vkCmdSetRasterizerDiscardEnablerasterizerDiscardEnable 设置为 VK_FALSE,并且当前命令缓冲区中最近一次调用 vkCmdSetPrimitiveTopologyprimitiveTopology 设置为任何线拓扑,那么在本次绘制命令之前,当前命令缓冲区中必须已调用过 vkCmdSetLineWidth 且没有随后失效

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-08619
    如果一个输出线图元的着色器对象绑定到 VK_SHADER_STAGE_TESSELLATION_EVALUATION_BITVK_SHADER_STAGE_GEOMETRY_BIT 阶段,并且当前命令缓冲区中最近一次调用 vkCmdSetRasterizerDiscardEnablerasterizerDiscardEnable 设置为 VK_FALSE,那么在此绘制命令之前,必须已调用过 vkCmdSetLineWidth 且未在当前命令缓冲区中随后失效

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-07834
    如果一个着色器对象绑定到任何图形阶段,或者绑定了一个启用了 VK_DYNAMIC_STATE_DEPTH_BIAS 动态状态的图形管线,并且 rasterizerDiscardEnable当前值VK_FALSE,且 depthBiasEnable当前值VK_TRUE,那么在此绘制命令之前,必须已调用过 vkCmdSetDepthBiasvkCmdSetDepthBias2EXT 且未在当前命令缓冲区中随后失效

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-07835
    如果绑定的图形管线状态创建时启用了 VK_DYNAMIC_STATE_BLEND_CONSTANTS 动态状态,那么在此绘制命令之前,必须已调用过 vkCmdSetBlendConstants 且未在当前命令缓冲区中随后失效

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-08621
    如果一个着色器对象绑定到 VK_SHADER_STAGE_FRAGMENT_BIT 阶段,并且当前命令缓冲区中最近一次调用 vkCmdSetRasterizerDiscardEnablerasterizerDiscardEnable 设置为 VK_FALSE,并且当前命令缓冲区中最近一次调用 vkCmdSetColorBlendEnableEXTpColorBlendEnables 的任何元素设置为 VK_TRUE,并且当前命令缓冲区中最近一次调用 vkCmdSetColorBlendEquationEXTpColorBlendEquations 的相同元素设置为一个 VkColorBlendEquationEXT 结构,且该结构的任何 VkBlendFactor 成员的值为 VK_BLEND_FACTOR_CONSTANT_COLORVK_BLEND_FACTOR_ONE_MINUS_CONSTANT_COLORVK_BLEND_FACTOR_CONSTANT_ALPHAVK_BLEND_FACTOR_ONE_MINUS_CONSTANT_ALPHA,那么在此绘制命令之前,必须已调用过 vkCmdSetBlendConstants 且未在当前命令缓冲区中随后失效

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-07836
    如果一个着色器对象绑定到任何图形阶段,或者绑定了一个启用了 VK_DYNAMIC_STATE_DEPTH_BOUNDS 动态状态的图形管线,并且 rasterizerDiscardEnable当前值VK_FALSE,且 depthBoundsTestEnable当前值VK_TRUE,那么在此绘制命令之前,必须已调用过 vkCmdSetDepthBounds 且未在当前命令缓冲区中随后失效

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-07837
    如果一个着色器对象绑定到任何图形阶段,或者绑定了一个启用了 VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK 动态状态的图形管线,并且 rasterizerDiscardEnable当前值VK_FALSE,且 stencilTestEnable当前值VK_TRUE,那么在此绘制命令之前,必须已调用过 vkCmdSetStencilCompareMask 且未在当前命令缓冲区中随后失效

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-07838
    如果一个着色器对象绑定到任何图形阶段,或者绑定了一个启用了 VK_DYNAMIC_STATE_STENCIL_WRITE_MASK 动态状态的图形管线,并且 rasterizerDiscardEnable当前值VK_FALSE,且 stencilTestEnable当前值VK_TRUE,那么在此绘制命令之前,必须已调用过 vkCmdSetStencilWriteMask 且未在当前命令缓冲区中随后失效

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-07839
    如果一个着色器对象绑定到任何图形阶段,或者绑定了一个启用了 VK_DYNAMIC_STATE_STENCIL_REFERENCE 动态状态的图形管线,并且 rasterizerDiscardEnable当前值VK_FALSE,且 stencilTestEnable当前值VK_TRUE,那么在此绘制命令之前,必须已调用过 vkCmdSetStencilReference 且未在当前命令缓冲区中随后失效

  • VUID-vkCmdExecuteGeneratedCommandsEXT-maxMultiviewInstanceIndex-02688
    如果在启用了多视图的渲染通道实例中记录绘制,则最大实例索引必须小于或等于 VkPhysicalDeviceMultiviewProperties::maxMultiviewInstanceIndex

  • VUID-vkCmdExecuteGeneratedCommandsEXT-sampleLocationsEnable-02689
    如果绑定的图形管线创建时将 VkPipelineSampleLocationsStateCreateInfoEXT::sampleLocationsEnable 设置为 VK_TRUE,并且当前子通道具有深度/模板附件,则该附件必须已使用 VK_IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT 位集创建

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-07634
    如果启用了 VK_EXT_sample_locations 扩展,并且着色器对象绑定到任何图形阶段,或者绑定了一个启用了 VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_ENABLE_EXT 动态状态的图形管线,并且 rasterizerDiscardEnable当前值VK_FALSE,那么在此绘制命令之前,必须已调用过 vkCmdSetSampleLocationsEnableEXT 且未在当前命令缓冲区中随后失效

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-06666
    如果启用了 VK_EXT_sample_locations 扩展,并且着色器对象绑定到任何图形阶段,或者绑定了一个启用了 VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_EXT 动态状态的图形管线,并且 rasterizerDiscardEnable当前值VK_FALSE,且 sampleLocationsEnable当前值VK_TRUE,则在此绘制命令之前,必须已调用过 vkCmdSetSampleLocationsEXT,并且在当前命令缓冲区中没有被随后失效

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-07840
    如果着色器对象绑定到任何图形阶段,或者绑定了一个启用了 VK_DYNAMIC_STATE_CULL_MODE 动态状态的图形管线,并且 rasterizerDiscardEnable当前值VK_FALSE,则在此绘制命令之前,必须已调用过 vkCmdSetCullMode,并且在当前命令缓冲区中没有被随后失效

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-07841
    如果着色器对象绑定到任何图形阶段,或者绑定了一个启用了 VK_DYNAMIC_STATE_FRONT_FACE 动态状态的图形管线,并且 rasterizerDiscardEnable当前值VK_FALSE,则在此绘制命令之前,必须已调用过 vkCmdSetFrontFace,并且在当前命令缓冲区中没有被随后失效

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-07843
    如果着色器对象绑定到任何图形阶段,或者绑定了一个启用了 VK_DYNAMIC_STATE_DEPTH_TEST_ENABLE 动态状态的图形管线,并且 rasterizerDiscardEnable当前值VK_FALSE,则在此绘制命令之前,必须已调用过 vkCmdSetDepthTestEnable,并且在当前命令缓冲区中没有被随后失效

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-07844
    如果着色器对象绑定到任何图形阶段,或者绑定了一个启用了 VK_DYNAMIC_STATE_DEPTH_WRITE_ENABLE 动态状态的图形管线,并且 rasterizerDiscardEnable当前值VK_FALSE,则在此绘制命令之前,必须已调用过 vkCmdSetDepthWriteEnable,并且在当前命令缓冲区中没有被随后失效

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-07845
    如果着色器对象绑定到任何图形阶段,或者绑定了一个启用了 VK_DYNAMIC_STATE_DEPTH_COMPARE_OP 动态状态的图形管线,并且 rasterizerDiscardEnable当前值VK_FALSE,且 depthTestEnable当前值VK_TRUE,则在此绘制命令之前,必须已调用过 vkCmdSetDepthCompareOp,并且在当前命令缓冲区中没有被随后失效

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-07846
    如果启用了depthBounds特性,并且着色器对象绑定到任何图形阶段,或者绑定了一个启用了 VK_DYNAMIC_STATE_DEPTH_BOUNDS_TEST_ENABLE 动态状态的图形管线,且 rasterizerDiscardEnable当前值VK_FALSE,则在此绘制命令之前,必须已调用过 vkCmdSetDepthBoundsTestEnable,并且在当前命令缓冲区中没有被随后失效

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-07847
    如果着色器对象绑定到任何图形阶段,或者绑定了一个启用了 VK_DYNAMIC_STATE_STENCIL_TEST_ENABLE 动态状态的图形管线,并且 rasterizerDiscardEnable当前值VK_FALSE,则在此绘制命令之前,必须已调用过 vkCmdSetStencilTestEnable,并且在当前命令缓冲区中没有被随后失效

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-07848
    如果着色器对象绑定到任何图形阶段,或者绑定了一个启用了 VK_DYNAMIC_STATE_STENCIL_OP 动态状态的图形管线,并且 rasterizerDiscardEnable当前值VK_FALSE,且 stencilTestEnable当前值VK_TRUE,则在此绘制命令之前,必须已调用过 vkCmdSetStencilOp,并且在当前命令缓冲区中没有被随后失效

  • VUID-vkCmdExecuteGeneratedCommandsEXT-viewportCount-03417
    如果着色器对象绑定到任何图形阶段,或者绑定了一个启用了 VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT 动态状态的图形管线,并且该状态没有被继承,则在此绘制命令之前,必须已调用过 vkCmdSetViewportWithCount,并且在当前命令缓冲区中没有被随后失效

  • VUID-vkCmdExecuteGeneratedCommandsEXT-scissorCount-03418
    如果着色器对象绑定到任何图形阶段,或者绑定了一个启用了 VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT 动态状态的图形管线,并且该状态没有被继承,则在此绘制命令之前,必须已调用过 vkCmdSetScissorWithCount,并且在当前命令缓冲区中没有被随后失效

  • VUID-vkCmdExecuteGeneratedCommandsEXT-viewportCount-03419
    如果着色器对象绑定到任何图形阶段,或者绑定了使用 VK_DYNAMIC_STATE_SCISSOR_WITH_COUNTVK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT 动态状态创建的图形管线,并且该状态未被继承,那么 vkCmdSetViewportWithCountviewportCount 参数必须vkCmdSetScissorWithCountscissorCount 参数匹配。

  • VUID-vkCmdExecuteGeneratedCommandsEXT-viewportCount-04137
    如果绑定的图形管线状态是用 VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT 动态状态启用的创建的,但没有启用 VK_DYNAMIC_STATE_VIEWPORT_W_SCALING_NV 动态状态,则绑定的图形管线必须已使用 VkPipelineViewportWScalingStateCreateInfoNV::viewportCount 创建,且该值大于或等于上次调用 vkCmdSetViewportWithCount 中的 viewportCount 参数。

  • VUID-vkCmdExecuteGeneratedCommandsEXT-viewportCount-04138
    如果启用了 VK_NV_clip_space_w_scaling 扩展,并且着色器对象绑定到任何图形阶段,或者绑定了使用 VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNTVK_DYNAMIC_STATE_VIEWPORT_W_SCALING_NV 动态状态创建的图形管线,当前值 viewportWScalingEnableVK_TRUE,则必须调用过 vkCmdSetViewportWScalingNV 且在当前命令缓冲区中,在此绘制命令之前没有被失效

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-08636
    如果启用了 VK_NV_clip_space_w_scaling 扩展,并且着色器对象绑定到任何图形阶段,或者绑定了使用 VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNTVK_DYNAMIC_STATE_VIEWPORT_W_SCALING_NV 动态状态创建的图形管线,当前值 viewportWScalingEnableVK_TRUE,则上次调用 vkCmdSetViewportWScalingNV 中的 viewportCount 参数必须大于或等于上次调用 vkCmdSetViewportWithCount 中的 viewportCount 参数。

  • VUID-vkCmdExecuteGeneratedCommandsEXT-viewportCount-04139
    如果绑定的图形管线状态是用 VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT 动态状态启用的创建的,但没有启用 VK_DYNAMIC_STATE_VIEWPORT_SHADING_RATE_PALETTE_NV 动态状态,则绑定的图形管线必须已使用 VkPipelineViewportShadingRateImageStateCreateInfoNV::viewportCount 创建,且该值大于或等于上次调用 vkCmdSetViewportWithCount 中的 viewportCount 参数。

  • VUID-vkCmdExecuteGeneratedCommandsEXT-shadingRateImage-09233
    如果启用了 shadingRateImage 功能,并且着色器对象绑定到任何图形阶段,或者绑定了使用 VK_DYNAMIC_STATE_VIEWPORT_COARSE_SAMPLE_ORDER_NV 创建的图形管线,并且 当前值 rasterizerDiscardEnableVK_FALSE,则必须调用过 vkCmdSetCoarseSampleOrderNV 且在当前命令缓冲区中,在此绘制命令之前没有被失效

  • VUID-vkCmdExecuteGeneratedCommandsEXT-shadingRateImage-09234
    如果启用了 shadingRateImage 功能,并且着色器对象绑定到任何图形阶段,或者绑定了使用 VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNTVK_DYNAMIC_STATE_VIEWPORT_SHADING_RATE_PALETTE_NV 动态状态创建的图形管线,当前值 rasterizerDiscardEnableVK_FALSE,并且 当前值 shadingRateImageEnableVK_TRUE,则必须调用过 vkCmdSetViewportShadingRatePaletteNV 且在当前命令缓冲区中,在此绘制命令之前没有被失效

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-08637
    如果启用了 shadingRateImage 功能,并且着色器对象绑定到任何图形阶段,或者绑定了使用 VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNTVK_DYNAMIC_STATE_VIEWPORT_SHADING_RATE_PALETTE_NV 动态状态创建的图形管线,当前值 rasterizerDiscardEnableVK_FALSE,并且 当前值 shadingRateImageEnableVK_TRUE,则上次调用 vkCmdSetViewportShadingRatePaletteNV 中的 viewportCount 参数必须大于或等于上次调用 vkCmdSetViewportWithCount 中的 viewportCount 参数。

  • VkPipelineViewportStateCreateInfo 链接了 VkPipelineViewportSwizzleStateCreateInfoNV 结构创建的,则绑定的图形管线必须已使用 VkPipelineViewportSwizzleStateCreateInfoNV::viewportCount 创建,且该值大于或等于上次调用 vkCmdSetViewportWithCount 中的 viewportCount 参数。

  • VUID-vkCmdExecuteGeneratedCommandsEXT-VkPipelineVieportCreateInfo-04142
    如果绑定的图形管线状态是使用启用了 VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT 动态状态创建的,并且从 VkPipelineViewportStateCreateInfo 链接了 VkPipelineViewportExclusiveScissorStateCreateInfoNV 结构体,则绑定的图形管线必须已使用 VkPipelineViewportExclusiveScissorStateCreateInfoNV::exclusiveScissorCount 创建,其值大于或等于最后一次调用 vkCmdSetViewportWithCount 中的 viewportCount 参数。

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-07878
    如果启用了 exclusiveScissor 特性,并且将着色器对象绑定到任何图形阶段,或者绑定了使用启用了 VK_DYNAMIC_STATE_EXCLUSIVE_SCISSOR_ENABLE_NV 动态状态创建的图形管线,则在执行此绘制命令之前,必须已调用过 vkCmdSetExclusiveScissorEnableNV 并且在当前命令缓冲区中没有随后被 失效

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-07879
    如果启用了 exclusiveScissor 特性,并且将着色器对象绑定到任何图形阶段,或者绑定了使用启用了 VK_DYNAMIC_STATE_EXCLUSIVE_SCISSOR_NV 动态状态创建的图形管线,并且当前命令缓冲区中最近一次调用 vkCmdSetExclusiveScissorEnableNVpExclusiveScissorEnables 的任何元素设置为 VK_TRUE,则在执行此绘制命令之前,必须已调用过 vkCmdSetExclusiveScissorNV 并且在当前命令缓冲区中没有随后被 失效

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-04876
    如果将着色器对象绑定到任何图形阶段,或者绑定了使用启用了 VK_DYNAMIC_STATE_RASTERIZER_DISCARD_ENABLE 动态状态创建的图形管线,则在执行此绘制命令之前,必须已调用过 vkCmdSetRasterizerDiscardEnable 并且在当前命令缓冲区中没有随后被 失效

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-04877
    如果将着色器对象绑定到任何图形阶段,或者绑定了使用启用了 VK_DYNAMIC_STATE_DEPTH_BIAS_ENABLE 动态状态创建的图形管线,并且 rasterizerDiscardEnable当前值VK_FALSE,则在执行此绘制命令之前,必须已调用过 vkCmdSetDepthBiasEnable 并且在当前命令缓冲区中没有随后被 失效

  • VUID-vkCmdExecuteGeneratedCommandsEXT-logicOp-04878
    如果将着色器对象绑定到 VK_SHADER_STAGE_FRAGMENT_BIT,或者绑定了使用启用了 VK_DYNAMIC_STATE_LOGIC_OP_EXT 动态状态创建的图形管线,rasterizerDiscardEnable当前值VK_FALSE,并且 logicOpEnable当前值VK_TRUE,则在执行此绘制命令之前,必须已调用过 vkCmdSetLogicOpEXT 并且在当前命令缓冲区中没有随后被 失效

  • VUID-vkCmdExecuteGeneratedCommandsEXT-primitiveFragmentShadingRateWithMultipleViewports-04552
    如果不支持 primitiveFragmentShadingRateWithMultipleViewports 限制,并且绑定的图形管线是使用启用了 VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT 动态状态创建的,并且绑定的图形管线的任何着色器阶段写入 PrimitiveShadingRateKHR 内置变量,则在执行此绘制命令之前,当前命令缓冲区中必须已调用过 vkCmdSetViewportWithCount,并且 vkCmdSetViewportWithCountviewportCount 参数必须1

  • VUID-vkCmdExecuteGeneratedCommandsEXT-primitiveFragmentShadingRateWithMultipleViewports-08642
    如果不支持 primitiveFragmentShadingRateWithMultipleViewports 限制,并且绑定到图形阶段的任何着色器对象写入 PrimitiveShadingRateKHR 内置变量,则在执行此绘制命令之前,当前命令缓冲区中必须已调用过 vkCmdSetViewportWithCount,并且 vkCmdSetViewportWithCountviewportCount 参数必须1

  • VUID-vkCmdExecuteGeneratedCommandsEXT-blendEnable-04727
    如果绑定的图形管线中未禁用光栅化,则对于子通道中的每个颜色附件,如果对应的图像视图的 格式特性 不包含 VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT,则 pColorBlendStatepAttachments 成员的对应元素的 blendEnable 成员必须VK_FALSE

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-08643
    如果将着色器对象绑定到 VK_SHADER_STAGE_FRAGMENT_BIT 阶段,并且当前命令缓冲区中最近一次调用 vkCmdSetRasterizerDiscardEnablerasterizerDiscardEnable 设置为 VK_FALSE,则对于渲染过程中的每个颜色附件,如果对应的图像视图的 格式特性 不包含 VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT,则在当前命令缓冲区中最近一次调用 vkCmdSetColorBlendEnableEXT 中影响该附件索引的 pColorBlendEnables 的对应成员必须VK_FALSE

  • VUID-vkCmdExecuteGeneratedCommandsEXT-multisampledRenderToSingleSampled-07284
    如果绑定的图形管线中未禁用光栅化,并且未启用以下任何一项:

    则绑定的图形管线的 rasterizationSamples 必须与当前子通道颜色和/或深度/模板附件相同。

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-08644
    如果着色器对象绑定到任何图形阶段,并且当前命令缓冲区中最近一次调用 vkCmdSetRasterizerDiscardEnablerasterizerDiscardEnable 设置为 VK_FALSE,并且以下任何一项都未启用

    则当前命令缓冲区中最近一次调用 vkCmdSetRasterizationSamplesEXT 必须rasterizationSamples 设置为与当前渲染通道颜色和/或深度/模板附件的样本数相同

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-08876
    如果着色器对象绑定到任何图形阶段,则当前渲染通道实例必须已使用 vkCmdBeginRendering 启动

  • VUID-vkCmdExecuteGeneratedCommandsEXT-imageView-06172
    如果当前渲染通道实例使用 vkCmdBeginRendering 启动,pDepthAttachmentimageView 成员不是 VK_NULL_HANDLE,并且 pDepthAttachmentlayout 成员是 VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL,则此命令必须不向深度附件写入任何值

  • VUID-vkCmdExecuteGeneratedCommandsEXT-imageView-06173
    如果当前渲染通道实例使用 vkCmdBeginRendering 启动,pStencilAttachmentimageView 成员不是 VK_NULL_HANDLE,并且 pStencilAttachmentlayout 成员是 VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL,则此命令必须不向模板附件写入任何值

  • VUID-vkCmdExecuteGeneratedCommandsEXT-imageView-06174
    如果当前渲染通道实例使用 vkCmdBeginRendering 启动,pDepthAttachmentimageView 成员不是 VK_NULL_HANDLE,并且 pDepthAttachmentlayout 成员是 VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL,则此命令必须不向深度附件写入任何值

  • VUID-vkCmdExecuteGeneratedCommandsEXT-imageView-06175
    如果当前渲染通道实例使用 vkCmdBeginRendering 启动,pStencilAttachmentimageView 成员不是 VK_NULL_HANDLE,并且 pStencilAttachmentlayout 成员是 VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL,则此命令必须不向模板附件写入任何值

  • VUID-vkCmdExecuteGeneratedCommandsEXT-imageView-06176
    如果当前渲染通道实例使用 vkCmdBeginRendering 启动,pDepthAttachmentimageView 成员不是 VK_NULL_HANDLE,并且 pDepthAttachmentlayout 成员是 VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL,则此命令必须不向深度附件写入任何值

  • VUID-vkCmdExecuteGeneratedCommandsEXT-imageView-06177
    如果当前渲染通道实例使用 vkCmdBeginRendering 启动,pStencilAttachmentimageView 成员不是 VK_NULL_HANDLE,并且 pStencilAttachmentlayout 成员是 VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL,则此命令必须不向模板附件写入任何值

  • VUID-vkCmdExecuteGeneratedCommandsEXT-viewMask-06178
    如果当前渲染通道实例使用 vkCmdBeginRendering 启动,则绑定的图形管线必须使用 VkPipelineRenderingCreateInfo::viewMask 等于 VkRenderingInfo::viewMask 创建

  • VUID-vkCmdExecuteGeneratedCommandsEXT-colorAttachmentCount-06179
    如果未启用 dynamicRenderingUnusedAttachments 功能,并且当前渲染通道实例使用 vkCmdBeginRendering 启动,则绑定的图形管线必须使用 VkPipelineRenderingCreateInfo::colorAttachmentCount 等于 VkRenderingInfo::colorAttachmentCount 创建

  • VUID-vkCmdExecuteGeneratedCommandsEXT-dynamicRenderingUnusedAttachments-08910
    如果未启用 dynamicRenderingUnusedAttachments 功能,并且当前渲染通道实例使用 vkCmdBeginRendering 启动,并且 VkRenderingInfo::colorAttachmentCount 大于 0,则 VkRenderingInfo::pColorAttachments 数组中 imageView 不等于 VK_NULL_HANDLE 的每个元素必须使用与用于创建绑定图形管线的 VkPipelineRenderingCreateInfo::pColorAttachmentFormats 的对应元素相等的 VkFormat 创建

  • VUID-vkCmdExecuteGeneratedCommandsEXT-dynamicRenderingUnusedAttachments-08912
    如果未启用 dynamicRenderingUnusedAttachments 功能,并且当前渲染通道实例使用 vkCmdBeginRendering 启动,并且 VkRenderingInfo::colorAttachmentCount 大于 0,则 VkRenderingInfo::pColorAttachments 数组中 imageView 等于 VK_NULL_HANDLE 的每个元素必须具有用于创建绑定管线的 VkPipelineRenderingCreateInfo::pColorAttachmentFormats 的对应元素等于 VK_FORMAT_UNDEFINED

  • VUID-vkCmdExecuteGeneratedCommandsEXT-dynamicRenderingUnusedAttachments-08911
    如果启用了 dynamicRenderingUnusedAttachments 特性,并且当前渲染过程实例是通过 vkCmdBeginRendering 开始的,并且 VkRenderingInfo::colorAttachmentCount 大于 0,那么 VkRenderingInfo::pColorAttachments 数组中每个 imageView 不等于 VK_NULL_HANDLE 的元素必须使用与创建绑定图形管线时使用的 VkPipelineRenderingCreateInfo::pColorAttachmentFormats 的对应元素相同的 VkFormat 创建,或者,如果存在 VkPipelineRenderingCreateInfo::pColorAttachmentFormats 的对应元素,则该元素必须VK_FORMAT_UNDEFINED

  • VUID-vkCmdExecuteGeneratedCommandsEXT-colorAttachmentCount-09362
    如果当前渲染过程实例是通过 vkCmdBeginRendering 开始的,VkRenderingInfo::colorAttachmentCount 等于 1,并且没有着色器对象绑定到任何图形阶段,并且颜色附件的解析模式为 VK_RESOLVE_MODE_EXTERNAL_FORMAT_DOWNSAMPLE_ANDROID,那么 VkRenderingInfo::pColorAttachments 数组中每个 resolveImageView 不等于 VK_NULL_HANDLE 的元素必须使用通过 VkExternalFormatANDROID::externalFormat 值创建的图像创建,该值与用于创建绑定图形管线的 VkExternalFormatANDROID::externalFormat 值相同。

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-09363
    如果没有着色器对象绑定到任何图形阶段,当前渲染过程实例是通过 vkCmdBeginRendering 开始的,并且 VkRenderingInfo::colorAttachmentCount 等于 1,并且颜色附件的解析模式为 VK_RESOLVE_MODE_EXTERNAL_FORMAT_DOWNSAMPLE_ANDROID,那么 VkRenderingInfo::pColorAttachments 数组中每个 imageView 不等于 VK_NULL_HANDLE 的元素必须使用通过 VkExternalFormatANDROID::externalFormat 值创建的图像创建,该值与用于创建绑定图形管线的 VkExternalFormatANDROID::externalFormat 值相同。

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-09364
    如果当前渲染过程实例是通过 vkCmdBeginRendering 开始的,并且没有着色器对象绑定到任何图形阶段,并且绑定的图形管线是使用非零的 VkExternalFormatANDROID::externalFormat 值创建的,并且启用了 VK_DYNAMIC_STATE_COLOR_BLEND_ENABLE_EXT 动态状态,那么在执行此绘制命令之前,vkCmdSetColorBlendEnableEXT 必须已将混合启用设置为 VK_FALSE

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-09365
    如果当前渲染过程实例是通过 vkCmdBeginRendering 开始的,并且没有着色器对象绑定到任何图形阶段,并且绑定的图形管线是使用非零的 VkExternalFormatANDROID::externalFormat 值创建的,并且启用了 VK_DYNAMIC_STATE_RASTERIZATION_SAMPLES_EXT 动态状态,那么在执行此绘制命令之前,vkCmdSetRasterizationSamplesEXT 必须已将 rasterizationSamples 设置为 VK_SAMPLE_COUNT_1_BIT

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-09366
    如果存在着色器对象绑定到任何图形阶段,并且当前渲染过程包含使用 VK_RESOLVE_MODE_EXTERNAL_FORMAT_DOWNSAMPLE_ANDROID 解析模式的颜色附件,那么在执行此绘制命令之前,vkCmdSetColorBlendEnableEXT 必须已将混合启用设置为 VK_FALSE

  • VUID-vkCmdExecuteGeneratedCommandsEXT-rasterizationSamples-09367
    如果存在着色器对象绑定到任何图形阶段,并且当前渲染过程包含使用 VK_RESOLVE_MODE_EXTERNAL_FORMAT_DOWNSAMPLE_ANDROID 解析模式的颜色附件,那么在执行此绘制命令之前,vkCmdSetRasterizationSamplesEXT 必须已将 rasterizationSamples 设置为 VK_SAMPLE_COUNT_1_BIT

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-09368
    如果当前渲染过程实例是通过 vkCmdBeginRendering 开始的,并且没有着色器对象绑定到任何图形阶段,并且绑定的图形管线是使用非零的 VkExternalFormatANDROID::externalFormat 值创建的,并且启用了 VK_DYNAMIC_STATE_FRAGMENT_SHADING_RATE_KHR 动态状态,那么在执行此绘制命令之前,vkCmdSetFragmentShadingRateKHR 必须已将 pFragmentSize->width 设置为 1

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-09369
    如果当前渲染过程实例是通过 vkCmdBeginRendering 开始的,并且没有着色器对象绑定到任何图形阶段,并且绑定的图形管线是使用非零的 VkExternalFormatANDROID::externalFormat 值创建的,并且启用了 VK_DYNAMIC_STATE_FRAGMENT_SHADING_RATE_KHR 动态状态,那么在执行此绘制命令之前,vkCmdSetFragmentShadingRateKHR 必须已将 pFragmentSize->height 设置为 1

  • VUID-vkCmdExecuteGeneratedCommandsEXT-pFragmentSize-09370
    如果任何图形管线阶段绑定了着色器对象,并且当前渲染通道包含一个使用 VK_RESOLVE_MODE_EXTERNAL_FORMAT_DOWNSAMPLE_ANDROID 解析模式的颜色附件,那么在此绘制命令之前,vkCmdSetFragmentShadingRateKHR 必须已将 pFragmentSize->width 设置为 1

  • VUID-vkCmdExecuteGeneratedCommandsEXT-pFragmentSize-09371
    如果任何图形管线阶段绑定了着色器对象,并且当前渲染通道包含一个使用 VK_RESOLVE_MODE_EXTERNAL_FORMAT_DOWNSAMPLE_ANDROID 解析模式的颜色附件,那么在此绘制命令之前,vkCmdSetFragmentShadingRateKHR 必须已将 pFragmentSize->height 设置为 1

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-07749
    如果绑定的图形管线状态是在启用 VK_DYNAMIC_STATE_COLOR_WRITE_ENABLE_EXT 动态状态的情况下创建的,那么在此绘制命令之前,必须已调用 vkCmdSetColorWriteEnableEXT,并且在当前命令缓冲区中没有被后续的 无效化

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-08646
    如果启用了 colorWriteEnable 功能,并且着色器对象绑定到 VK_SHADER_STAGE_FRAGMENT_BIT 阶段,并且当前命令缓冲区中最近一次调用 vkCmdSetRasterizerDiscardEnablerasterizerDiscardEnable 设置为 VK_FALSE,那么在此绘制命令之前,必须已调用 vkCmdSetColorWriteEnableEXT,并且在当前命令缓冲区中没有被后续的 无效化

  • VUID-vkCmdExecuteGeneratedCommandsEXT-attachmentCount-07750
    如果绑定的图形管线状态是在启用 VK_DYNAMIC_STATE_COLOR_WRITE_ENABLE_EXT 动态状态的情况下创建的,那么 vkCmdSetColorWriteEnableEXTattachmentCount 参数必须大于或等于绑定图形管线的 VkPipelineColorBlendStateCreateInfo::attachmentCount

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-08647
    如果启用了 colorWriteEnable 功能,并且着色器对象绑定到 VK_SHADER_STAGE_FRAGMENT_BIT 阶段,并且当前命令缓冲区中最近一次调用 vkCmdSetRasterizerDiscardEnablerasterizerDiscardEnable 设置为 VK_FALSE,那么当前命令缓冲区中最近一次调用 vkCmdSetColorWriteEnableEXTattachmentCount 参数必须大于或等于当前渲染通道实例中的颜色附件数量

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-07751
    如果启用了 VK_EXT_discard_rectangles 扩展,绑定了一个图形管线,该管线是在启用 VK_DYNAMIC_STATE_DISCARD_RECTANGLE_EXT 动态状态的情况下创建的,并且 VkGraphicsPipelineCreateInfopNext 链包含一个 VkPipelineDiscardRectangleStateCreateInfoEXT 结构,rasterizerDiscardEnable当前值VK_FALSE,并且 discardRectangleEnable当前值VK_TRUE,那么在此绘制命令之前,对于 VkPipelineDiscardRectangleStateCreateInfoEXT::discardRectangleCount 中的每个丢弃矩形,必须已调用 vkCmdSetDiscardRectangleEXT,并且在当前命令缓冲区中没有被后续的 无效化

  • VUID-vkCmdExecuteGeneratedCommandsEXT-rasterizerDiscardEnable-09236
    如果启用了 VK_EXT_discard_rectangles 扩展,着色器对象绑定到任何图形阶段,或者绑定了一个图形管线,该管线是在启用 VK_DYNAMIC_STATE_DISCARD_RECTANGLE_EXT 动态状态的情况下创建的,并且 VkGraphicsPipelineCreateInfopNext 链不包含 VkPipelineDiscardRectangleStateCreateInfoEXT 结构,rasterizerDiscardEnable当前值VK_FALSE,并且 discardRectangleEnable当前值VK_TRUE,那么在此绘制命令之前,对于 VkPhysicalDeviceDiscardRectanglePropertiesEXT::maxDiscardRectangles 中的每个丢弃矩形,必须已调用 vkCmdSetDiscardRectangleEXT,并且在当前命令缓冲区中没有被后续的 无效化

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-07880
    如果启用了 VK_EXT_discard_rectangles 扩展,着色器对象绑定到任何图形阶段,或者绑定了一个图形管线,该管线是在启用 VK_DYNAMIC_STATE_DISCARD_RECTANGLE_ENABLE_EXT 动态状态的情况下创建的,rasterizerDiscardEnable当前值VK_FALSE,那么在此绘制命令之前,必须已调用 vkCmdSetDiscardRectangleEnableEXT,并且在当前命令缓冲区中没有被后续的 无效化

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-07881
    如果启用了 VK_EXT_discard_rectangles 扩展,着色器对象绑定到任何图形阶段,或者绑定了一个图形管线,该管线是在启用 VK_DYNAMIC_STATE_DISCARD_RECTANGLE_MODE_EXT 动态状态的情况下创建的,rasterizerDiscardEnable当前值VK_FALSE,并且 discardRectangleEnable当前值VK_TRUE,那么在此绘制命令之前,必须已调用 vkCmdSetDiscardRectangleModeEXT,并且在当前命令缓冲区中没有被后续的 无效化

  • VUID-vkCmdExecuteGeneratedCommandsEXT-dynamicRenderingUnusedAttachments-08913
    如果当前渲染过程实例是通过 vkCmdBeginRendering 开始的,且 dynamicRenderingUnusedAttachments 功能未启用,并且 VkRenderingInfo::pDepthAttachment->imageViewVK_NULL_HANDLE,则用于创建绑定的图形管线的 VkPipelineRenderingCreateInfo::depthAttachmentFormat 的值必须等于 VK_FORMAT_UNDEFINED

  • VUID-vkCmdExecuteGeneratedCommandsEXT-dynamicRenderingUnusedAttachments-08914
    如果当前渲染过程实例是通过 vkCmdBeginRendering 开始的,且 dynamicRenderingUnusedAttachments 功能未启用,并且 VkRenderingInfo::pDepthAttachment->imageView 不为 VK_NULL_HANDLE,则用于创建绑定的图形管线的 VkPipelineRenderingCreateInfo::depthAttachmentFormat 的值必须等于用于创建 VkRenderingInfo::pDepthAttachment->imageViewVkFormat

  • VUID-vkCmdExecuteGeneratedCommandsEXT-dynamicRenderingUnusedAttachments-08915
    如果当前渲染过程实例是通过 vkCmdBeginRendering 开始的,且 dynamicRenderingUnusedAttachments 功能已启用,VkRenderingInfo::pDepthAttachment->imageView 不为 VK_NULL_HANDLE,并且用于创建绑定的图形管线的 VkPipelineRenderingCreateInfo::depthAttachmentFormat 的值不等于用于创建 VkRenderingInfo::pDepthAttachment->imageViewVkFormat,则该格式的值必须VK_FORMAT_UNDEFINED

  • VUID-vkCmdExecuteGeneratedCommandsEXT-dynamicRenderingUnusedAttachments-08916
    如果当前渲染过程实例是通过 vkCmdBeginRendering 开始的,且 dynamicRenderingUnusedAttachments 功能未启用,并且 VkRenderingInfo::pStencilAttachment->imageViewVK_NULL_HANDLE,则用于创建绑定的图形管线的 VkPipelineRenderingCreateInfo::stencilAttachmentFormat 的值必须等于 VK_FORMAT_UNDEFINED

  • VUID-vkCmdExecuteGeneratedCommandsEXT-dynamicRenderingUnusedAttachments-08917
    如果当前渲染过程实例是通过 vkCmdBeginRendering 开始的,且 dynamicRenderingUnusedAttachments 功能未启用,并且 VkRenderingInfo::pStencilAttachment->imageView 不为 VK_NULL_HANDLE,则用于创建绑定的图形管线的 VkPipelineRenderingCreateInfo::stencilAttachmentFormat 的值必须等于用于创建 VkRenderingInfo::pStencilAttachment->imageViewVkFormat

  • VUID-vkCmdExecuteGeneratedCommandsEXT-dynamicRenderingUnusedAttachments-08918
    如果当前渲染过程实例是通过 vkCmdBeginRendering 开始的,且 dynamicRenderingUnusedAttachments 功能已启用,VkRenderingInfo::pStencilAttachment->imageView 不为 VK_NULL_HANDLE,并且用于创建绑定的图形管线的 VkPipelineRenderingCreateInfo::stencilAttachmentFormat 的值不等于用于创建 VkRenderingInfo::pStencilAttachment->imageViewVkFormat,则该格式的值必须VK_FORMAT_UNDEFINED

  • VUID-vkCmdExecuteGeneratedCommandsEXT-imageView-06183
    如果当前渲染过程实例是通过 vkCmdBeginRendering 开始的,且 VkRenderingFragmentShadingRateAttachmentInfoKHR::imageView 不为 VK_NULL_HANDLE,则绑定的图形管线必须使用 VK_PIPELINE_CREATE_RENDERING_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR 创建

  • VUID-vkCmdExecuteGeneratedCommandsEXT-imageView-06184
    如果当前渲染过程实例是通过 vkCmdBeginRendering 开始的,且 VkRenderingFragmentDensityMapAttachmentInfoEXT::imageView 不为 VK_NULL_HANDLE,则绑定的图形管线必须使用 VK_PIPELINE_CREATE_RENDERING_FRAGMENT_DENSITY_MAP_ATTACHMENT_BIT_EXT 创建

  • VUID-vkCmdExecuteGeneratedCommandsEXT-colorAttachmentCount-06185
    如果绑定的管线是使用 VkAttachmentSampleCountInfoAMDVkAttachmentSampleCountInfoNV 结构体创建的,并且当前渲染过程实例是通过 vkCmdBeginRendering 开始的,VkRenderingInfo::colorAttachmentCount 参数大于 0,则 VkRenderingInfo::pColorAttachments 数组中每个 imageView 不等于 VK_NULL_HANDLE 的元素,其创建时使用的采样计数必须等于用于创建绑定的图形管线的 VkAttachmentSampleCountInfoAMDVkAttachmentSampleCountInfoNVpColorAttachmentSamples 成员的对应元素

  • VUID-vkCmdExecuteGeneratedCommandsEXT-pDepthAttachment-06186
    如果当前渲染通道实例是通过 vkCmdBeginRendering 开始的,并且绑定的管线是使用 VkAttachmentSampleCountInfoAMDVkAttachmentSampleCountInfoNV 结构创建的,并且 VkRenderingInfo::pDepthAttachment->imageView 不是 VK_NULL_HANDLE,那么用于创建绑定图形管线的 VkAttachmentSampleCountInfoAMDVkAttachmentSampleCountInfoNVdepthStencilAttachmentSamples 成员的值必须等于用于创建 VkRenderingInfo::pDepthAttachment->imageView 的采样计数。

  • VUID-vkCmdExecuteGeneratedCommandsEXT-pStencilAttachment-06187
    如果当前渲染通道实例是通过 vkCmdBeginRendering 开始的,并且绑定的管线是使用 VkAttachmentSampleCountInfoAMDVkAttachmentSampleCountInfoNV 结构创建的,并且 VkRenderingInfo::pStencilAttachment->imageView 不是 VK_NULL_HANDLE,那么用于创建绑定图形管线的 VkAttachmentSampleCountInfoAMDVkAttachmentSampleCountInfoNVdepthStencilAttachmentSamples 成员的值必须等于用于创建 VkRenderingInfo::pStencilAttachment->imageView 的采样计数。

  • VUID-vkCmdExecuteGeneratedCommandsEXT-multisampledRenderToSingleSampled-07285
    如果绑定的管线在创建时没有使用 VkAttachmentSampleCountInfoAMDVkAttachmentSampleCountInfoNV 结构,并且 multisampledRenderToSingleSampled 功能未启用,并且当前渲染通道实例是通过 vkCmdBeginRendering 开始的,并且 VkRenderingInfo::colorAttachmentCount 参数大于 0,那么 VkRenderingInfo::pColorAttachments 数组中每个 imageView 不等于 VK_NULL_HANDLE 的元素必须已使用与绑定图形管线的 rasterizationSamples 值相等的采样计数创建。

  • VUID-vkCmdExecuteGeneratedCommandsEXT-multisampledRenderToSingleSampled-07286
    如果绑定的管线在创建时没有使用 VkAttachmentSampleCountInfoAMDVkAttachmentSampleCountInfoNV 结构,并且 multisampledRenderToSingleSampled 功能未启用,并且 VkRenderingInfo::pDepthAttachment->imageView 不是 VK_NULL_HANDLE,那么绑定图形管线的 rasterizationSamples 的值必须等于用于创建 VkRenderingInfo::pDepthAttachment->imageView 的采样计数。

  • VUID-vkCmdExecuteGeneratedCommandsEXT-multisampledRenderToSingleSampled-07287
    如果绑定的管线在创建时没有使用 VkAttachmentSampleCountInfoAMDVkAttachmentSampleCountInfoNV 结构,并且 multisampledRenderToSingleSampled 功能未启用,并且 VkRenderingInfo::pStencilAttachment->imageView 不是 VK_NULL_HANDLE,那么绑定图形管线的 rasterizationSamples 的值必须等于用于创建 VkRenderingInfo::pStencilAttachment->imageView 的采样计数。

  • VUID-vkCmdExecuteGeneratedCommandsEXT-pNext-07935
    如果此命令是在使用 vkCmdBeginRendering 启动的渲染通道实例中调用的,并且 VkRenderingInfopNext 链包含一个 VkMultisampledRenderToSingleSampledInfoEXT 结构,其中 multisampledRenderToSingleSampledEnable 等于 VK_TRUE,那么绑定图形管线的 rasterizationSamples 的值必须等于 VkMultisampledRenderToSingleSampledInfoEXT::rasterizationSamples

  • VUID-vkCmdExecuteGeneratedCommandsEXT-renderPass-06198
    如果当前渲染通道实例是通过 vkCmdBeginRendering 开始的,那么绑定的管线必须是使用 VkGraphicsPipelineCreateInfo::renderPass 等于 VK_NULL_HANDLE 创建的。

  • VUID-vkCmdExecuteGeneratedCommandsEXT-pColorAttachments-08963
    如果当前渲染通道实例是通过 vkCmdBeginRendering 开始的,并且绑定了一个片段着色器静态写入颜色附件的图形管线,颜色写入掩码不为零,颜色写入已启用,并且 VkRenderingInfo::pColorAttachments->imageView 的对应元素不是 VK_NULL_HANDLE,那么用于创建管线的 VkPipelineRenderingCreateInfo::pColorAttachmentFormats 的对应元素必须不是 VK_FORMAT_UNDEFINED

  • VUID-vkCmdExecuteGeneratedCommandsEXT-pDepthAttachment-08964
    如果当前渲染通道实例是通过 vkCmdBeginRendering 开始的,并且绑定了一个图形管线,深度测试已启用,深度写入已启用,并且 VkRenderingInfo::pDepthAttachment->imageView 不是 VK_NULL_HANDLE,那么用于创建管线的 VkPipelineRenderingCreateInfo::depthAttachmentFormat必须不是 VK_FORMAT_UNDEFINED

  • VUID-vkCmdExecuteGeneratedCommandsEXT-pStencilAttachment-08965
    如果当前渲染过程实例是通过 vkCmdBeginRendering 开始的,并且绑定了图形管线,启用了模板测试,且 VkRenderingInfo::pStencilAttachment->imageView 不为 VK_NULL_HANDLE,那么用于创建管线的 VkPipelineRenderingCreateInfo::stencilAttachmentFormat 必须不能是 VK_FORMAT_UNDEFINED

  • VUID-vkCmdExecuteGeneratedCommandsEXT-primitivesGeneratedQueryWithRasterizerDiscard-06708
    如果 primitivesGeneratedQueryWithRasterizerDiscard 功能未启用,并且 VK_QUERY_TYPE_PRIMITIVES_GENERATED_EXT 查询处于活动状态,则必须未启用光栅化丢弃

  • VUID-vkCmdExecuteGeneratedCommandsEXT-primitivesGeneratedQueryWithNonZeroStreams-06709
    如果 primitivesGeneratedQueryWithNonZeroStreams 功能未启用,并且 VK_QUERY_TYPE_PRIMITIVES_GENERATED_EXT 查询处于活动状态,则绑定的图形管线必须不是使用 VkPipelineRasterizationStateStreamCreateInfoEXT::rasterizationStream 中非零值创建的。

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-07620
    如果 depthClamp 功能已启用,并且着色器对象绑定到任何图形阶段,或者绑定了一个使用 VK_DYNAMIC_STATE_DEPTH_CLAMP_ENABLE_EXT 动态状态创建的图形管线,并且 rasterizerDiscardEnable当前值VK_FALSE,那么在当前命令缓冲区中,在此绘制命令之前,必须已调用过 vkCmdSetDepthClampEnableEXT 并且没有随后失效

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-07621
    如果着色器对象绑定到任何图形阶段,或者绑定了一个使用 VK_DYNAMIC_STATE_POLYGON_MODE_EXT 动态状态创建的图形管线,并且 rasterizerDiscardEnable当前值VK_FALSE,那么在当前命令缓冲区中,在此绘制命令之前,必须已调用过 vkCmdSetPolygonModeEXT 并且没有随后失效

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-07622
    如果着色器对象绑定到任何图形阶段,或者绑定了一个使用 VK_DYNAMIC_STATE_RASTERIZATION_SAMPLES_EXT 动态状态创建的图形管线,并且 rasterizerDiscardEnable当前值VK_FALSE,那么在当前命令缓冲区中,在此绘制命令之前,必须已调用过 vkCmdSetRasterizationSamplesEXT 并且没有随后失效

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-07623
    如果着色器对象绑定到任何图形阶段,或者绑定了一个使用 VK_DYNAMIC_STATE_SAMPLE_MASK_EXT 动态状态创建的图形管线,并且 rasterizerDiscardEnable当前值VK_FALSE,那么在当前命令缓冲区中,在此绘制命令之前,必须已调用过 vkCmdSetSampleMaskEXT 并且没有随后失效

  • VUID-vkCmdExecuteGeneratedCommandsEXT-alphaToCoverageEnable-08919
    如果绑定的图形管线状态是使用启用了 VK_DYNAMIC_STATE_ALPHA_TO_COVERAGE_ENABLE_EXT 动态状态创建的,并且在上一次调用 vkCmdSetAlphaToCoverageEnableEXTalphaToCoverageEnableVK_TRUE,那么片段输出接口必须Location 0 的 Index 0 处包含 alpha Component 字的变量。

  • VUID-vkCmdExecuteGeneratedCommandsEXT-alphaToCoverageEnable-08920
    如果着色器对象绑定到任何图形阶段,并且在当前命令缓冲区中最近一次调用 vkCmdSetAlphaToCoverageEnableEXT 时将 alphaToCoverageEnable 设置为 VK_TRUE,那么片段输出接口必须Location 0 的 Index 0 处包含 alpha Component 字的变量。

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-07624
    如果着色器对象绑定到任何图形阶段,或者绑定了一个使用 VK_DYNAMIC_STATE_ALPHA_TO_COVERAGE_ENABLE_EXT 动态状态创建的图形管线,并且 rasterizerDiscardEnable当前值VK_FALSE,那么在当前命令缓冲区中,在此绘制命令之前,必须已调用过 vkCmdSetAlphaToCoverageEnableEXT 并且没有随后失效

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-07625
    如果启用了 alphaToOne 功能,并且着色器对象绑定到任何图形阶段,或者绑定了一个使用 VK_DYNAMIC_STATE_ALPHA_TO_ONE_ENABLE_EXT 动态状态创建的图形管线,并且 rasterizerDiscardEnable当前值VK_FALSE,那么在当前命令缓冲区中,在此绘制命令之前,必须已调用过 vkCmdSetAlphaToOneEnableEXT 并且没有随后失效

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-07626
    如果启用了logicOp特性,并且着色器对象绑定到了VK_SHADER_STAGE_FRAGMENT_BIT阶段,或者绑定了一个使用启用了VK_DYNAMIC_STATE_LOGIC_OP_ENABLE_EXT动态状态创建的图形管线,并且rasterizerDiscardEnable当前值VK_FALSE,则在执行此绘图命令之前,必须调用过vkCmdSetLogicOpEnableEXT,并且在当前的命令缓冲区中没有随后被失效

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-07627
    如果绑定的图形管线状态是使用启用了VK_DYNAMIC_STATE_COLOR_BLEND_ENABLE_EXT动态状态创建的,则在执行此绘图命令之前,必须调用过vkCmdSetColorBlendEnableEXT,并且在当前的命令缓冲区中没有随后被失效

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-08657
    如果一个着色器对象绑定到了VK_SHADER_STAGE_FRAGMENT_BIT阶段,并且当前命令缓冲区中最近一次调用vkCmdSetRasterizerDiscardEnablerasterizerDiscardEnable设置为VK_FALSE,并且存在绑定的颜色附件,则在执行此绘图命令之前,必须调用过vkCmdSetColorBlendEnableEXT,并且在当前的命令缓冲区中没有随后被失效

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-07628
    如果绑定的图形管线状态是使用启用了VK_DYNAMIC_STATE_COLOR_BLEND_EQUATION_EXT动态状态创建的,则在执行此绘图命令之前,必须调用过vkCmdSetColorBlendEquationEXT,并且在当前的命令缓冲区中没有随后被失效

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-08658
    如果一个着色器对象绑定到了VK_SHADER_STAGE_FRAGMENT_BIT阶段,并且当前命令缓冲区中最近一次调用vkCmdSetRasterizerDiscardEnablerasterizerDiscardEnable设置为VK_FALSE,并且最近一次调用vkCmdSetColorBlendEnableEXT为任何附件设置了该附件在pColorBlendEnables中的值为VK_TRUE,则在执行此绘图命令之前,必须调用过vkCmdSetColorBlendEquationEXT,并且在当前的命令缓冲区中没有随后被失效

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-07629
    如果绑定的图形管线状态是使用启用了VK_DYNAMIC_STATE_COLOR_WRITE_MASK_EXT动态状态创建的,则在执行此绘图命令之前,必须调用过vkCmdSetColorWriteMaskEXT,并且在当前的命令缓冲区中没有随后被失效

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-08659
    如果一个着色器对象绑定到了VK_SHADER_STAGE_FRAGMENT_BIT阶段,并且当前命令缓冲区中最近一次调用vkCmdSetRasterizerDiscardEnablerasterizerDiscardEnable设置为VK_FALSE,并且存在绑定的颜色附件,则在执行此绘图命令之前,必须调用过vkCmdSetColorWriteMaskEXT,并且在当前的命令缓冲区中没有随后被失效

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-07630
    如果启用了geometryStreams特性,并且着色器对象绑定到了VK_SHADER_STAGE_GEOMETRY_BIT阶段,或者绑定了一个使用启用了VK_DYNAMIC_STATE_RASTERIZATION_STREAM_EXT动态状态创建的图形管线,则在执行此绘图命令之前,必须调用过vkCmdSetRasterizationStreamEXT,并且在当前的命令缓冲区中没有随后被失效

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-07631
    如果启用了VK_EXT_conservative_rasterization扩展,并且着色器对象绑定到了任何图形阶段,或者绑定了一个使用启用了VK_DYNAMIC_STATE_CONSERVATIVE_RASTERIZATION_MODE_EXT动态状态创建的图形管线,并且rasterizerDiscardEnable当前值VK_FALSE,则在执行此绘图命令之前,必须调用过vkCmdSetConservativeRasterizationModeEXT,并且在当前的命令缓冲区中没有随后被失效

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-07632
    如果启用了VK_EXT_conservative_rasterization扩展,并且着色器对象绑定到了任何图形阶段,或者绑定了一个使用启用了VK_DYNAMIC_STATE_EXTRA_PRIMITIVE_OVERESTIMATION_SIZE_EXT动态状态创建的图形管线,并且rasterizerDiscardEnable当前值VK_FALSE,并且conservativeRasterizationMode当前值VK_CONSERVATIVE_RASTERIZATION_MODE_OVERESTIMATE_EXT,则在执行此绘图命令之前,必须调用过vkCmdSetExtraPrimitiveOverestimationSizeEXT,并且在当前的命令缓冲区中没有随后被失效

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-07633
    如果启用了 depthClipEnable 特性,并且着色器对象绑定到任何图形阶段,或者绑定了使用 VK_DYNAMIC_STATE_DEPTH_CLIP_ENABLE_EXT 动态状态创建的图形管线,则在执行此绘制命令之前,必须已调用过 vkCmdSetDepthClipEnableEXT 并且在当前命令缓冲区中没有随后被 失效

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-07635
    如果绑定的图形管线状态是使用启用了 VK_DYNAMIC_STATE_COLOR_BLEND_ADVANCED_EXT 动态状态创建的,则在执行此绘制命令之前,必须已调用过 vkCmdSetColorBlendAdvancedEXT 并且在当前命令缓冲区中没有随后被 失效

  • VUID-vkCmdExecuteGeneratedCommandsEXT-rasterizerDiscardEnable-09416
    如果启用了 VK_EXT_blend_operation_advanced 扩展,并且着色器对象绑定到 VK_SHADER_STAGE_FRAGMENT_BIT 阶段,并且在当前命令缓冲区中最近一次调用 vkCmdSetRasterizerDiscardEnablerasterizerDiscardEnable 设置为 VK_FALSE,则在执行此绘制命令之前,必须至少调用过 vkCmdSetColorBlendEquationEXTvkCmdSetColorBlendAdvancedEXT 中的一个,并且在当前命令缓冲区中没有随后被 失效

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-07636
    如果启用了 VK_EXT_provoking_vertex 扩展,并且着色器对象绑定到 VK_SHADER_STAGE_VERTEX_BIT 阶段,或者绑定了使用启用了 VK_DYNAMIC_STATE_PROVOKING_VERTEX_MODE_EXT 动态状态创建的图形管线,并且 rasterizerDiscardEnable当前值VK_FALSE,则在执行此绘制命令之前,必须已调用过 vkCmdSetProvokingVertexModeEXT 并且在当前命令缓冲区中没有随后被 失效

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-07637
    如果绑定的图形管线状态是使用启用了 VK_DYNAMIC_STATE_LINE_RASTERIZATION_MODE_EXT 动态状态创建的,则在执行此绘制命令之前,必须已调用过 vkCmdSetLineRasterizationModeEXT 并且在当前命令缓冲区中没有随后被 失效

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-08666
    如果启用了 stippledRectangularLinesstippledBresenhamLinesstippledSmoothLines 中的任何特性,并且着色器对象绑定到任何图形阶段,并且在当前命令缓冲区中最近一次调用 vkCmdSetRasterizerDiscardEnablerasterizerDiscardEnable 设置为 VK_FALSE,并且在当前命令缓冲区中最近一次调用 vkCmdSetPolygonModeEXTpolygonMode 设置为 VK_POLYGON_MODE_LINE,则在执行此绘制命令之前,必须已调用过 vkCmdSetLineRasterizationModeEXT 并且在当前命令缓冲区中没有随后被 失效

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-08667
    如果启用了 stippledRectangularLinesstippledBresenhamLinesstippledSmoothLines 中的任何特性,并且着色器对象绑定到 VK_SHADER_STAGE_VERTEX_BIT 阶段,并且在当前命令缓冲区中最近一次调用 vkCmdSetRasterizerDiscardEnablerasterizerDiscardEnable 设置为 VK_FALSE,并且在当前命令缓冲区中最近一次调用 vkCmdSetPrimitiveTopologyprimitiveTopology 设置为任何线拓扑,则在执行此绘制命令之前,必须已调用过 vkCmdSetLineRasterizationModeEXT 并且在当前命令缓冲区中没有随后被 失效

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-08668
    如果启用了 stippledRectangularLinesstippledBresenhamLinesstippledSmoothLines 中的任何特性,并且一个输出线图元的着色器对象绑定到 VK_SHADER_STAGE_TESSELLATION_EVALUATION_BITVK_SHADER_STAGE_GEOMETRY_BIT 阶段,并且在当前命令缓冲区中最近一次调用 vkCmdSetRasterizerDiscardEnablerasterizerDiscardEnable 设置为 VK_FALSE,则在执行此绘制命令之前,必须已调用过 vkCmdSetLineRasterizationModeEXT 并且在当前命令缓冲区中没有随后被 失效

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-07638
    如果绑定的图形管线状态是使用启用了 VK_DYNAMIC_STATE_LINE_STIPPLE_ENABLE_EXT 动态状态创建的,则在执行此绘制命令之前,必须已调用过 vkCmdSetLineStippleEnableEXT 并且在当前命令缓冲区中没有随后被 失效

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-08669
    如果启用了 stippledRectangularLinesstippledBresenhamLinesstippledSmoothLines 中的任何特性,并且着色器对象绑定到任何图形阶段,并且在当前命令缓冲区中最近一次调用 vkCmdSetRasterizerDiscardEnablerasterizerDiscardEnable 设置为 VK_FALSE,并且在当前命令缓冲区中最近一次调用 vkCmdSetPolygonModeEXTpolygonMode 设置为 VK_POLYGON_MODE_LINE,则在执行此绘制命令之前,必须已调用过 vkCmdSetLineStippleEnableEXT 并且在当前命令缓冲区中没有随后被 失效

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-08670
    如果启用了 stippledRectangularLines stippledBresenhamLines stippledSmoothLines 中的任何一个特性,并且有一个着色器对象绑定到 VK_SHADER_STAGE_VERTEX_BIT 阶段,并且当前命令缓冲区中最近一次调用 vkCmdSetRasterizerDiscardEnablerasterizerDiscardEnable 设置为 VK_FALSE,并且当前命令缓冲区中最近一次调用 vkCmdSetPrimitiveTopologyprimitiveTopology 设置为任何线拓扑,则在执行此绘制命令之前,必须已调用 vkCmdSetLineStippleEnableEXT 并且没有在当前命令缓冲区中被后续失效

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-08671
    如果启用了 stippledRectangularLines stippledBresenhamLines stippledSmoothLines 中的任何一个特性,并且一个输出线图元的着色器对象绑定到 VK_SHADER_STAGE_TESSELLATION_EVALUATION_BITVK_SHADER_STAGE_GEOMETRY_BIT 阶段,并且当前命令缓冲区中最近一次调用 vkCmdSetRasterizerDiscardEnablerasterizerDiscardEnable 设置为 VK_FALSE,则在执行此绘制命令之前,必须已调用 vkCmdSetLineStippleEnableEXT 并且没有在当前命令缓冲区中被后续失效

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-07849
    如果启用了 stippledRectangularLines stippledBresenhamLines stippledSmoothLines 中的任何一个特性,并且一个着色器对象绑定到任何图形阶段,或者绑定的图形管线状态是通过启用 VK_DYNAMIC_STATE_LINE_STIPPLE 动态状态创建的,rasterizerDiscardEnable当前值VK_FALSE,并且 stippledLineEnable当前值VK_TRUE,则在执行此绘制命令之前,必须已调用 vkCmdSetLineStipple 并且没有在当前命令缓冲区中被后续失效

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-07639
    如果启用了 depthClipControl 特性,并且一个着色器对象绑定到任何图形阶段,或者绑定了一个通过启用 VK_DYNAMIC_STATE_DEPTH_CLIP_NEGATIVE_ONE_TO_ONE_EXT 动态状态创建的图形管线,则在执行此绘制命令之前,必须已调用 vkCmdSetDepthClipNegativeOneToOneEXT 并且没有在当前命令缓冲区中被后续失效

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-09650
    如果启用了 depthClampControl 特性,并且一个着色器对象绑定到任何图形阶段,或者绑定了一个通过启用 VK_DYNAMIC_STATE_DEPTH_CLAMP_RANGE_EXT 动态状态创建的图形管线,并且 depthClampEnable当前值VK_TRUE,则在执行此绘制命令之前,必须已调用 vkCmdSetDepthClampRangeEXT 并且没有在当前命令缓冲区中被后续失效

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-07640
    如果启用了 VK_NV_clip_space_w_scaling 扩展,并且一个着色器对象绑定到任何图形阶段,或者绑定了一个通过启用 VK_DYNAMIC_STATE_VIEWPORT_W_SCALING_ENABLE_NV 动态状态创建的图形管线,则在执行此绘制命令之前,必须已调用 vkCmdSetViewportWScalingEnableNV 并且没有在当前命令缓冲区中被后续失效

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-07641
    如果启用了 VK_NV_viewport_swizzle 扩展,并且一个着色器对象绑定到任何图形阶段,或者绑定了一个通过启用 VK_DYNAMIC_STATE_VIEWPORT_SWIZZLE_NV 动态状态创建的图形管线,则在执行此绘制命令之前,必须已调用 vkCmdSetViewportSwizzleNV 并且没有在当前命令缓冲区中被后续失效

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-07642
    如果启用了 VK_NV_fragment_coverage_to_color 扩展,并且一个着色器对象绑定到 VK_SHADER_STAGE_FRAGMENT_BIT 阶段,或者绑定了一个通过启用 VK_DYNAMIC_STATE_COVERAGE_TO_COLOR_ENABLE_NV 动态状态创建的图形管线,并且 rasterizerDiscardEnable当前值VK_FALSE,则在执行此绘制命令之前,必须已调用 vkCmdSetCoverageToColorEnableNV 并且没有在当前命令缓冲区中被后续失效

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-07643
    如果启用了 VK_NV_fragment_coverage_to_color 扩展,并且一个着色器对象绑定到 VK_SHADER_STAGE_FRAGMENT_BIT 阶段,或者绑定了一个通过启用 VK_DYNAMIC_STATE_COVERAGE_TO_COLOR_LOCATION_NV 动态状态创建的图形管线,并且 rasterizerDiscardEnable当前值VK_FALSE,并且 coverageToColorEnable当前值VK_TRUE,则在执行此绘制命令之前,必须已调用 vkCmdSetCoverageToColorLocationNV 并且没有在当前命令缓冲区中被后续失效

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-07644
    如果启用了 VK_NV_framebuffer_mixed_samples 扩展,并且着色器对象绑定到任何图形阶段,或者绑定了使用 VK_DYNAMIC_STATE_COVERAGE_MODULATION_MODE_NV 动态状态创建的图形管线,并且 rasterizerDiscardEnable当前值VK_FALSE,则在执行此绘图命令之前,必须已调用过 vkCmdSetCoverageModulationModeNV 并且在当前的命令缓冲区中未随后失效

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-07645
    如果启用了 VK_NV_framebuffer_mixed_samples 扩展,并且着色器对象绑定到任何图形阶段,或者绑定了使用 VK_DYNAMIC_STATE_COVERAGE_MODULATION_TABLE_ENABLE_NV 动态状态创建的图形管线,并且 rasterizerDiscardEnable当前值VK_FALSE,并且 coverageModulationMode当前值为除 VK_COVERAGE_MODULATION_MODE_NONE_NV 以外的任何值,则在执行此绘图命令之前,必须已调用过 vkCmdSetCoverageModulationTableEnableNV 并且在当前的命令缓冲区中未随后失效

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-07646
    如果启用了 VK_NV_framebuffer_mixed_samples 扩展,并且着色器对象绑定到任何图形阶段,或者绑定了使用 VK_DYNAMIC_STATE_COVERAGE_MODULATION_TABLE_NV 动态状态创建的图形管线,并且 rasterizerDiscardEnable当前值VK_FALSE,并且 coverageModulationTableEnable当前值VK_TRUE,则在执行此绘图命令之前,必须已调用过 vkCmdSetCoverageModulationTableNV 并且在当前的命令缓冲区中未随后失效

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-07647
    如果启用了 shadingRateImage 特性,并且着色器对象绑定到任何图形阶段,或者绑定了使用 VK_DYNAMIC_STATE_SHADING_RATE_IMAGE_ENABLE_NV 动态状态创建的图形管线,并且 rasterizerDiscardEnable当前值VK_FALSE,则在执行此绘图命令之前,必须已调用过 vkCmdSetShadingRateImageEnableNV 并且在当前的命令缓冲区中未随后失效

  • VUID-vkCmdExecuteGeneratedCommandsEXT-pipelineFragmentShadingRate-09238
    如果启用了 pipelineFragmentShadingRate 特性,并且着色器对象绑定到 VK_SHADER_STAGE_FRAGMENT_BIT 阶段,或者绑定了使用 VK_DYNAMIC_STATE_FRAGMENT_SHADING_RATE_KHR 动态状态创建的图形管线,并且 rasterizerDiscardEnable当前值VK_FALSE,则在执行此绘图命令之前,必须已调用过 vkCmdSetFragmentShadingRateKHR 并且在当前的命令缓冲区中未随后失效

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-07648
    如果启用了 representativeFragmentTest 特性,并且着色器对象绑定到任何图形阶段,或者绑定了使用 VK_DYNAMIC_STATE_REPRESENTATIVE_FRAGMENT_TEST_ENABLE_NV 动态状态创建的图形管线,并且 rasterizerDiscardEnable当前值VK_FALSE,则在执行此绘图命令之前,必须已调用过 vkCmdSetRepresentativeFragmentTestEnableNV 并且在当前的命令缓冲区中未随后失效

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-07649
    如果启用了 coverageReductionMode 特性,并且着色器对象绑定到任何图形阶段,或者绑定了使用 VK_DYNAMIC_STATE_COVERAGE_REDUCTION_MODE_NV 动态状态创建的图形管线,并且 rasterizerDiscardEnable当前值VK_FALSE,则在执行此绘图命令之前,必须已调用过 vkCmdSetCoverageReductionModeNV 并且在当前的命令缓冲区中未随后失效

  • VUID-vkCmdExecuteGeneratedCommandsEXT-pColorBlendEnables-07470
    如果绑定的图形管线状态是使用启用了 VK_DYNAMIC_STATE_COLOR_BLEND_ENABLE_EXT 状态创建的,并且最后一次调用 vkCmdSetColorBlendEnableEXT 将任何附件的 pColorBlendEnables 设置为 VK_TRUE,则对于子通道中的那些附件,对应的图像视图的 格式特性 必须包含 VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT

  • VUID-vkCmdExecuteGeneratedCommandsEXT-rasterizationSamples-07471
    如果绑定的图形管线状态是使用启用了 VK_DYNAMIC_STATE_RASTERIZATION_SAMPLES_EXT 状态创建的,并且当前子通道不使用任何颜色和/或深度/模板附件,则最后一次调用 vkCmdSetRasterizationSamplesEXT 中的 rasterizationSamples 必须遵循零附件子通道的规则。

  • VUID-vkCmdExecuteGeneratedCommandsEXT-samples-07472
    如果绑定的图形管线状态是在启用 VK_DYNAMIC_STATE_SAMPLE_MASK_EXT 状态且禁用 VK_DYNAMIC_STATE_RASTERIZATION_SAMPLES_EXT 状态的情况下创建的,那么最后一次调用 vkCmdSetSampleMaskEXT 中的 samples 参数必须大于或等于用于创建绑定图形管线的 VkPipelineMultisampleStateCreateInfo::rasterizationSamples 参数。

  • VUID-vkCmdExecuteGeneratedCommandsEXT-samples-07473
    如果绑定的图形管线状态是在启用 VK_DYNAMIC_STATE_SAMPLE_MASK_EXT 状态和 VK_DYNAMIC_STATE_RASTERIZATION_SAMPLES_EXT 状态的情况下创建的,那么最后一次调用 vkCmdSetSampleMaskEXT 中的 samples 参数必须大于或等于最后一次调用 vkCmdSetRasterizationSamplesEXT 中的 rasterizationSamples 参数。

  • VUID-vkCmdExecuteGeneratedCommandsEXT-rasterizationSamples-07474
    如果绑定的图形管线状态是在启用 VK_DYNAMIC_STATE_RASTERIZATION_SAMPLES_EXT 状态的情况下创建的,并且未启用 multisampledRenderToSingleSampled 功能,并且既没有启用 VK_AMD_mixed_attachment_samples 扩展也没有启用 VK_NV_framebuffer_mixed_samples 扩展,那么最后一次调用 vkCmdSetRasterizationSamplesEXT 中的 rasterizationSamples 参数必须与当前子通道的颜色和/或深度/模板附件相同。

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-09211
    如果绑定的图形管线状态是在启用 VK_DYNAMIC_STATE_RASTERIZATION_SAMPLES_EXT 状态的情况下创建的,或者有着色器对象绑定到任何图形阶段,并且当前渲染通道实例包含一个 multisampledRenderToSingleSampledEnable 等于 VK_TRUEVkMultisampledRenderToSingleSampledInfoEXT 结构,那么最后一次调用 vkCmdSetRasterizationSamplesEXT 中的 rasterizationSamples 参数必须与该结构的 rasterizationSamples 成员相同。

  • VUID-vkCmdExecuteGeneratedCommandsEXT-firstAttachment-07476
    如果绑定的图形管线状态是在启用 VK_DYNAMIC_STATE_COLOR_BLEND_ENABLE_EXT 动态状态的情况下创建的,那么在此绘图命令之前,必须在当前命令缓冲区中调用过 vkCmdSetColorBlendEnableEXT,并且 vkCmdSetColorBlendEnableEXT 调用的 firstAttachmentattachmentCount 参数指定的附件必须为当前子通道中的所有活动颜色附件指定启用状态。

  • VUID-vkCmdExecuteGeneratedCommandsEXT-rasterizerDiscardEnable-09417
    如果一个着色器对象绑定到 VK_SHADER_STAGE_FRAGMENT_BIT 阶段,并且当前命令缓冲区中最近一次调用 vkCmdSetRasterizerDiscardEnablerasterizerDiscardEnable 设置为 VK_FALSE,那么在此绘图命令之前,必须在当前命令缓冲区中调用过 vkCmdSetColorBlendEnableEXT,并且 vkCmdSetColorBlendEnableEXT 调用的 firstAttachmentattachmentCount 参数指定的附件必须为当前子通道中的所有活动颜色附件指定启用状态。

  • VUID-vkCmdExecuteGeneratedCommandsEXT-firstAttachment-07477
    如果绑定的图形管线状态是在启用 VK_DYNAMIC_STATE_COLOR_BLEND_EQUATION_EXT 动态状态的情况下创建的,那么在此绘图命令之前,必须在当前命令缓冲区中调用过 vkCmdSetColorBlendEquationEXT,并且 vkCmdSetColorBlendEquationEXT 调用的 firstAttachmentattachmentCount 参数指定的附件必须为当前子通道中启用了混合的所有活动颜色附件指定混合方程式。

  • VUID-vkCmdExecuteGeneratedCommandsEXT-rasterizerDiscardEnable-09418
    如果一个着色器对象绑定到 VK_SHADER_STAGE_FRAGMENT_BIT 阶段,并且当前命令缓冲区中最近一次调用 vkCmdSetRasterizerDiscardEnablerasterizerDiscardEnable 设置为 VK_FALSE 且存在颜色附件绑定,那么在此绘图命令之前,必须在当前命令缓冲区中调用过 vkCmdSetColorBlendEquationEXT,并且 vkCmdSetColorBlendEquationEXT 调用的 firstAttachmentattachmentCount 参数指定的附件必须为当前子通道中启用了混合的所有活动颜色附件指定混合方程式。

  • VUID-vkCmdExecuteGeneratedCommandsEXT-firstAttachment-07478
    如果绑定的图形管线状态是在启用 VK_DYNAMIC_STATE_COLOR_WRITE_MASK_EXT 动态状态的情况下创建的,那么在此绘图命令之前,必须在当前命令缓冲区中调用过 vkCmdSetColorWriteMaskEXT,并且 vkCmdSetColorWriteMaskEXT 调用的 firstAttachmentattachmentCount 参数指定的附件必须为当前子通道中的所有活动颜色附件指定颜色写入掩码。

  • VUID-vkCmdExecuteGeneratedCommandsEXT-rasterizerDiscardEnable-09419
    如果一个着色器对象绑定到 VK_SHADER_STAGE_FRAGMENT_BIT 阶段,并且当前命令缓冲区中最近一次调用 vkCmdSetRasterizerDiscardEnablerasterizerDiscardEnable 设置为 VK_FALSE,那么在此绘图命令之前,必须在当前命令缓冲区中调用过 vkCmdSetColorWriteMaskEXT,并且 vkCmdSetColorWriteMaskEXT 调用的 firstAttachmentattachmentCount 参数指定的附件必须为当前子通道中的所有活动颜色附件指定颜色写入掩码。

  • VUID-vkCmdExecuteGeneratedCommandsEXT-firstAttachment-07479
    如果绑定的图形管线状态在创建时启用了 VK_DYNAMIC_STATE_COLOR_BLEND_ADVANCED_EXT 动态状态,那么在执行此绘制命令之前,当前命令缓冲区中必须已调用过 vkCmdSetColorBlendAdvancedEXT,并且 vkCmdSetColorBlendAdvancedEXT 调用中的 firstAttachmentattachmentCount 参数指定的附件必须为当前子通道中所有启用了混合的活动颜色附件指定高级混合方程式。

  • VUID-vkCmdExecuteGeneratedCommandsEXT-advancedBlendMaxColorAttachments-07480
    如果绑定的图形管线状态在创建时启用了 VK_DYNAMIC_STATE_COLOR_BLEND_ADVANCED_EXTVK_DYNAMIC_STATE_COLOR_BLEND_ENABLE_EXT 动态状态,并且最后一次调用 vkCmdSetColorBlendEnableEXTvkCmdSetColorBlendAdvancedEXT 启用了高级混合,那么当前子通道中活动颜色附件的数量必须不超过 advancedBlendMaxColorAttachments

  • VUID-vkCmdExecuteGeneratedCommandsEXT-primitivesGeneratedQueryWithNonZeroStreams-07481
    如果未启用 primitivesGeneratedQueryWithNonZeroStreams 功能,且 VK_QUERY_TYPE_PRIMITIVES_GENERATED_EXT 查询处于活动状态,并且绑定的图形管线在创建时启用了 VK_DYNAMIC_STATE_RASTERIZATION_STREAM_EXT 状态,那么最后一次调用 vkCmdSetRasterizationStreamEXT 必须已将 rasterizationStream 设置为零。

  • VUID-vkCmdExecuteGeneratedCommandsEXT-sampleLocationsPerPixel-07482
    如果绑定的图形管线状态在创建时启用了 VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_EXT 状态,且禁用了 VK_DYNAMIC_STATE_RASTERIZATION_SAMPLES_EXT 状态,并且 当前值sampleLocationsEnableVK_TRUE,那么最后一次调用 vkCmdSetSampleLocationsEXTpSampleLocationsInfosampleLocationsPerPixel 成员必须等于绑定的图形管线创建时使用的 VkPipelineMultisampleStateCreateInfo 结构的 rasterizationSamples 成员。

  • VUID-vkCmdExecuteGeneratedCommandsEXT-sampleLocationsPerPixel-07483
    如果绑定的图形管线状态在创建时启用了 VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_EXT 状态和 VK_DYNAMIC_STATE_RASTERIZATION_SAMPLES_EXT 状态,并且 当前值sampleLocationsEnableVK_TRUE,那么最后一次调用 vkCmdSetSampleLocationsEXTpSampleLocationsInfosampleLocationsPerPixel 成员必须等于最后一次调用 vkCmdSetRasterizationSamplesEXTrasterizationSamples 参数。

  • VUID-vkCmdExecuteGeneratedCommandsEXT-sampleLocationsEnable-07484
    如果着色器对象绑定到 VK_SHADER_STAGE_FRAGMENT_BIT 阶段,或者绑定的图形管线在创建时启用了 VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_ENABLE_EXT 状态,并且最后一次调用 vkCmdSetSampleLocationsEnableEXT 中的 sampleLocationsEnableVK_TRUE,并且当前子通道具有深度/模板附件,那么该附件必须已使用设置的 VK_IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT 位创建。

  • VUID-vkCmdExecuteGeneratedCommandsEXT-sampleLocationsEnable-07485
    如果着色器对象绑定到 VK_SHADER_STAGE_FRAGMENT_BIT 阶段,或者绑定的图形管线状态在创建时启用了 VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_EXT 状态和 VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_ENABLE_EXT 状态,并且如果最后一次调用 vkCmdSetSampleLocationsEnableEXT 中的 sampleLocationsEnableVK_TRUE,那么最后一次调用 vkCmdSetSampleLocationsEXT 中的 sampleLocationsInfo.sampleLocationGridSize.width 必须能被 VkMultisamplePropertiesEXT::sampleLocationGridSize.width 整除,后者由 vkGetPhysicalDeviceMultisamplePropertiesEXT 返回,且 samples 参数等于 rasterizationSamples

  • VUID-vkCmdExecuteGeneratedCommandsEXT-sampleLocationsEnable-07486
    如果着色器对象绑定到 VK_SHADER_STAGE_FRAGMENT_BIT 阶段,或者绑定的图形管线状态在创建时启用了 VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_EXT 状态和 VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_ENABLE_EXT 状态,并且如果最后一次调用 vkCmdSetSampleLocationsEnableEXT 中的 sampleLocationsEnableVK_TRUE,那么最后一次调用 vkCmdSetSampleLocationsEXT 中的 sampleLocationsInfo.sampleLocationGridSize.height 必须能被 VkMultisamplePropertiesEXT::sampleLocationGridSize.height 整除,后者由 vkGetPhysicalDeviceMultisamplePropertiesEXT 返回,且 samples 参数等于 rasterizationSamples

  • VUID-vkCmdExecuteGeneratedCommandsEXT-sampleLocationsEnable-07487
    如果着色器对象绑定到 VK_SHADER_STAGE_FRAGMENT_BIT 阶段,或者绑定的图形管线状态在创建时启用了 VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_ENABLE_EXT 状态,并且如果最后一次调用 vkCmdSetSampleLocationsEnableEXT 中的 sampleLocationsEnableVK_TRUE,则片段着色器代码必须不静态使用扩展指令 InterpolateAtSample

  • VUID-vkCmdExecuteGeneratedCommandsEXT-sampleLocationsEnable-07936
    如果绑定的图形管线状态在创建时禁用了 VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_EXT 状态,并且启用了 VK_DYNAMIC_STATE_RASTERIZATION_SAMPLES_EXT 状态,并且 当前值sampleLocationsEnableVK_TRUE,那么 sampleLocationsInfo.sampleLocationGridSize.width 必须能被 VkMultisamplePropertiesEXT::sampleLocationGridSize.width 整除,后者由 vkGetPhysicalDeviceMultisamplePropertiesEXT 返回,且 samples 参数等于最后一次调用 vkCmdSetRasterizationSamplesEXTrasterizationSamples 的值。

  • VUID-vkCmdExecuteGeneratedCommandsEXT-sampleLocationsEnable-07937
    如果绑定的图形管线状态是在禁用 VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_EXT 状态并启用 VK_DYNAMIC_STATE_RASTERIZATION_SAMPLES_EXT 状态的情况下创建的,并且 sampleLocationsEnable当前值VK_TRUE,则 sampleLocationsInfo.sampleLocationGridSize.height 必须能够被 VkMultisamplePropertiesEXT::sampleLocationGridSize.height 整除,该值由 vkGetPhysicalDeviceMultisamplePropertiesEXT 返回,且其 samples 参数等于上次调用 vkCmdSetRasterizationSamplesEXTrasterizationSamples 的值。

  • VUID-vkCmdExecuteGeneratedCommandsEXT-sampleLocationsEnable-07938
    如果绑定的图形管线状态是在禁用 VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_EXT 状态并启用 VK_DYNAMIC_STATE_RASTERIZATION_SAMPLES_EXT 状态的情况下创建的,并且 sampleLocationsEnable当前值VK_TRUE,则 sampleLocationsInfo.sampleLocationsPerPixel 必须等于上次调用 vkCmdSetRasterizationSamplesEXTrasterizationSamples 的值。

  • VUID-vkCmdExecuteGeneratedCommandsEXT-coverageModulationTableEnable-07488
    如果着色器对象绑定到任何图形阶段,或者绑定的图形管线状态是在启用 VK_DYNAMIC_STATE_COVERAGE_MODULATION_TABLE_ENABLE_NV 状态的情况下创建的,并且上次调用 vkCmdSetCoverageModulationTableEnableNVcoverageModulationTableEnable 设置为 VK_TRUE,则上次调用 vkCmdSetCoverageModulationTableNVcoverageModulationTableCount 参数必须等于当前 rasterizationSamples 除以当前子通道中颜色样本的数量。

  • VUID-vkCmdExecuteGeneratedCommandsEXT-rasterizationSamples-07489
    如果启用了 VK_NV_framebuffer_mixed_samples 扩展,并且如果当前子通道具有深度/模板附件,并且在绑定的管线中启用了深度测试、模板测试或深度边界测试,则当前 rasterizationSamples 必须与深度/模板附件的样本计数相同。

  • VUID-vkCmdExecuteGeneratedCommandsEXT-coverageToColorEnable-07490
    如果绑定的图形管线状态是在启用 VK_DYNAMIC_STATE_COVERAGE_TO_COLOR_ENABLE_NV 状态的情况下创建的,并且上次调用 vkCmdSetCoverageToColorEnableNVcoverageToColorEnable 设置为 VK_TRUE,则当前子通道必须在上次调用 vkCmdSetCoverageToColorLocationNVcoverageToColorLocation 选择的位置有一个颜色附件,其 VkFormatVK_FORMAT_R8_UINTVK_FORMAT_R8_SINTVK_FORMAT_R16_UINTVK_FORMAT_R16_SINTVK_FORMAT_R32_UINTVK_FORMAT_R32_SINT

  • VUID-vkCmdExecuteGeneratedCommandsEXT-rasterizerDiscardEnable-09420
    如果启用了 VK_NV_fragment_coverage_to_color 扩展,并且着色器对象绑定到 VK_SHADER_STAGE_FRAGMENT_BIT 阶段,并且当前命令缓冲区中最近一次调用 vkCmdSetRasterizerDiscardEnablerasterizerDiscardEnable 设置为 VK_FALSE,并且上次调用 vkCmdSetCoverageToColorEnableNVcoverageToColorEnable 设置为 VK_TRUE,则当前子通道必须在上次调用 vkCmdSetCoverageToColorLocationNVcoverageToColorLocation 选择的位置有一个颜色附件,其 VkFormatVK_FORMAT_R8_UINTVK_FORMAT_R8_SINTVK_FORMAT_R16_UINTVK_FORMAT_R16_SINTVK_FORMAT_R32_UINTVK_FORMAT_R32_SINT

  • VUID-vkCmdExecuteGeneratedCommandsEXT-coverageReductionMode-07491
    如果启用了此 VK_NV_coverage_reduction_mode 扩展,绑定的图形管线状态是在启用 VK_DYNAMIC_STATE_COVERAGE_TO_COLOR_ENABLE_NVVK_DYNAMIC_STATE_RASTERIZATION_SAMPLES_EXT 状态的情况下创建的,当前的覆盖率缩减模式 coverageReductionMode,则当前的 rasterizationSamples 以及颜色和深度/模板附件的样本计数(如果子通道有的话)必须是由 vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV 返回的有效组合。

  • VUID-vkCmdExecuteGeneratedCommandsEXT-viewportCount-07492
    如果绑定的图形管线状态是在启用 VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT 动态状态但未启用 VK_DYNAMIC_STATE_VIEWPORT_SWIZZLE_NV 动态状态的情况下创建的,则绑定的图形管线必须已使用 VkPipelineViewportSwizzleStateCreateInfoNV::viewportCount 创建,该值大于或等于上次调用 vkCmdSetViewportWithCountviewportCount 参数的值。

  • VUID-vkCmdExecuteGeneratedCommandsEXT-viewportCount-07493
    如果绑定的图形管线状态是在启用 VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNTVK_DYNAMIC_STATE_VIEWPORT_SWIZZLE_NV 动态状态的情况下创建的,则上次调用 vkCmdSetViewportSwizzleNVviewportCount 参数的值必须大于或等于上次调用 vkCmdSetViewportWithCountviewportCount 参数的值。

  • VUID-vkCmdExecuteGeneratedCommandsEXT-viewportCount-09421
    如果启用了 VK_NV_viewport_swizzle 扩展,并且着色器对象绑定到任何图形阶段,则上次调用 vkCmdSetViewportSwizzleNVviewportCount 参数的值必须大于或等于上次调用 vkCmdSetViewportWithCountviewportCount 参数的值。

  • VUID-vkCmdExecuteGeneratedCommandsEXT-rasterizationSamples-07494
    如果启用了 VK_NV_framebuffer_mixed_samples 扩展,并且如果当前子通道有任何颜色附件,并且最后一次调用 vkCmdSetRasterizationSamplesEXT 设置的 rasterizationSamples 大于颜色采样的数量,则管线 sampleShadingEnable 必须VK_FALSE

  • VUID-vkCmdExecuteGeneratedCommandsEXT-stippledLineEnable-07495
    如果绑定的图形管线状态在创建时启用了 VK_DYNAMIC_STATE_LINE_STIPPLE_ENABLE_EXTVK_DYNAMIC_STATE_LINE_RASTERIZATION_MODE_EXT 动态状态,并且如果当前 stippledLineEnable 状态为 VK_TRUE 且当前 lineRasterizationMode 状态为 VK_LINE_RASTERIZATION_MODE_RECTANGULAR,则 stippledRectangularLines 特性必须启用

  • VUID-vkCmdExecuteGeneratedCommandsEXT-stippledLineEnable-07496
    如果绑定的图形管线状态在创建时启用了 VK_DYNAMIC_STATE_LINE_STIPPLE_ENABLE_EXTVK_DYNAMIC_STATE_LINE_RASTERIZATION_MODE_EXT 动态状态,并且如果当前 stippledLineEnable 状态为 VK_TRUE 且当前 lineRasterizationMode 状态为 VK_LINE_RASTERIZATION_MODE_BRESENHAM,则 stippledBresenhamLines 特性必须启用

  • VUID-vkCmdExecuteGeneratedCommandsEXT-stippledLineEnable-07497
    如果绑定的图形管线状态在创建时启用了 VK_DYNAMIC_STATE_LINE_STIPPLE_ENABLE_EXTVK_DYNAMIC_STATE_LINE_RASTERIZATION_MODE_EXT 动态状态,并且如果当前 stippledLineEnable 状态为 VK_TRUE 且当前 lineRasterizationMode 状态为 VK_LINE_RASTERIZATION_MODE_RECTANGULAR_SMOOTH,则 stippledSmoothLines 特性必须启用

  • VUID-vkCmdExecuteGeneratedCommandsEXT-stippledLineEnable-07498
    如果绑定的图形管线状态在创建时启用了 VK_DYNAMIC_STATE_LINE_STIPPLE_ENABLE_EXTVK_DYNAMIC_STATE_LINE_RASTERIZATION_MODE_EXT 动态状态,并且如果当前 stippledLineEnable 状态为 VK_TRUE 且当前 lineRasterizationMode 状态为 VK_LINE_RASTERIZATION_MODE_DEFAULT,则 stippledRectangularLines 特性必须启用,并且 VkPhysicalDeviceLimits::strictLines 必须VK_TRUE

  • VUID-vkCmdExecuteGeneratedCommandsEXT-conservativePointAndLineRasterization-07499
    如果绑定的图形管线状态在创建时启用了 VK_DYNAMIC_STATE_CONSERVATIVE_RASTERIZATION_MODE_EXT 动态状态,conservativePointAndLineRasterization 不支持,并且最后一个光栅化前着色器阶段输出的有效图元拓扑是线或点,则最后一次调用 vkCmdSetConservativeRasterizationModeEXT 设置的 conservativeRasterizationMode 必须VK_CONSERVATIVE_RASTERIZATION_MODE_DISABLED_EXT

  • VUID-vkCmdExecuteGeneratedCommandsEXT-stage-07073
    如果绑定的管线在创建时,VkPipelineShaderStageCreateInfo::stage 成员在 VkGraphicsPipelineCreateInfo::pStages 的一个元素中被设置为 VK_SHADER_STAGE_VERTEX_BITVK_SHADER_STAGE_TESSELLATION_CONTROL_BITVK_SHADER_STAGE_TESSELLATION_EVALUATION_BITVK_SHADER_STAGE_GEOMETRY_BIT,则 网格着色器查询 必须不处于活动状态

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-08877
    如果着色器对象绑定到 VK_SHADER_STAGE_FRAGMENT_BIT 阶段,或者绑定了在创建时启用了 VK_DYNAMIC_STATE_ATTACHMENT_FEEDBACK_LOOP_ENABLE_EXT 动态状态的图形管线,并且 rasterizerDiscardEnable当前值VK_FALSE,则必须在此绘制命令之前调用过 vkCmdSetAttachmentFeedbackLoopEnableEXT 且未在当前命令缓冲区中随后将其失效

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-07850
    如果动态状态是从 VkCommandBufferInheritanceViewportScissorInfoNV 继承的,则必须在当前命令缓冲区中、此绘制命令之前设置该动态状态

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-08688
    如果没有绑定的图形管线,则必须在当前命令缓冲区中调用过 vkCmdBindShadersEXT,并且 pStages 包含 VK_SHADER_STAGE_FRAGMENT_BIT 的一个元素

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-08689
    如果没有绑定的图形管线,并且启用了 taskShader 特性,则必须在当前命令缓冲区中调用过 vkCmdBindShadersEXT,并且 pStages 包含 VK_SHADER_STAGE_TASK_BIT_EXT 的一个元素

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-08690
    如果没有绑定的图形管线,并且启用了 meshShader 特性,则必须在当前命令缓冲区中调用过 vkCmdBindShadersEXT,并且 pStages 包含 VK_SHADER_STAGE_MESH_BIT_EXT 的一个元素

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-08693
    如果没有绑定的图形管线,并且至少启用了 taskShadermeshShader 特性中的一个,则 VK_SHADER_STAGE_VERTEX_BITVK_SHADER_STAGE_MESH_BIT_EXT 阶段中的一个必须绑定有效的 VkShaderEXT,而另一个必须没有绑定 VkShaderEXT

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-08694
    如果没有绑定的图形管线,并且同时启用了 taskShadermeshShader 特性,并且向 VK_SHADER_STAGE_MESH_BIT_EXT 阶段绑定了有效的 VkShaderEXT,并且该 VkShaderEXT 创建时没有使用 VK_SHADER_CREATE_NO_TASK_SHADER_BIT_EXT 标志,则必须VK_SHADER_STAGE_TASK_BIT_EXT 阶段绑定有效的 VkShaderEXT

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-08695
    如果没有绑定图形管线,并且启用了 taskShadermeshShader 功能,并且一个有效的 VkShaderEXT 绑定到了 VK_SHADER_STAGE_MESH_BIT_EXT 阶段,且该 VkShaderEXT 是使用 VK_SHADER_CREATE_NO_TASK_SHADER_BIT_EXT 标志创建的,则 必须 没有 VkShaderEXT 绑定到 VK_SHADER_STAGE_TASK_BIT_EXT 阶段。

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-08696
    如果没有绑定图形管线,并且一个有效的 VkShaderEXT 绑定到了 VK_SHADER_STAGE_VERTEX_BIT 阶段,则 必须 没有 VkShaderEXT 绑定到 VK_SHADER_STAGE_TASK_BIT_EXT 阶段或 VK_SHADER_STAGE_MESH_BIT_EXT 阶段。

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-08698
    如果绑定了任何使用 VK_SHADER_CREATE_LINK_STAGE_BIT_EXT 标志创建的图形着色器,则在同一个 vkCreateShadersEXT 调用中所有使用 VK_SHADER_CREATE_LINK_STAGE_BIT_EXT 标志创建的着色器 必须 也被绑定。

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-08699
    如果绑定了任何使用 VK_SHADER_CREATE_LINK_STAGE_BIT_EXT 标志创建的图形着色器,则在同一个 vkCreateShadersEXT 调用中,没有使用 VK_SHADER_CREATE_LINK_STAGE_BIT_EXT 标志创建着色器的阶段之间的任何阶段 必须 不能绑定任何 VkShaderEXT

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-08878
    所有绑定的图形着色器对象 必须 是使用相同或相同定义的推送常量范围创建的。

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-08879
    所有绑定的图形着色器对象 必须 是使用相同或相同定义的描述符集布局数组创建的。

  • VUID-vkCmdExecuteGeneratedCommandsEXT-colorAttachmentCount-09372
    如果当前的渲染通道实例使用 vkCmdBeginRenderingVkRenderingInfo::colorAttachmentCount 等于 1 开始,并且颜色附件的解析模式为 VK_RESOLVE_MODE_EXTERNAL_FORMAT_DOWNSAMPLE_ANDROID,并且绑定了片元着色器,则它 必须 不声明 DepthReplacingStencilRefReplacingEXT 执行模式。

  • VUID-vkCmdExecuteGeneratedCommandsEXT-pDynamicStates-08715
    如果绑定的图形管线状态包含片元着色器阶段,并且在 VkPipelineDynamicStateCreateInfo::pDynamicStates 中设置了 VK_DYNAMIC_STATE_DEPTH_WRITE_ENABLE,并且片元着色器声明了 EarlyFragmentTests 执行模式并使用 OpDepthAttachmentReadEXT,则最后一次调用 vkCmdSetDepthWriteEnable 中的 depthWriteEnable 参数 必须VK_FALSE

  • VUID-vkCmdExecuteGeneratedCommandsEXT-pDynamicStates-08716
    如果绑定的图形管线状态包含片元着色器阶段,并且在 VkPipelineDynamicStateCreateInfo::pDynamicStates 中设置了 VK_DYNAMIC_STATE_STENCIL_WRITE_MASK,并且片元着色器声明了 EarlyFragmentTests 执行模式并使用 OpStencilAttachmentReadEXT,则最后一次调用 vkCmdSetStencilWriteMask 中的 writeMask 参数 必须0

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-09116
    如果着色器对象绑定到任何图形阶段或绑定的图形管线是使用 VK_DYNAMIC_STATE_COLOR_WRITE_MASK_EXT 创建的,并且任何颜色附件的格式为 VK_FORMAT_E5B9G9R9_UFLOAT_PACK32,则 vkCmdSetColorWriteMaskEXTpColorWriteMasks 参数的相应元素 必须 要么包含 VK_COLOR_COMPONENT_R_BITVK_COLOR_COMPONENT_G_BITVK_COLOR_COMPONENT_B_BIT 的全部,要么都不包含。

  • VUID-vkCmdExecuteGeneratedCommandsEXT-maxFragmentDualSrcAttachments-09239
    如果为任何附件启用了 混合,其中该附件的源或目标混合因子 使用辅助颜色输入,则此命令执行的 Fragment Execution Model静态使用的任何输出附件的 Location 最大值 必须 小于 maxFragmentDualSrcAttachments

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-09548
    如果当前的渲染通道是使用 vkCmdBeginRendering 开始的,并且没有任何着色器对象绑定到任何图形阶段,则 vkCmdSetRenderingAttachmentLocations 设置的 VkRenderingAttachmentLocationInfo::pColorAttachmentLocations 的每个元素的值 必须 与绑定管线中相应元素设置的值匹配。

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-09549
    如果当前的渲染通道是使用 vkCmdBeginRendering 开始的,并且没有任何着色器对象绑定到任何图形阶段,则绑定管线中的输入附件索引映射 必须 与通过 VkRenderingInputAttachmentIndexInfo 为当前渲染通道实例设置的映射匹配。

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-09642
    如果当前的渲染通道是使用带有 VK_RENDERING_ENABLE_LEGACY_DITHERING_BIT_EXT 标志的 vkCmdBeginRendering 开始的,则绑定的图形管线 必须 是使用 VK_PIPELINE_CREATE_2_ENABLE_LEGACY_DITHERING_BIT_EXT 创建的。

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-09643
    如果绑定的图形管线是使用 VK_PIPELINE_CREATE_2_ENABLE_LEGACY_DITHERING_BIT_EXT 创建的,则当前的渲染通道 必须 是使用带有 VK_RENDERING_ENABLE_LEGACY_DITHERING_BIT_EXT 标志的 vkCmdBeginRendering 开始的。

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

  • VUID-vkCmdExecuteGeneratedCommandsEXT-isPreprocessed-11046
    如果 isPreprocessedVK_TRUEvkGetGeneratedCommandsMemoryRequirementsEXT 没有返回 0 的所需大小,那么在执行此命令之前,必须已在设备上执行过 vkCmdPreprocessGeneratedCommandsEXT,并且预处理命令必须使用了与输入缓冲区引用的内容相同的 pGeneratedCommandsInfo 内容(除了 VkGeneratedCommandsInfoEXT::preprocessBuffer 之外)。

  • VUID-vkCmdExecuteGeneratedCommandsEXT-isPreprocessed-11047
    如果 isPreprocessedVK_TRUE,则 pGeneratedCommandsInfoindirectCommandsLayout 成员必须已使用设置了 VK_INDIRECT_COMMANDS_LAYOUT_USAGE_EXPLICIT_PREPROCESS_BIT_EXT 位创建。

  • VUID-vkCmdExecuteGeneratedCommandsEXT-indirectCommandsLayout-11141
    如果 pGeneratedCommandsInfoindirectCommandsLayout 成员在创建时设置了 VK_INDIRECT_COMMANDS_LAYOUT_USAGE_EXPLICIT_PREPROCESS_BIT_EXT 位,则 isPreprocessed 必须VK_TRUE

  • VUID-vkCmdExecuteGeneratedCommandsEXT-preprocessAddress-11142
    pGeneratedCommandsInfopreprocessAddress 成员的内容必须之前没有被用于记录另一个 vkCmdExecuteGeneratedCommandsEXT

  • VUID-vkCmdExecuteGeneratedCommandsEXT-isPreprocessed-11048
    如果 isPreprocessedVK_TRUE,那么绑定的描述符集和推送常量必须与调用 vkCmdPreprocessGeneratedCommandsEXT 记录期间绑定的完全一致。

  • VUID-vkCmdExecuteGeneratedCommandsEXT-isPreprocessed-10198
    如果 isPreprocessedVK_TRUE,那么条件渲染状态及其谓词值必须与执行相应调用 vkCmdPreprocessGeneratedCommandsEXT 期间设置的状态和值完全一致。

  • VUID-vkCmdExecuteGeneratedCommandsEXT-isPreprocessed-11049
    如果 isPreprocessedVK_TRUE,并且 pGeneratedCommandsInfoindirectCommandsLayout 成员包含一个绘制令牌,那么在 commandBuffer 上绑定的图形状态必须与传递给 vkCmdPreprocessGeneratedCommandsEXTstateCommandBuffer 上绑定的图形状态完全一致。

  • VUID-vkCmdExecuteGeneratedCommandsEXT-isPreprocessed-11149
    如果 isPreprocessedVK_TRUE,那么 commandBuffer 的队列族索引必须与用于分配传递给 vkCmdPreprocessGeneratedCommandsEXTstateCommandBuffer 的队列族索引相同。

  • VUID-vkCmdExecuteGeneratedCommandsEXT-isPreprocessed-11051
    如果 isPreprocessedVK_TRUE,并且 pGeneratedCommandsInfoindirectCommandsLayout 成员包含一个调度令牌,那么在 commandBuffer 上绑定的计算状态必须与传递给 vkCmdPreprocessGeneratedCommandsEXTstateCommandBuffer 上绑定的计算状态完全一致。

  • VUID-vkCmdExecuteGeneratedCommandsEXT-isPreprocessed-11052
    如果 isPreprocessedVK_TRUE,并且 pGeneratedCommandsInfoindirectCommandsLayout 成员包含一个光线追踪令牌,那么在 commandBuffer 上绑定的光线追踪状态必须与传递给 vkCmdPreprocessGeneratedCommandsEXTstateCommandBuffer 上绑定的光线追踪状态完全一致。

  • VUID-vkCmdExecuteGeneratedCommandsEXT-isPreprocessed-11150
    如果 isPreprocessedVK_TRUE,并且 pGeneratedCommandsInfoindirectCommandsLayout 成员包含一个光线追踪令牌,那么分配 commandBuffer 的队列族索引必须与用于分配传递给 vkCmdPreprocessGeneratedCommandsEXTstateCommandBuffer 的队列族索引相同。

  • VUID-vkCmdExecuteGeneratedCommandsEXT-indirectCommandsLayout-11053
    如果传递的 VkGeneratedCommandsInfoEXT::indirectCommandsLayout 的令牌序列包含一个 VK_INDIRECT_COMMANDS_TOKEN_TYPE_EXECUTION_SET_EXT 令牌,则 VkGeneratedCommandsInfoEXT::indirectExecutionSet 的初始着色器状态必须commandBuffer 上绑定。

  • VUID-vkCmdExecuteGeneratedCommandsEXT-indirectCommandsLayout-11004
    如果 indirectCommandsLayout 是使用包含 VK_INDIRECT_COMMANDS_TOKEN_TYPE_EXECUTION_SET_EXT 令牌的令牌序列创建的,并且 indirectExecutionSet 是使用 VK_INDIRECT_EXECUTION_SET_INFO_TYPE_SHADER_OBJECTS_EXT 创建的,那么每个执行的 VK_INDIRECT_COMMANDS_TOKEN_TYPE_EXECUTION_SET_EXT 令牌必须绑定在用于创建 indirectCommandsLayoutVkIndirectCommandsExecutionSetTokenEXT::shaderStages 中设置的所有着色器阶段。

  • VUID-vkCmdExecuteGeneratedCommandsEXT-isPreprocessed-11055
    如果 isPreprocessedVK_TRUE,并且传递的 VkGeneratedCommandsInfoEXT::indirectCommandsLayout 的令牌序列包含 VK_INDIRECT_COMMANDS_TOKEN_TYPE_EXECUTION_SET_EXT 令牌,那么自预处理缓冲区生成以来,此命令访问的 VkGeneratedCommandsInfoEXT::indirectExecutionSet 的成员必须未被修改。

  • VUID-vkCmdExecuteGeneratedCommandsEXT-indirectCommandsLayout-11056
    如果 pGeneratedCommandsInfoindirectCommandsLayout 成员包含一个绘制令牌,那么当前激活的渲染通道必须没有指定片段密度图。

  • VUID-vkCmdExecuteGeneratedCommandsEXT-deviceGeneratedCommandsTransformFeedback-11057
    如果设备不支持 deviceGeneratedCommandsTransformFeedback,那么变换反馈必须不处于激活状态。

  • VUID-vkCmdExecuteGeneratedCommandsEXT-indirectExecutionSet-11058
    如果变换反馈处于激活状态,那么 VkGeneratedCommandsInfoEXT::indirectExecutionSet必须VK_NULL_HANDLE

  • VUID-vkCmdExecuteGeneratedCommandsEXT-deviceGeneratedCommands-11059
    必须启用 VkPhysicalDeviceDeviceGeneratedCommandsFeaturesEXT::deviceGeneratedCommands 功能

  • VUID-vkCmdExecuteGeneratedCommandsEXT-supportedIndirectCommandsShaderStages-11060
    绑定的着色器阶段必须VkPhysicalDeviceDeviceGeneratedCommandsPropertiesEXT::supportedIndirectCommandsShaderStages 支持。

  • VUID-vkCmdExecuteGeneratedCommandsEXT-supportedIndirectCommandsShaderStages-11061
    只有在 VkPhysicalDeviceDeviceGeneratedCommandsPropertiesEXT::supportedIndirectCommandsShaderStages 中指定的阶段可以pGeneratedCommandsInfo->shaderStages 中设置。

  • VUID-vkCmdExecuteGeneratedCommandsEXT-None-11062
    如果当前渲染通道处于活动状态,则视图掩码必须0

  • VUID-vkCmdExecuteGeneratedCommandsEXT-commandBuffer-11143
    commandBuffer 必须 未使用 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT 创建。

有效用法(隐式)
  • VUID-vkCmdExecuteGeneratedCommandsEXT-commandBuffer-parameter
    commandBuffer 必须是一个有效的 VkCommandBuffer 句柄

  • VUID-vkCmdExecuteGeneratedCommandsEXT-pGeneratedCommandsInfo-parameter
    pGeneratedCommandsInfo 必须 是指向有效 VkGeneratedCommandsInfoEXT 结构的有效指针。

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

  • VUID-vkCmdExecuteGeneratedCommandsEXT-commandBuffer-cmdpool
    分配 commandBufferVkCommandPool 必须支持图形或计算操作

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

  • VUID-vkCmdExecuteGeneratedCommandsEXT-bufferlevel
    commandBuffer 必须 是一个主要的 VkCommandBuffer

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

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

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

两者

外部

图形
计算

操作
间接

VkGeneratedCommandsInfoEXT 定义为:

// Provided by VK_EXT_device_generated_commands
typedef struct VkGeneratedCommandsInfoEXT {
    VkStructureType                sType;
    const void*                    pNext;
    VkShaderStageFlags             shaderStages;
    VkIndirectExecutionSetEXT      indirectExecutionSet;
    VkIndirectCommandsLayoutEXT    indirectCommandsLayout;
    VkDeviceAddress                indirectAddress;
    VkDeviceSize                   indirectAddressSize;
    VkDeviceAddress                preprocessAddress;
    VkDeviceSize                   preprocessSize;
    uint32_t                       maxSequenceCount;
    VkDeviceAddress                sequenceCountAddress;
    uint32_t                       maxDrawCount;
} VkGeneratedCommandsInfoEXT;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • shaderStages 是命令使用的着色器阶段的掩码。

  • indirectExecutionSet 是用于绑定着色器的间接执行集。

  • indirectCommandsLayout 是指定命令序列数据的 VkIndirectCommandsLayoutEXT

  • indirectAddress 是保存间接缓冲区数据的地址。

  • indirectAddressSize 是从 indirectAddress 开始的间接缓冲区数据的大小(以字节为单位)。

  • preprocessAddress 指定用于预处理执行的输入数据的 VkBuffer 的物理地址。如果此结构与 vkCmdExecuteGeneratedCommandsEXT 一起使用,并且其 isPreprocessed 设置为 VK_TRUE,则会跳过预处理步骤,但此地址中的数据可能仍然会被修改。此地址的内容和布局对应用程序是不透明的,并且必须不在与设备生成的命令相关的函数之外进行修改,也不得复制到另一个缓冲区以供重用。

  • preprocessSizepreprocessAddress 中可用于预处理的最大字节大小。

  • maxSequenceCount 用于确定要执行的序列数。

  • sequenceCountAddress 指定一个可选的 uint32_t 值的物理地址,该值包含请求的要执行的序列数。

  • maxDrawCount 是任何 COUNT 类型多重间接绘制令牌可以执行的最大间接绘制次数。对于这些令牌类型,间接缓冲区中的绘制计数将被钳制为此值。

如果 sequenceCountAddress 不为 NULL,则 maxSequenceCount 是可以执行的最大序列数。实际数字为 min(maxSequenceCount, *sequenceCountAddress)。如果 sequenceCountAddressNULL,则 maxSequenceCount 是要执行的确切序列数。

如果布局的操作命令令牌不是 COUNT 类型多重间接绘制令牌,则 maxDrawCount 将被忽略。

有效用法
  • VUID-VkGeneratedCommandsInfoEXT-preprocessAddress-11063
    如果 vkGetGeneratedCommandsMemoryRequirementsEXT 返回非零大小,则 preprocessAddress 必须 不为 NULL

  • VUID-VkGeneratedCommandsInfoEXT-preprocessAddress-11064
    绑定到 preprocessAddress 底层缓冲区的 VkDeviceMemory 对象 必须 已使用 VkMemoryRequirements 结构中 memoryTypeBits 成员允许的内存类型之一进行分配,该结构由 vkGetGeneratedCommandsMemoryRequirementsEXT 返回。

  • VUID-VkGeneratedCommandsInfoEXT-indirectCommandsLayout-11065
    如果 indirectCommandsLayout 使用 VK_INDIRECT_COMMANDS_TOKEN_TYPE_PUSH_CONSTANT_EXT 标记,则 indirectExecutionSet 的推送常量布局 必须 包含 VkIndirectCommandsPushConstantTokenEXT 中指定的 updateRange

  • VUID-VkGeneratedCommandsInfoEXT-indirectCommandsLayout-11066
    如果 indirectCommandsLayout 使用 VK_INDIRECT_COMMANDS_TOKEN_TYPE_SEQUENCE_INDEX_EXT 标记,则 indirectExecutionSet 的推送常量布局 必须 包含 VkIndirectCommandsPushConstantTokenEXT 中指定的 updateRange

  • VUID-VkGeneratedCommandsInfoEXT-maxSequenceCount-11067
    maxSequenceCount 必须 小于或等于 VkPhysicalDeviceDeviceGeneratedCommandsPropertiesEXT::maxIndirectSequenceCount 和用于确定 preprocessSizeVkGeneratedCommandsMemoryRequirementsInfoEXT::maxSequencesCount

  • VUID-VkGeneratedCommandsInfoEXT-sequenceCountAddress-11068
    如果 sequenceCountAddress 不为 NULL,则地址中包含的值 必须 小于或等于 VkPhysicalDeviceDeviceGeneratedCommandsPropertiesEXT::maxIndirectSequenceCount 和用于确定 preprocessSizeVkGeneratedCommandsMemoryRequirementsInfoEXT::maxSequencesCount

  • VUID-VkGeneratedCommandsInfoEXT-maxSequenceCount-10246
    maxSequenceCount 必须 不为零。

  • VUID-VkGeneratedCommandsInfoEXT-preprocessAddress-11069
    preprocessAddress 的底层缓冲区 必须 在其使用标志中设置 VK_BUFFER_USAGE_2_PREPROCESS_BUFFER_BIT_EXT 位。

  • VUID-VkGeneratedCommandsInfoEXT-preprocessAddress-11070
    如果 preprocessAddress 的底层缓冲区是非稀疏的,则它 必须 完全且连续地绑定到单个 VkDeviceMemory 对象。

  • VUID-VkGeneratedCommandsInfoEXT-indirectCommandsLayout-11144
    如果 indirectCommandsLayout 包含 VK_INDIRECT_COMMANDS_TOKEN_TYPE_EXECUTION_SET_EXT 标记,则由 pipelineLayout 或通过用于创建 indirectCommandsLayoutVkIndirectCommandsLayoutCreateInfoEXTpNext 中的 VkPipelineLayoutCreateInfo 提供的描述符和推送常量布局信息,必须indirectExecutionSet 使用的描述符和推送常量布局信息 兼容

  • VUID-VkGeneratedCommandsInfoEXT-indirectCommandsLayout-11002
    如果使用包含 VK_INDIRECT_COMMANDS_TOKEN_TYPE_EXECUTION_SET_EXT 令牌的令牌序列创建了 indirectCommandsLayout,则用于创建 indirectExecutionSet 初始着色器状态的着色器阶段必须 等于用于创建 indirectCommandsLayoutVkIndirectCommandsExecutionSetTokenEXT::shaderStages

  • VUID-VkGeneratedCommandsInfoEXT-preprocessSize-11071
    preprocessSize 必须 大于或等于使用匹配输入(与此结构中的 indirectCommandsLayout, ...)通过 vkGetGeneratedCommandsMemoryRequirementsEXT 返回的内存要求的尺寸。

  • VUID-VkGeneratedCommandsInfoEXT-sequenceCountAddress-11072
    sequenceCountAddress 的底层缓冲区 必须 在其使用标志中设置 VK_BUFFER_USAGE_2_INDIRECT_BUFFER_BIT_KHR 位。

  • VUID-VkGeneratedCommandsInfoEXT-sequenceCountAddress-11073
    如果 sequenceCountAddress 不为 NULL,则 sequenceCountAddress 必须 对齐到 4

  • VUID-VkGeneratedCommandsInfoEXT-indirectAddress-11074
    indirectAddress 必须对齐到 4 字节。

  • VUID-VkGeneratedCommandsInfoEXT-sequenceCountAddress-11075
    如果 sequenceCountAddress 的底层缓冲区是非稀疏的,那么它必须完全且连续地绑定到单个 VkDeviceMemory 对象。

  • VUID-VkGeneratedCommandsInfoEXT-indirectAddress-11076
    indirectAddress 必须不能为 NULL

  • VUID-VkGeneratedCommandsInfoEXT-indirectAddressSize-11077
    indirectAddressSize 必须大于零。

  • VUID-VkGeneratedCommandsInfoEXT-maxDrawCount-11078
    当不被忽略时,maxDrawCount × maxSequenceCount 必须 小于 2^24

  • VUID-VkGeneratedCommandsInfoEXT-indirectCommandsLayout-11079
    如果 indirectCommandsLayout 是使用 VK_INDIRECT_COMMANDS_TOKEN_TYPE_VERTEX_BUFFER_EXT 令牌创建的,并且没有绑定着色器对象,那么绑定的图形管线必须pDynamicStates 中使用 VK_DYNAMIC_STATE_VERTEX_INPUT_BINDING_STRIDE 创建。

  • VUID-VkGeneratedCommandsInfoEXT-indirectCommandsLayout-11083
    如果传递的 indirectCommandsLayout 的令牌序列包含 VK_INDIRECT_COMMANDS_TOKEN_TYPE_EXECUTION_SET_EXT 令牌,则 indirectExecutionSet 必须不能为 VK_NULL_HANDLE

  • VUID-VkGeneratedCommandsInfoEXT-indirectCommandsLayout-10241
    如果传递的 indirectCommandsLayout 的令牌序列不包含 VK_INDIRECT_COMMANDS_TOKEN_TYPE_EXECUTION_SET_EXT 令牌,则 indirectExecutionSet 必须VK_NULL_HANDLE

  • VUID-VkGeneratedCommandsInfoEXT-indirectExecutionSet-11080
    如果 indirectExecutionSetVK_NULL_HANDLE,则 pNext 链中必须包含 VkGeneratedCommandsPipelineInfoEXTVkGeneratedCommandsShaderInfoEXT

有效用法(隐式)
  • VUID-VkGeneratedCommandsInfoEXT-sType-sType
    sType 必须VK_STRUCTURE_TYPE_GENERATED_COMMANDS_INFO_EXT

  • VUID-VkGeneratedCommandsInfoEXT-shaderStages-parameter
    shaderStages **必须**是 VkShaderStageFlagBits 值的有效组合。

  • VUID-VkGeneratedCommandsInfoEXT-shaderStages-requiredbitmask
    shaderStages **必须**不能为 0

  • VUID-VkGeneratedCommandsInfoEXT-indirectExecutionSet-parameter
    如果 indirectExecutionSet 不是 VK_NULL_HANDLE,则 indirectExecutionSet 必须 是一个有效的 VkIndirectExecutionSetEXT 句柄

  • VUID-VkGeneratedCommandsInfoEXT-indirectCommandsLayout-parameter
    indirectCommandsLayout 必须 是一个有效的 VkIndirectCommandsLayoutEXT 句柄

  • VUID-VkGeneratedCommandsInfoEXT-commonparent
    indirectCommandsLayoutindirectExecutionSet(均为非忽略参数的有效句柄)都必须是从同一个 VkDevice 创建、分配或检索的。

参考间接命令布局中定义的函数,vkCmdExecuteGeneratedCommandsEXT 的行为如下:

uint32_t sequencesCount = sequenceCountAddress ?
      min(maxSequenceCount, sequenceCountAddress.load_uint32()) :
      maxSequenceCount;


cmdProcessAllSequences(commandBuffer, indirectExecutionSet,
                       indirectCommandsLayout, indirectAddress,
                       sequencesCount);

// The stateful commands within indirectCommandsLayout will not
// affect the state of subsequent commands in the target
// command buffer (cmd)
注意

需要注意的是,所有与使用的 shaderStages 相关的状态值在此命令之后都是未定义的。这意味着,例如,如果此命令间接地更改了推送常量,则推送常量状态将变为未定义

可以使用以下命令在执行之前预处理命令

// Provided by VK_EXT_device_generated_commands
void vkCmdPreprocessGeneratedCommandsEXT(
    VkCommandBuffer                             commandBuffer,
    const VkGeneratedCommandsInfoEXT*           pGeneratedCommandsInfo,
    VkCommandBuffer                             stateCommandBuffer);
  • commandBuffer 是执行预处理的命令缓冲区。

  • pGeneratedCommandsInfo 是指向包含影响预处理步骤的参数的 VkGeneratedCommandsInfoEXT 结构的指针。

  • stateCommandBuffer 是一个命令缓冲区,用于从中快照影响预处理步骤的当前状态。当使用图形命令动作令牌时,将快照图形状态。当使用计算动作命令令牌时,将快照计算状态。当使用光线追踪动作命令令牌时,将快照光线追踪状态。此命令记录后,可以随时将其删除。

注意

驱动程序不会同步 stateCommandBuffer 的访问,这意味着此命令缓冲区必须不能在线程之间以不安全的方式修改。

有效用法
  • VUID-vkCmdPreprocessGeneratedCommandsEXT-commandBuffer-11081
    commandBuffer 必须 不是受保护的命令缓冲区。

  • VUID-vkCmdPreprocessGeneratedCommandsEXT-pGeneratedCommandsInfo-11082
    pGeneratedCommandsInfoindirectCommandsLayout 必须已使用设置的 VK_INDIRECT_COMMANDS_LAYOUT_USAGE_EXPLICIT_PREPROCESS_BIT_EXT 位创建。

  • VUID-vkCmdPreprocessGeneratedCommandsEXT-indirectCommandsLayout-11084
    如果传递的 VkGeneratedCommandsInfoEXT::indirectCommandsLayout 的令牌序列包含 VK_INDIRECT_COMMANDS_TOKEN_TYPE_EXECUTION_SET_EXT 令牌,则 VkGeneratedCommandsInfoEXT::indirectExecutionSet 的初始着色器状态必须stateCommandBuffer 上绑定。

  • VUID-vkCmdPreprocessGeneratedCommandsEXT-stateCommandBuffer-11138
    stateCommandBuffer 必须处于记录状态。

  • VUID-vkCmdPreprocessGeneratedCommandsEXT-deviceGeneratedCommands-11087
    必须启用 VkPhysicalDeviceDeviceGeneratedCommandsFeaturesEXT::deviceGeneratedCommands 功能

  • VUID-vkCmdPreprocessGeneratedCommandsEXT-supportedIndirectCommandsShaderStages-11088
    只有在 VkPhysicalDeviceDeviceGeneratedCommandsPropertiesEXT::supportedIndirectCommandsShaderStages 中指定的阶段可以pGeneratedCommandsInfo->shaderStages 中设置。

有效用法(隐式)
  • VUID-vkCmdPreprocessGeneratedCommandsEXT-commandBuffer-parameter
    commandBuffer 必须是一个有效的 VkCommandBuffer 句柄

  • VUID-vkCmdPreprocessGeneratedCommandsEXT-pGeneratedCommandsInfo-parameter
    pGeneratedCommandsInfo 必须 是指向有效 VkGeneratedCommandsInfoEXT 结构的有效指针。

  • VUID-vkCmdPreprocessGeneratedCommandsEXT-stateCommandBuffer-parameter
    stateCommandBuffer 必须是有效的 VkCommandBuffer 句柄。

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

  • VUID-vkCmdPreprocessGeneratedCommandsEXT-commandBuffer-cmdpool
    分配 commandBufferVkCommandPool 必须支持图形或计算操作

  • VUID-vkCmdPreprocessGeneratedCommandsEXT-renderpass
    此命令必须仅在渲染通道实例之外调用。

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

  • VUID-vkCmdPreprocessGeneratedCommandsEXT-bufferlevel
    commandBuffer 必须 是一个主要的 VkCommandBuffer

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

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

  • stateCommandBuffer 的主机访问必须进行外部同步。

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

vkCmdPreprocessGeneratedCommandsEXT 预处理命令时,用于间接命令生成绑定的描述符集和推送常量必须已在 stateCommandBuffer 上指定。它们必须与通过 vkCmdExecuteGeneratedCommandsEXT 执行间接命令时使用的绑定描述符集和推送常量匹配。

如果着色器阶段的推送常量也在 VkGeneratedCommandsInfoEXT::indirectCommandsLayout 中使用 VK_INDIRECT_COMMANDS_TOKEN_TYPE_PUSH_CONSTANT_EXTVK_INDIRECT_COMMANDS_TOKEN_TYPE_SEQUENCE_INDEX_EXT 令牌指定,那么这些值将覆盖先前推送的推送常量。

将使用在 stateCommandBuffer 上绑定的所有状态。在 stateCommandBuffer 上绑定的所有状态必须与记录 vkCmdExecuteGeneratedCommandsEXT 时绑定的状态相同。stateCommandBuffer 分配的队列族索引必须vkCmdExecuteGeneratedCommandsEXT 中使用的命令缓冲区的队列族索引相同。

在某些实现中,预处理可能不会对性能产生影响。

vkCmdExecuteGeneratedCommandsEXT 可能会写入预处理缓冲区,无论 isPreprocess 参数如何。在这种情况下,实现必须自动插入适当的同步,这对应于以下伪代码

  • 屏障

    • srcStageMask = DRAW_INDIRECT

    • srcAccesMask = 0

    • dstStageMask = COMMAND_PREPROCESS_BIT

    • dstAccessMask = COMMAND_PREPROCESS_WRITE_BIT | COMMAND_PREPROCESS_READ_BIT

  • 执行内部写入

  • 屏障

    • srcStageMask = COMMAND_PREPROCESS_BIT

    • srcAccesMask = COMMAND_PREPROCESS_WRITE_BIT

    • dstStageMask = DRAW_INDIRECT

    • dstAccessMask = INDIRECT_COMMAND_READ_BIT

  • 执行