分派命令

本章描述的分派命令会在计算管线中触发工作。分派命令会被记录到命令缓冲区中,当由队列执行时,会根据绑定的计算管线产生工作。在将任何分派命令记录到命令缓冲区之前,必须将计算管线绑定到该命令缓冲区。

要记录分派,请调用

// Provided by VK_VERSION_1_0
void vkCmdDispatch(
    VkCommandBuffer                             commandBuffer,
    uint32_t                                    groupCountX,
    uint32_t                                    groupCountY,
    uint32_t                                    groupCountZ);
c++
  • commandBuffer 是要将命令记录到的命令缓冲区。

  • groupCountX 是要在 X 维度中分派的本地工作组的数量。

  • groupCountY 是要在 Y 维度中分派的本地工作组的数量。

  • groupCountZ 是要在 Z 维度中分派的本地工作组的数量。

当命令执行时,会组装一个由 groupCountX × groupCountY × groupCountZ 个本地工作组组成的全局工作组。

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

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

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

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

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

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

  • VUID-vkCmdDispatch-None-08610
    如果使用一个 unnormalizedCoordinates 等于 VK_TRUE 创建的 VkSampler 来采样一个 VkImageView,那么该采样器必须不能用于任何名称中包含 ImplicitLodDrefProj 的 SPIR-V OpImageSample*OpImageSparseSample* 指令。

  • VUID-vkCmdDispatch-None-08611
    如果使用一个 unnormalizedCoordinates 等于 VK_TRUE 创建的 VkSampler 来采样一个 VkImageView,那么该采样器必须不能用于任何包含 LOD 偏差或任何偏移值的 SPIR-V OpImageSample*OpImageSparseSample* 指令。

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

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

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

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

  • VUID-vkCmdDispatch-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-vkCmdDispatch-filterCubic-02694
    任何由于该命令而使用 VK_FILTER_CUBIC_EXT 采样的 VkImageView 必须具有一个 VkImageViewType 和格式,该格式支持立方滤波,如 VkFilterCubicImageViewImageFormatPropertiesEXT::filterCubic 中指定,该值由 vkGetPhysicalDeviceImageFormatProperties2 返回。

  • VUID-vkCmdDispatch-filterCubicMinmax-02695
    任何由于该命令而使用 VK_FILTER_CUBIC_EXT 且缩减模式为 VK_SAMPLER_REDUCTION_MODE_MINVK_SAMPLER_REDUCTION_MODE_MAX 进行采样的 VkImageView 必须具有一个 VkImageViewType 和格式,该格式支持立方滤波以及最小/最大滤波,如 VkFilterCubicImageViewImageFormatPropertiesEXT::filterCubicMinmax 中指定,该值由 vkGetPhysicalDeviceImageFormatProperties2 返回。

  • VUID-vkCmdDispatch-cubicRangeClamp-09212
    如果未启用 cubicRangeClamp 功能,则由于该命令而使用 VK_FILTER_CUBIC_EXT 采样的任何 VkImageView 必须不具有等于 VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE_RANGECLAMP_QCOMVkSamplerReductionModeCreateInfo::reductionMode

  • VUID-vkCmdDispatch-reductionMode-09213
    任何由于此命令而使用等于 VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE_RANGECLAMP_QCOMVkSamplerReductionModeCreateInfo::reductionMode 采样的 VkImageView 必须使用 VK_FILTER_CUBIC_EXT 进行采样。

  • VUID-vkCmdDispatch-selectableCubicWeights-09214
    如果未启用 selectableCubicWeights 功能,则由于此命令而使用 VK_FILTER_CUBIC_EXT 采样的任何 VkImageView 必须使 VkSamplerCubicWeightsCreateInfoQCOM::cubicWeights 等于 VK_CUBIC_FILTER_WEIGHTS_CATMULL_ROM_QCOM

  • VUID-vkCmdDispatch-flags-02696
    任何使用包含 VK_IMAGE_CREATE_CORNER_SAMPLED_BIT_NVVkImageCreateInfo::flags 创建的 VkImage,如果由于该命令被采样,则必须仅使用 VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGEVkSamplerAddressMode 进行采样。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • VUID-vkCmdDispatch-None-08605
    如果描述符与使用 VkDescriptorSetLayout (该 VkDescriptorSetLayout 是使用 VK_DESCRIPTOR_SET_LAYOUT_CREATE_DESCRIPTOR_BUFFER_BIT_EXT 创建的) 创建的 VkShaderEXT 动态使用,则描述符内存必须常驻。

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

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

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

  • VUID-vkCmdDispatch-uniformBuffers-06935
    如果绑定到此命令使用的管线绑定点的VkPipeline对象的任何阶段访问了uniform缓冲区,并且该阶段的创建未启用VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESSVK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS_2中的任何一个用于uniformBuffers,并且未启用robustBufferAccess特性,则该阶段必须不访问超出绑定到同一管线绑定点的描述符集中指定的缓冲区范围之外的值。

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

  • VUID-vkCmdDispatch-storageBuffers-06936
    如果绑定到此命令使用的管线绑定点的VkPipeline对象的任何阶段访问了存储缓冲区,并且该阶段的创建未启用VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESSVK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS_2中的任何一个用于storageBuffers,并且未启用robustBufferAccess特性,则该阶段必须不访问超出绑定到同一管线绑定点的描述符集中指定的缓冲区范围之外的值。

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

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

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

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

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

  • VUID-vkCmdDispatch-format-07753
    如果作为此命令的结果访问了VkImageView,则图像视图的format数字类型OpTypeImageSampled Type操作数必须匹配。

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

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

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

  • VUID-vkCmdDispatch-SampledType-04470
    如果作为此命令的结果访问了VkImageView,其VkFormat具有64位分量宽度,则该指令的OpTypeImage操作数的SampledType必须具有64的Width

  • VUID-vkCmdDispatch-SampledType-04471
    如果作为此命令的结果访问了VkImageView,其VkFormat具有小于64位的分量宽度,则该指令的OpTypeImage操作数的SampledType必须具有32的Width

  • VUID-vkCmdDispatch-SampledType-04472
    如果作为此命令的结果访问了VkBufferView,其VkFormat具有64位分量宽度,则该指令的OpTypeImage操作数的SampledType必须具有64的Width

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

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

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

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

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

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

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

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

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

  • VUID-vkCmdDispatch-OpImageWeightedSampleQCOM-06977
    如果 OpImageWeightedSampleQCOMOpImageBoxFilterQCOMOpImageBlockMatchWindowSSDQCOMOpImageBlockMatchWindowSADQCOMOpImageBlockMatchGatherSSDQCOMOpImageBlockMatchGatherSADQCOMOpImageBlockMatchSSDQCOMOpImageBlockMatchSADQCOM 使用 VkSampler,则该采样器必须使用 VK_SAMPLER_CREATE_IMAGE_PROCESSING_BIT_QCOM 创建。

  • VUID-vkCmdDispatch-OpImageWeightedSampleQCOM-06978
    如果除 OpImageWeightedSampleQCOMOpImageBoxFilterQCOMOpImageBlockMatchWindowSSDQCOMOpImageBlockMatchWindowSADQCOMOpImageBlockMatchGatherSSDQCOMOpImageBlockMatchGatherSADQCOMOpImageBlockMatchSSDQCOMOpImageBlockMatchSADQCOM 之外的任何命令使用 VkSampler,则该采样器必须没有使用 VK_SAMPLER_CREATE_IMAGE_PROCESSING_BIT_QCOM 创建。

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

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

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

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

  • VUID-vkCmdDispatch-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-vkCmdDispatch-commandBuffer-02712
    如果 commandBuffer 是受保护的命令缓冲区,并且不支持protectedNoFault,则此命令使用的管线绑定点绑定的 VkPipeline 对象写入的任何资源必须不是未受保护的资源。

  • VUID-vkCmdDispatch-commandBuffer-02713
    如果 commandBuffer 是一个受保护的命令缓冲区,并且不支持 protectedNoFault,则绑定到此命令所用管线绑定点的 VkPipeline 对象中,除了帧缓冲区空间和计算阶段之外的管线阶段 必须 不能写入任何资源。

  • VUID-vkCmdDispatch-commandBuffer-04617
    如果绑定到此命令所用管线绑定点的 VkPipeline 的任何着色器阶段使用了 RayQueryKHR 功能,则 commandBuffer 必须 不是受保护的命令缓冲区。

  • VUID-vkCmdDispatch-groupCountX-00386
    groupCountX 必须 小于或等于 VkPhysicalDeviceLimits::maxComputeWorkGroupCount[0]。

  • VUID-vkCmdDispatch-groupCountY-00387
    groupCountY 必须 小于或等于 VkPhysicalDeviceLimits::maxComputeWorkGroupCount[1]。

  • VUID-vkCmdDispatch-groupCountZ-00388
    groupCountZ 必须 小于或等于 VkPhysicalDeviceLimits::maxComputeWorkGroupCount[2]。

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

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

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

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

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

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

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

要记录间接分派命令,请调用

// Provided by VK_VERSION_1_0
void vkCmdDispatchIndirect(
    VkCommandBuffer                             commandBuffer,
    VkBuffer                                    buffer,
    VkDeviceSize                                offset);
c++
  • commandBuffer 是要将命令记录到的命令缓冲区。

  • buffer 是包含分派参数的缓冲区。

  • offsetbuffer 中参数开始处的字节偏移量。

vkCmdDispatchIndirect 的行为类似于 vkCmdDispatch,不同之处在于参数是在执行期间由设备从缓冲区读取的。分派的参数编码在 VkDispatchIndirectCommand 结构中,该结构从 bufferoffset 开始获取。

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

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

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

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

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

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

  • VUID-vkCmdDispatchIndirect-None-08610
    如果使用一个 unnormalizedCoordinates 等于 VK_TRUE 创建的 VkSampler 来采样一个 VkImageView,那么该采样器必须不能用于任何名称中包含 ImplicitLodDrefProj 的 SPIR-V OpImageSample*OpImageSparseSample* 指令。

  • VUID-vkCmdDispatchIndirect-None-08611
    如果使用一个 unnormalizedCoordinates 等于 VK_TRUE 创建的 VkSampler 来采样一个 VkImageView,那么该采样器必须不能用于任何包含 LOD 偏差或任何偏移值的 SPIR-V OpImageSample*OpImageSparseSample* 指令。

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

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

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

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

  • VUID-vkCmdDispatchIndirect-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-vkCmdDispatchIndirect-filterCubic-02694
    任何由于该命令而使用 VK_FILTER_CUBIC_EXT 采样的 VkImageView 必须具有一个 VkImageViewType 和格式,该格式支持立方滤波,如 VkFilterCubicImageViewImageFormatPropertiesEXT::filterCubic 中指定,该值由 vkGetPhysicalDeviceImageFormatProperties2 返回。

  • VUID-vkCmdDispatchIndirect-filterCubicMinmax-02695
    任何由于该命令而使用 VK_FILTER_CUBIC_EXT 且缩减模式为 VK_SAMPLER_REDUCTION_MODE_MINVK_SAMPLER_REDUCTION_MODE_MAX 进行采样的 VkImageView 必须具有一个 VkImageViewType 和格式,该格式支持立方滤波以及最小/最大滤波,如 VkFilterCubicImageViewImageFormatPropertiesEXT::filterCubicMinmax 中指定,该值由 vkGetPhysicalDeviceImageFormatProperties2 返回。

  • VUID-vkCmdDispatchIndirect-cubicRangeClamp-09212
    如果未启用 cubicRangeClamp 功能,则由于该命令而使用 VK_FILTER_CUBIC_EXT 采样的任何 VkImageView 必须不具有等于 VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE_RANGECLAMP_QCOMVkSamplerReductionModeCreateInfo::reductionMode

  • VUID-vkCmdDispatchIndirect-reductionMode-09213
    任何由于此命令而使用等于 VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE_RANGECLAMP_QCOMVkSamplerReductionModeCreateInfo::reductionMode 采样的 VkImageView 必须使用 VK_FILTER_CUBIC_EXT 进行采样。

  • VUID-vkCmdDispatchIndirect-selectableCubicWeights-09214
    如果未启用 selectableCubicWeights 功能,则由于此命令而使用 VK_FILTER_CUBIC_EXT 采样的任何 VkImageView 必须使 VkSamplerCubicWeightsCreateInfoQCOM::cubicWeights 等于 VK_CUBIC_FILTER_WEIGHTS_CATMULL_ROM_QCOM

  • VUID-vkCmdDispatchIndirect-flags-02696
    任何使用包含 VK_IMAGE_CREATE_CORNER_SAMPLED_BIT_NVVkImageCreateInfo::flags 创建的 VkImage,如果由于该命令被采样,则必须仅使用 VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGEVkSamplerAddressMode 进行采样。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • VUID-vkCmdDispatchIndirect-None-08605
    如果描述符与使用 VkDescriptorSetLayout (该 VkDescriptorSetLayout 是使用 VK_DESCRIPTOR_SET_LAYOUT_CREATE_DESCRIPTOR_BUFFER_BIT_EXT 创建的) 创建的 VkShaderEXT 动态使用,则描述符内存必须常驻。

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

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

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

  • VUID-vkCmdDispatchIndirect-uniformBuffers-06935
    如果绑定到此命令使用的管线绑定点的VkPipeline对象的任何阶段访问了uniform缓冲区,并且该阶段的创建未启用VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESSVK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS_2中的任何一个用于uniformBuffers,并且未启用robustBufferAccess特性,则该阶段必须不访问超出绑定到同一管线绑定点的描述符集中指定的缓冲区范围之外的值。

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

  • VUID-vkCmdDispatchIndirect-storageBuffers-06936
    如果绑定到此命令使用的管线绑定点的VkPipeline对象的任何阶段访问了存储缓冲区,并且该阶段的创建未启用VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESSVK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS_2中的任何一个用于storageBuffers,并且未启用robustBufferAccess特性,则该阶段必须不访问超出绑定到同一管线绑定点的描述符集中指定的缓冲区范围之外的值。

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

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

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

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

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

  • VUID-vkCmdDispatchIndirect-format-07753
    如果作为此命令的结果访问了VkImageView,则图像视图的format数字类型OpTypeImageSampled Type操作数必须匹配。

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

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

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

  • VUID-vkCmdDispatchIndirect-SampledType-04470
    如果作为此命令的结果访问了VkImageView,其VkFormat具有64位分量宽度,则该指令的OpTypeImage操作数的SampledType必须具有64的Width

  • VUID-vkCmdDispatchIndirect-SampledType-04471
    如果作为此命令的结果访问了VkImageView,其VkFormat具有小于64位的分量宽度,则该指令的OpTypeImage操作数的SampledType必须具有32的Width

  • VUID-vkCmdDispatchIndirect-SampledType-04472
    如果作为此命令的结果访问了VkBufferView,其VkFormat具有64位分量宽度,则该指令的OpTypeImage操作数的SampledType必须具有64的Width

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

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

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

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

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

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

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

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

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

  • VUID-vkCmdDispatchIndirect-OpImageWeightedSampleQCOM-06977
    如果 OpImageWeightedSampleQCOMOpImageBoxFilterQCOMOpImageBlockMatchWindowSSDQCOMOpImageBlockMatchWindowSADQCOMOpImageBlockMatchGatherSSDQCOMOpImageBlockMatchGatherSADQCOMOpImageBlockMatchSSDQCOMOpImageBlockMatchSADQCOM 使用 VkSampler,则该采样器必须使用 VK_SAMPLER_CREATE_IMAGE_PROCESSING_BIT_QCOM 创建。

  • VUID-vkCmdDispatchIndirect-OpImageWeightedSampleQCOM-06978
    如果除 OpImageWeightedSampleQCOMOpImageBoxFilterQCOMOpImageBlockMatchWindowSSDQCOMOpImageBlockMatchWindowSADQCOMOpImageBlockMatchGatherSSDQCOMOpImageBlockMatchGatherSADQCOMOpImageBlockMatchSSDQCOMOpImageBlockMatchSADQCOM 之外的任何命令使用 VkSampler,则该采样器必须没有使用 VK_SAMPLER_CREATE_IMAGE_PROCESSING_BIT_QCOM 创建。

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

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

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

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

  • VUID-vkCmdDispatchIndirect-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-vkCmdDispatchIndirect-buffer-02708
    如果 buffer 不是稀疏的,则它必须完全且连续地绑定到单个 VkDeviceMemory 对象。

  • VUID-vkCmdDispatchIndirect-buffer-02709
    buffer 必须使用设置的 VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT 位创建。

  • VUID-vkCmdDispatchIndirect-offset-02710
    offset 必须4 的倍数。

  • VUID-vkCmdDispatchIndirect-commandBuffer-02711
    commandBuffer 不能是受保护的命令缓冲区。

  • VUID-vkCmdDispatchIndirect-offset-00407
    offsetVkDispatchIndirectCommand 的大小之和必须小于或等于 buffer 的大小。

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

  • VUID-vkCmdDispatchIndirect-buffer-parameter
    buffer 必须是有效的 VkBuffer 句柄。

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

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

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

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

  • VUID-vkCmdDispatchIndirect-commonparent
    buffercommandBuffer必须已从相同的 VkDevice 创建、分配或检索。

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

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

VkDispatchIndirectCommand 结构定义为:

// Provided by VK_VERSION_1_0
typedef struct VkDispatchIndirectCommand {
    uint32_t    x;
    uint32_t    y;
    uint32_t    z;
} VkDispatchIndirectCommand;
c++
  • x 是在 X 维度中要调度的本地工作组的数量。

  • y 是在 Y 维度中要调度的本地工作组的数量。

  • z 是在 Z 维度中要调度的本地工作组的数量。

VkDispatchIndirectCommand 的成员与 vkCmdDispatch 的相应参数具有相同的含义。

有效使用
  • VUID-VkDispatchIndirectCommand-x-00417
    x 必须小于或等于 VkPhysicalDeviceLimits::maxComputeWorkGroupCount[0]。

  • VUID-VkDispatchIndirectCommand-y-00418
    y 必须小于或等于 VkPhysicalDeviceLimits::maxComputeWorkGroupCount[1]。

  • VUID-VkDispatchIndirectCommand-z-00419
    z 必须小于或等于 VkPhysicalDeviceLimits::maxComputeWorkGroupCount[2]。

要记录使用 WorkgroupId 组件的非零基值的调度,请调用

// Provided by VK_VERSION_1_1
void vkCmdDispatchBase(
    VkCommandBuffer                             commandBuffer,
    uint32_t                                    baseGroupX,
    uint32_t                                    baseGroupY,
    uint32_t                                    baseGroupZ,
    uint32_t                                    groupCountX,
    uint32_t                                    groupCountY,
    uint32_t                                    groupCountZ);
c++

或等效的命令

// Provided by VK_KHR_device_group
void vkCmdDispatchBaseKHR(
    VkCommandBuffer                             commandBuffer,
    uint32_t                                    baseGroupX,
    uint32_t                                    baseGroupY,
    uint32_t                                    baseGroupZ,
    uint32_t                                    groupCountX,
    uint32_t                                    groupCountY,
    uint32_t                                    groupCountZ);
c++
  • commandBuffer 是要将命令记录到的命令缓冲区。

  • baseGroupXWorkgroupId 的 X 分量的起始值。

  • baseGroupYWorkgroupId 的 Y 分量的起始值。

  • baseGroupZWorkgroupId 的 Z 分量的起始值。

  • groupCountX 是要在 X 维度中分派的本地工作组的数量。

  • groupCountY 是要在 Y 维度中分派的本地工作组的数量。

  • groupCountZ 是要在 Z 维度中分派的本地工作组的数量。

当命令执行时,会组装一个由 groupCountX × groupCountY × groupCountZ 个局部工作组组成的全局工作组,其中 WorkgroupId 的值在每个分量中都从 [baseGroup*, baseGroup* + groupCount*) 范围变化。vkCmdDispatch 等效于 vkCmdDispatchBase(0,0,0,groupCountX,groupCountY,groupCountZ)

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

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

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

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

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

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

  • VUID-vkCmdDispatchBase-None-08610
    如果使用一个 unnormalizedCoordinates 等于 VK_TRUE 创建的 VkSampler 来采样一个 VkImageView,那么该采样器必须不能用于任何名称中包含 ImplicitLodDrefProj 的 SPIR-V OpImageSample*OpImageSparseSample* 指令。

  • VUID-vkCmdDispatchBase-None-08611
    如果使用一个 unnormalizedCoordinates 等于 VK_TRUE 创建的 VkSampler 来采样一个 VkImageView,那么该采样器必须不能用于任何包含 LOD 偏差或任何偏移值的 SPIR-V OpImageSample*OpImageSparseSample* 指令。

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

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

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

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

  • VUID-vkCmdDispatchBase-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-vkCmdDispatchBase-filterCubic-02694
    任何由于该命令而使用 VK_FILTER_CUBIC_EXT 采样的 VkImageView 必须具有一个 VkImageViewType 和格式,该格式支持立方滤波,如 VkFilterCubicImageViewImageFormatPropertiesEXT::filterCubic 中指定,该值由 vkGetPhysicalDeviceImageFormatProperties2 返回。

  • VUID-vkCmdDispatchBase-filterCubicMinmax-02695
    任何由于该命令而使用 VK_FILTER_CUBIC_EXT 且缩减模式为 VK_SAMPLER_REDUCTION_MODE_MINVK_SAMPLER_REDUCTION_MODE_MAX 进行采样的 VkImageView 必须具有一个 VkImageViewType 和格式,该格式支持立方滤波以及最小/最大滤波,如 VkFilterCubicImageViewImageFormatPropertiesEXT::filterCubicMinmax 中指定,该值由 vkGetPhysicalDeviceImageFormatProperties2 返回。

  • VUID-vkCmdDispatchBase-cubicRangeClamp-09212
    如果未启用 cubicRangeClamp 功能,则由于该命令而使用 VK_FILTER_CUBIC_EXT 采样的任何 VkImageView 必须不具有等于 VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE_RANGECLAMP_QCOMVkSamplerReductionModeCreateInfo::reductionMode

  • VUID-vkCmdDispatchBase-reductionMode-09213
    任何由于此命令而使用等于 VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE_RANGECLAMP_QCOMVkSamplerReductionModeCreateInfo::reductionMode 采样的 VkImageView 必须使用 VK_FILTER_CUBIC_EXT 进行采样。

  • VUID-vkCmdDispatchBase-selectableCubicWeights-09214
    如果未启用 selectableCubicWeights 功能,则由于此命令而使用 VK_FILTER_CUBIC_EXT 采样的任何 VkImageView 必须使 VkSamplerCubicWeightsCreateInfoQCOM::cubicWeights 等于 VK_CUBIC_FILTER_WEIGHTS_CATMULL_ROM_QCOM

  • VUID-vkCmdDispatchBase-flags-02696
    任何使用包含 VK_IMAGE_CREATE_CORNER_SAMPLED_BIT_NVVkImageCreateInfo::flags 创建的 VkImage,如果由于该命令被采样,则必须仅使用 VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGEVkSamplerAddressMode 进行采样。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • VUID-vkCmdDispatchBase-None-08605
    如果描述符与使用 VkDescriptorSetLayout (该 VkDescriptorSetLayout 是使用 VK_DESCRIPTOR_SET_LAYOUT_CREATE_DESCRIPTOR_BUFFER_BIT_EXT 创建的) 创建的 VkShaderEXT 动态使用,则描述符内存必须常驻。

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

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

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

  • VUID-vkCmdDispatchBase-uniformBuffers-06935
    如果绑定到此命令使用的管线绑定点的VkPipeline对象的任何阶段访问了uniform缓冲区,并且该阶段的创建未启用VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESSVK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS_2中的任何一个用于uniformBuffers,并且未启用robustBufferAccess特性,则该阶段必须不访问超出绑定到同一管线绑定点的描述符集中指定的缓冲区范围之外的值。

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

  • VUID-vkCmdDispatchBase-storageBuffers-06936
    如果绑定到此命令使用的管线绑定点的VkPipeline对象的任何阶段访问了存储缓冲区,并且该阶段的创建未启用VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESSVK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS_2中的任何一个用于storageBuffers,并且未启用robustBufferAccess特性,则该阶段必须不访问超出绑定到同一管线绑定点的描述符集中指定的缓冲区范围之外的值。

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

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

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

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

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

  • VUID-vkCmdDispatchBase-format-07753
    如果作为此命令的结果访问了VkImageView,则图像视图的format数字类型OpTypeImageSampled Type操作数必须匹配。

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

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

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

  • VUID-vkCmdDispatchBase-SampledType-04470
    如果作为此命令的结果访问了VkImageView,其VkFormat具有64位分量宽度,则该指令的OpTypeImage操作数的SampledType必须具有64的Width

  • VUID-vkCmdDispatchBase-SampledType-04471
    如果作为此命令的结果访问了VkImageView,其VkFormat具有小于64位的分量宽度,则该指令的OpTypeImage操作数的SampledType必须具有32的Width

  • VUID-vkCmdDispatchBase-SampledType-04472
    如果作为此命令的结果访问了VkBufferView,其VkFormat具有64位分量宽度,则该指令的OpTypeImage操作数的SampledType必须具有64的Width

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

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

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

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

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

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

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

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

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

  • VUID-vkCmdDispatchBase-OpImageWeightedSampleQCOM-06977
    如果 OpImageWeightedSampleQCOMOpImageBoxFilterQCOMOpImageBlockMatchWindowSSDQCOMOpImageBlockMatchWindowSADQCOMOpImageBlockMatchGatherSSDQCOMOpImageBlockMatchGatherSADQCOMOpImageBlockMatchSSDQCOMOpImageBlockMatchSADQCOM 使用 VkSampler,则该采样器必须使用 VK_SAMPLER_CREATE_IMAGE_PROCESSING_BIT_QCOM 创建。

  • VUID-vkCmdDispatchBase-OpImageWeightedSampleQCOM-06978
    如果除 OpImageWeightedSampleQCOMOpImageBoxFilterQCOMOpImageBlockMatchWindowSSDQCOMOpImageBlockMatchWindowSADQCOMOpImageBlockMatchGatherSSDQCOMOpImageBlockMatchGatherSADQCOMOpImageBlockMatchSSDQCOMOpImageBlockMatchSADQCOM 之外的任何命令使用 VkSampler,则该采样器必须没有使用 VK_SAMPLER_CREATE_IMAGE_PROCESSING_BIT_QCOM 创建。

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

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

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

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

  • VUID-vkCmdDispatchBase-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-vkCmdDispatchBase-commandBuffer-02712
    如果 commandBuffer 是受保护的命令缓冲区,并且不支持protectedNoFault,则此命令使用的管线绑定点绑定的 VkPipeline 对象写入的任何资源必须不是未受保护的资源。

  • VUID-vkCmdDispatchBase-commandBuffer-02713
    如果 commandBuffer 是一个受保护的命令缓冲区,并且不支持 protectedNoFault,则绑定到此命令所用管线绑定点的 VkPipeline 对象中,除了帧缓冲区空间和计算阶段之外的管线阶段 必须 不能写入任何资源。

  • VUID-vkCmdDispatchBase-commandBuffer-04617
    如果绑定到此命令所用管线绑定点的 VkPipeline 的任何着色器阶段使用了 RayQueryKHR 功能,则 commandBuffer 必须 不是受保护的命令缓冲区。

  • VUID-vkCmdDispatchBase-baseGroupX-00421
    baseGroupX 必须小于 VkPhysicalDeviceLimits::maxComputeWorkGroupCount[0]

  • VUID-vkCmdDispatchBase-baseGroupX-00422
    baseGroupY 必须小于 VkPhysicalDeviceLimits::maxComputeWorkGroupCount[1]

  • VUID-vkCmdDispatchBase-baseGroupZ-00423
    baseGroupZ 必须小于 VkPhysicalDeviceLimits::maxComputeWorkGroupCount[2]

  • VUID-vkCmdDispatchBase-groupCountX-00424
    groupCountX 必须小于或等于 VkPhysicalDeviceLimits::maxComputeWorkGroupCount[0] 减去 baseGroupX

  • VUID-vkCmdDispatchBase-groupCountY-00425
    groupCountY 必须小于或等于 VkPhysicalDeviceLimits::maxComputeWorkGroupCount[1] 减去 baseGroupY

  • VUID-vkCmdDispatchBase-groupCountZ-00426
    groupCountZ 必须小于或等于 VkPhysicalDeviceLimits::maxComputeWorkGroupCount[2] 减去 baseGroupZ

  • VUID-vkCmdDispatchBase-baseGroupX-00427
    如果 baseGroupXbaseGroupYbaseGroupZ 中的任何一个不为零,则绑定的计算管线必须已使用 VK_PIPELINE_CREATE_DISPATCH_BASE 标志创建,或者绑定的计算着色器对象必须已使用 VK_SHADER_CREATE_DISPATCH_BASE_BIT_EXT 标志创建

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

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

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

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

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

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

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

子通道着色使用调用子通道的渲染区域的工作维度和指定的工作组大小对工作组进行分区来分派计算管线工作。允许使用诸如 subpassLoad 之类的子通道操作。

要记录子通道着色,请调用

// Provided by VK_HUAWEI_subpass_shading
void vkCmdSubpassShadingHUAWEI(
    VkCommandBuffer                             commandBuffer);
c++
  • commandBuffer 是要将命令记录到的命令缓冲区。

当命令执行时,将组装一个由 ceil (渲染区域大小 / 本地工作组大小) 本地工作组组成的全局工作组。

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

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

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

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

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

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

  • VUID-vkCmdSubpassShadingHUAWEI-None-08610
    如果使用一个 unnormalizedCoordinates 等于 VK_TRUE 创建的 VkSampler 来采样一个 VkImageView,那么该采样器必须不能用于任何名称中包含 ImplicitLodDrefProj 的 SPIR-V OpImageSample*OpImageSparseSample* 指令。

  • VUID-vkCmdSubpassShadingHUAWEI-None-08611
    如果使用一个 unnormalizedCoordinates 等于 VK_TRUE 创建的 VkSampler 来采样一个 VkImageView,那么该采样器必须不能用于任何包含 LOD 偏差或任何偏移值的 SPIR-V OpImageSample*OpImageSparseSample* 指令。

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

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

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

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

  • VUID-vkCmdSubpassShadingHUAWEI-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-vkCmdSubpassShadingHUAWEI-filterCubic-02694
    任何由于该命令而使用 VK_FILTER_CUBIC_EXT 采样的 VkImageView 必须具有一个 VkImageViewType 和格式,该格式支持立方滤波,如 VkFilterCubicImageViewImageFormatPropertiesEXT::filterCubic 中指定,该值由 vkGetPhysicalDeviceImageFormatProperties2 返回。

  • VUID-vkCmdSubpassShadingHUAWEI-filterCubicMinmax-02695
    任何由于该命令而使用 VK_FILTER_CUBIC_EXT 且缩减模式为 VK_SAMPLER_REDUCTION_MODE_MINVK_SAMPLER_REDUCTION_MODE_MAX 进行采样的 VkImageView 必须具有一个 VkImageViewType 和格式,该格式支持立方滤波以及最小/最大滤波,如 VkFilterCubicImageViewImageFormatPropertiesEXT::filterCubicMinmax 中指定,该值由 vkGetPhysicalDeviceImageFormatProperties2 返回。

  • VUID-vkCmdSubpassShadingHUAWEI-cubicRangeClamp-09212
    如果未启用 cubicRangeClamp 功能,则由于该命令而使用 VK_FILTER_CUBIC_EXT 采样的任何 VkImageView 必须不具有等于 VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE_RANGECLAMP_QCOMVkSamplerReductionModeCreateInfo::reductionMode

  • VUID-vkCmdSubpassShadingHUAWEI-reductionMode-09213
    任何由于此命令而使用等于 VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE_RANGECLAMP_QCOMVkSamplerReductionModeCreateInfo::reductionMode 采样的 VkImageView 必须使用 VK_FILTER_CUBIC_EXT 进行采样。

  • VUID-vkCmdSubpassShadingHUAWEI-selectableCubicWeights-09214
    如果未启用 selectableCubicWeights 功能,则由于此命令而使用 VK_FILTER_CUBIC_EXT 采样的任何 VkImageView 必须使 VkSamplerCubicWeightsCreateInfoQCOM::cubicWeights 等于 VK_CUBIC_FILTER_WEIGHTS_CATMULL_ROM_QCOM

  • VUID-vkCmdSubpassShadingHUAWEI-flags-02696
    任何使用包含 VK_IMAGE_CREATE_CORNER_SAMPLED_BIT_NVVkImageCreateInfo::flags 创建的 VkImage,如果由于该命令被采样,则必须仅使用 VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGEVkSamplerAddressMode 进行采样。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • VUID-vkCmdSubpassShadingHUAWEI-None-08605
    如果描述符与使用 VkDescriptorSetLayout (该 VkDescriptorSetLayout 是使用 VK_DESCRIPTOR_SET_LAYOUT_CREATE_DESCRIPTOR_BUFFER_BIT_EXT 创建的) 创建的 VkShaderEXT 动态使用,则描述符内存必须常驻。

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

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

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

  • VUID-vkCmdSubpassShadingHUAWEI-uniformBuffers-06935
    如果绑定到此命令使用的管线绑定点的VkPipeline对象的任何阶段访问了uniform缓冲区,并且该阶段的创建未启用VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESSVK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS_2中的任何一个用于uniformBuffers,并且未启用robustBufferAccess特性,则该阶段必须不访问超出绑定到同一管线绑定点的描述符集中指定的缓冲区范围之外的值。

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

  • VUID-vkCmdSubpassShadingHUAWEI-storageBuffers-06936
    如果绑定到此命令使用的管线绑定点的VkPipeline对象的任何阶段访问了存储缓冲区,并且该阶段的创建未启用VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESSVK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS_2中的任何一个用于storageBuffers,并且未启用robustBufferAccess特性,则该阶段必须不访问超出绑定到同一管线绑定点的描述符集中指定的缓冲区范围之外的值。

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

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

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

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

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

  • VUID-vkCmdSubpassShadingHUAWEI-format-07753
    如果作为此命令的结果访问了VkImageView,则图像视图的format数字类型OpTypeImageSampled Type操作数必须匹配。

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

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

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

  • VUID-vkCmdSubpassShadingHUAWEI-SampledType-04470
    如果作为此命令的结果访问了VkImageView,其VkFormat具有64位分量宽度,则该指令的OpTypeImage操作数的SampledType必须具有64的Width

  • VUID-vkCmdSubpassShadingHUAWEI-SampledType-04471
    如果作为此命令的结果访问了VkImageView,其VkFormat具有小于64位的分量宽度,则该指令的OpTypeImage操作数的SampledType必须具有32的Width

  • VUID-vkCmdSubpassShadingHUAWEI-SampledType-04472
    如果作为此命令的结果访问了VkBufferView,其VkFormat具有64位分量宽度,则该指令的OpTypeImage操作数的SampledType必须具有64的Width

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

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

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

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

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

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

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

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

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

  • VUID-vkCmdSubpassShadingHUAWEI-OpImageWeightedSampleQCOM-06977
    如果 OpImageWeightedSampleQCOMOpImageBoxFilterQCOMOpImageBlockMatchWindowSSDQCOMOpImageBlockMatchWindowSADQCOMOpImageBlockMatchGatherSSDQCOMOpImageBlockMatchGatherSADQCOMOpImageBlockMatchSSDQCOMOpImageBlockMatchSADQCOM 使用 VkSampler,则该采样器必须使用 VK_SAMPLER_CREATE_IMAGE_PROCESSING_BIT_QCOM 创建。

  • VUID-vkCmdSubpassShadingHUAWEI-OpImageWeightedSampleQCOM-06978
    如果除 OpImageWeightedSampleQCOMOpImageBoxFilterQCOMOpImageBlockMatchWindowSSDQCOMOpImageBlockMatchWindowSADQCOMOpImageBlockMatchGatherSSDQCOMOpImageBlockMatchGatherSADQCOMOpImageBlockMatchSSDQCOMOpImageBlockMatchSADQCOM 之外的任何命令使用 VkSampler,则该采样器必须没有使用 VK_SAMPLER_CREATE_IMAGE_PROCESSING_BIT_QCOM 创建。

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

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

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

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

  • VUID-vkCmdSubpassShadingHUAWEI-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-vkCmdSubpassShadingHUAWEI-None-04931
    此命令必须在绑定点为 VK_PIPELINE_BIND_POINT_SUBPASS_SHADING_HUAWEI 的子通道中调用。同一个子通道中不能调用任何绘制命令。一个子通道中只能调用一个 vkCmdSubpassShadingHUAWEI 命令。

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

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

  • VUID-vkCmdSubpassShadingHUAWEI-commandBuffer-cmdpool
    分配 commandBufferVkCommandPool 必须支持图形操作。

  • VUID-vkCmdSubpassShadingHUAWEI-renderpass
    此命令必须仅在渲染通道实例内部调用。

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

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

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

CUDA PTX 内核的调度命令

计算内核可以使用 SPIR-V 或 PTX 代码提供。当使用 PTX 内核时,调度机制与常规计算管线不同。

创建 PTX 汇编文件的方法不在本文档的讨论范围之内。有关更多信息,请参阅 CUDA 工具包文档 https://docs.nvda.net.cn/cuda/

在使用此命令之前,你必须初始化一个 CUDA 模块,并创建一个函数句柄,该句柄将用作要调度的内核的入口点。请参阅CUDA 模块

CUDA 内核的调度被记录到命令缓冲区中,并且当通过队列提交执行时,将产生根据绑定的计算管线执行的工作。

要记录 CUDA 内核的启动,请调用

// Provided by VK_NV_cuda_kernel_launch
void vkCmdCudaLaunchKernelNV(
    VkCommandBuffer                             commandBuffer,
    const VkCudaLaunchInfoNV*                   pLaunchInfo);
c++
  • commandBuffer 是要将命令记录到的命令缓冲区。

  • pLaunchInfo 是一个指向 VkCudaLaunchInfoNV 结构的指针,其中定义了网格(类似于工作组)维度、函数句柄和相关参数。

当命令执行时,会组装一个由 gridDimX × gridDimY × gridDimZ 个局部工作组组成的全局工作组。

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

  • VUID-vkCmdCudaLaunchKernelNV-pLaunchInfo-parameter
    pLaunchInfo 必须是一个指向有效 VkCudaLaunchInfoNV 结构的有效指针

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

  • VUID-vkCmdCudaLaunchKernelNV-commandBuffer-cmdpool
    分配 commandBufferVkCommandPool 必须支持图形或计算操作

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

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

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


两者都需要

外部

图形
计算

操作

传递调度参数和参数

VkCudaLaunchInfoNV 结构非常接近 CUDA 驱动程序函数 cuLaunchKernel 的参数,该函数在 CUDA 驱动程序 API 的 6.19 执行控制部分中有记录。

该结构的定义如下:

// Provided by VK_NV_cuda_kernel_launch
typedef struct VkCudaLaunchInfoNV {
    VkStructureType        sType;
    const void*            pNext;
    VkCudaFunctionNV       function;
    uint32_t               gridDimX;
    uint32_t               gridDimY;
    uint32_t               gridDimZ;
    uint32_t               blockDimX;
    uint32_t               blockDimY;
    uint32_t               blockDimZ;
    uint32_t               sharedMemBytes;
    size_t                 paramCount;
    const void* const *    pParams;
    size_t                 extraCount;
    const void* const *    pExtras;
} VkCudaLaunchInfoNV;
c++
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • function 是要启动的函数的 CUDA 驱动程序句柄。

  • gridDimX 是在 X 维度中要调度的局部工作组的数量。它必须小于或等于 VkPhysicalDeviceLimits::maxComputeWorkGroupCount[0]

  • gridDimY 是在 Y 维度中要调度的局部工作组的数量。它必须小于或等于 VkPhysicalDeviceLimits::maxComputeWorkGroupCount[1]

  • gridDimZ 是在 Z 维度中要调度的局部工作组的数量。它必须小于或等于 VkPhysicalDeviceLimits::maxComputeWorkGroupCount[2]

  • blockDimX 是 X 维度中的块大小。

  • blockDimY 是 Y 维度中的块大小。

  • blockDimZ 是 Z 维度中的块大小。

  • sharedMemBytes 是每个线程块的动态共享内存大小(以字节为单位)。

  • paramCountpParams 表的长度。

  • pParams 是指向 paramCount 个指针的数组的指针,这些指针对应于 function 的参数。

  • extraCount 保留供将来使用。

  • pExtras 保留供将来使用。

function 的内核参数通过 pParams 指定,这与 cuLaunchKernel 中描述的方式非常相似。

如果 function 有 N 个参数,则 pParams 必须是一个包含 N 个指针的数组,并且 paramCount 必须为 N。 kernelParams[0] 到 kernelParams[N-1] 中的每一个必须指向一个内存区域,实际的内核参数将从该区域复制。内核参数的数量及其偏移量和大小在此处未指定,因为该信息存储在 VkCudaFunctionNV 对象中。

pParamskernelParams[0] 到 kernelParams[N-1] 指向的应用程序拥有的内存会被立即消耗,并且在 vkCmdCudaLaunchKernelNV 返回后可以被更改或释放。

有效使用
  • VUID-VkCudaLaunchInfoNV-gridDimX-09406
    gridDimX 必须小于或等于 VkPhysicalDeviceLimits::maxComputeWorkGroupCount[0]

  • VUID-VkCudaLaunchInfoNV-gridDimY-09407
    gridDimY 必须小于或等于 VkPhysicalDeviceLimits::maxComputeWorkGroupCount[1]

  • VUID-VkCudaLaunchInfoNV-gridDimZ-09408
    gridDimZ 必须小于或等于 VkPhysicalDeviceLimits::maxComputeWorkGroupCount[2]

  • VUID-VkCudaLaunchInfoNV-paramCount-09409
    paramCount 必须pParams 表中列出的参数总数

  • VUID-VkCudaLaunchInfoNV-pParams-09410
    pParams 必须是指向 paramCount 个参数的表的指针,这些参数对应于 function 的参数

  • VUID-VkCudaLaunchInfoNV-extraCount-09411
    extraCount 必须为 0

  • VUID-VkCudaLaunchInfoNV-pExtras-09412
    pExtras 必须为 NULL

有效使用 (隐式)
  • VUID-VkCudaLaunchInfoNV-sType-sType
    sType 必须VK_STRUCTURE_TYPE_CUDA_LAUNCH_INFO_NV

  • VUID-VkCudaLaunchInfoNV-pNext-pNext
    pNext 必须NULL

  • VUID-VkCudaLaunchInfoNV-function-parameter
    function 必须是有效的 VkCudaFunctionNV 句柄

从 Vulkan 到 CUDA 内核的资源共享

鉴于此扩展的一个主要限制是 Vulkan 无法访问或绑定 CUDA 模块的任何全局资源,因此与内核交换数据的唯一方法必须通过函数的参数传递资源

你可以使用 VK_KHR_buffer_device_address 来读/写 VkBuffer 对象。 VK_KHR_buffer_device_address 允许你获取缓冲区的设备地址,并将其作为参数传递到 pParams 中。应用程序端对设备地址进行指针算术是合法的,但不会在设备上进行边界检查。

CUDA 函数的相应参数应该声明为与引用的缓冲区类型相同的指针。 CUDA 代码可以简单地以典型的 C 方式读取或写入此缓冲区。

可以使用 VK_NVX_image_view_handle 作为另一种方便的方式来读取/写入 VkImage

CUDA 函数的相应参数必须键入为 cudaSurfaceObject_t

  • 你可以通过使用 CUDA surface 读取函数(例如 surf3Dreadsurf2Dreadsurf1Dread)从中读取。

  • 你可以通过使用 CUDA surface 写入函数(例如 surf3Dwritesurf2Dwritesurf1Dwrite)写入其中。

有关更多详细信息,请参阅 CUDA surface object 文档

在 Vulkan 端,以下是如何设置 VkImageViewHandleInfoNVX 来查询 cudaSurfaceObject_t 的句柄的示例

VkImageViewHandleInfoNVX imageViewHandleInfo = {VK_STRUCTURE_TYPE_IMAGE_VIEW_HANDLE_INFO_NVX};
imageViewHandleInfo.sampler = VK_NULL_HANDLE;
imageViewHandleInfo.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
imageViewHandleInfo.imageView = imageViewIn; // the VkImageView we want to access
uint32_t myViewHandleIn = vkGetImageViewHandleNVX(m_device, &imageViewHandleInfo);
imageViewHandleInfo.imageView = imageViewOut; // the VkImageView we want to access
uint32_t myViewHandleOut = vkGetImageViewHandleNVX(m_device, &imageViewHandleInfo);
c++

以下是如何为 pParams 声明参数的示例

VkCudaLaunchInfoNV launchInfo = { VK_STRUCTURE_TYPE_CUDA_LAUNCH_INFO_NV };

int block_size = 8;
float dt = 1.0f / 60.0f;

const void* params[] =
{
  &dt,
  &uint32_t myViewHandleIn,
  &uint32_t myViewHandleOut
};

launchInfo.function = cudaFunction; // CUDA function previously created
launchInfo.gridDimX = (volumeTexDimensionNonBoundary / block_size);
launchInfo.gridDimY = (volumeTexDimensionNonBoundary / block_size);
launchInfo.gridDimZ = (volumeTexDimensionNonBoundary / block_size);
launchInfo.blockDimX = block_size;
launchInfo.blockDimY = block_size;
launchInfo.blockDimZ = block_size;
launchInfo.sharedMemBytes = 0;
launchInfo.paramCount = 3;
launchInfo.pParams = &params[0];
launchInfo.extraCount = 0;
launchInfo.pExtras = nullptr;

vkCmdCudaLaunchKernelNV(commandBuffer, &launchInfo);
c++

在 CUDA 内核源代码中,以下是如何匹配 pParams 参数以及如何使用 Surface 对象的示例

extern "C"  __global__ void cudaFunction(
  float dt,
  cudaSurfaceObject_t volumeTexIn,
  cudaSurfaceObject_t volumeTexOut
  )
{
  int i = 1 + blockIdx.x * blockDim.x + threadIdx.x;
  int j = 1 + blockIdx.y * blockDim.y + threadIdx.y;
  int k = 1 + blockIdx.z * blockDim.z + threadIdx.z;

  float val;
  surf3Dread(&val, volumeTexIn, i * sizeof(float), j, k);
  ...
  float result = ...;
  // write result
  surf3Dwrite(result, volumeTexOut, i * sizeof(float), j, k);
}
c++