分派命令
本章描述的分派命令会在计算管线中触发工作。分派命令会被记录到命令缓冲区中,当由队列执行时,会根据绑定的计算管线产生工作。在将任何分派命令记录到命令缓冲区之前,必须将计算管线绑定到该命令缓冲区。
要记录分派,请调用
// Provided by VK_VERSION_1_0
void vkCmdDispatch(
VkCommandBuffer commandBuffer,
uint32_t groupCountX,
uint32_t groupCountY,
uint32_t groupCountZ);
-
commandBuffer
是要将命令记录到的命令缓冲区。 -
groupCountX
是要在 X 维度中分派的本地工作组的数量。 -
groupCountY
是要在 Y 维度中分派的本地工作组的数量。 -
groupCountZ
是要在 Z 维度中分派的本地工作组的数量。
当命令执行时,会组装一个由 groupCountX
× groupCountY
× groupCountZ
个本地工作组组成的全局工作组。
-
VUID-vkCmdDispatch-magFilter-04553
如果使用以magFilter
或minFilter
等于VK_FILTER_LINEAR
、reductionMode
等于VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE
且compareEnable
等于VK_FALSE
创建的 VkSampler 来采样作为此命令结果的 VkImageView,则图像视图的格式特性 必须包含VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT
-
VUID-vkCmdDispatch-magFilter-09598
如果使用以magFilter
或minFilter
等于VK_FILTER_LINEAR
且reductionMode
等于VK_SAMPLER_REDUCTION_MODE_MIN
或VK_SAMPLER_REDUCTION_MODE_MAX
创建的 VkSampler 来采样作为此命令结果的 VkImageView,则图像视图的格式特性 必须包含VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_MINMAX_BIT
-
VUID-vkCmdDispatch-mipmapMode-04770
如果使用以mipmapMode
等于VK_SAMPLER_MIPMAP_MODE_LINEAR
、reductionMode
等于VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE
且compareEnable
等于VK_FALSE
创建的 VkSampler 来采样作为此命令结果的 VkImageView,则图像视图的格式特性 必须包含VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT
-
VUID-vkCmdDispatch-mipmapMode-09599
如果使用以mipmapMode
等于VK_SAMPLER_MIPMAP_MODE_LINEAR
且reductionMode
等于VK_SAMPLER_REDUCTION_MODE_MIN
或VK_SAMPLER_REDUCTION_MODE_MAX
创建的 VkSampler 来采样作为此命令结果的 VkImageView,则图像视图的格式特性 必须包含VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_MINMAX_BIT
-
VUID-vkCmdDispatch-unnormalizedCoordinates-09635
如果使用以unnormalizedCoordinates
等于VK_TRUE
创建的 VkSampler 来采样作为此命令结果的 VkImageView,则图像视图的levelCount
和layerCount
必须为 1 -
VUID-vkCmdDispatch-None-08609
如果使用以unnormalizedCoordinates
等于VK_TRUE
创建的 VkSampler 来采样作为此命令结果的 VkImageView,则图像视图的viewType
必须为VK_IMAGE_VIEW_TYPE_1D
或VK_IMAGE_VIEW_TYPE_2D
-
VUID-vkCmdDispatch-None-08610
如果使用一个unnormalizedCoordinates
等于VK_TRUE
创建的 VkSampler 来采样一个 VkImageView,那么该采样器必须不能用于任何名称中包含ImplicitLod
、Dref
或Proj
的 SPIR-VOpImageSample*
或OpImageSparseSample*
指令。 -
VUID-vkCmdDispatch-None-08611
如果使用一个unnormalizedCoordinates
等于VK_TRUE
创建的 VkSampler 来采样一个 VkImageView,那么该采样器必须不能用于任何包含 LOD 偏差或任何偏移值的 SPIR-VOpImageSample*
或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_3D
、VK_IMAGE_VIEW_TYPE_CUBE
或VK_IMAGE_VIEW_TYPE_CUBE_ARRAY
的 VkImageViewType。 -
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_MIN
或VK_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_QCOM
的 VkSamplerReductionModeCreateInfo::reductionMode
。 -
VUID-vkCmdDispatch-reductionMode-09213
任何由于此命令而使用等于VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE_RANGECLAMP_QCOM
的 VkSamplerReductionModeCreateInfo::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_NV
的 VkImageCreateInfo::flags
创建的 VkImage,如果由于该命令被采样,则必须仅使用VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE
的 VkSamplerAddressMode 进行采样。 -
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 使用的 VkDescriptorSetLayout 和 VkPushConstantRange 数组兼容,如管线布局兼容性中所述。 -
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_ACCESS
或VK_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_ACCESS
或VK_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转换的VkSampler或VkImageView对象,则该对象必须仅与OpImageSample*
或OpImageSparseSample*
指令一起使用。 -
VUID-vkCmdDispatch-ConstOffset-06551
如果绑定的着色器访问了启用采样器Y′CBCR转换的VkSampler或VkImageView对象,则该对象必须不使用ConstOffset
和Offset
操作数。 -
VUID-vkCmdDispatch-viewType-07752
如果作为此命令的结果访问了VkImageView,则图像视图的viewType
必须与SPIR-V图像维度和Vulkan ImageView类型之间的兼容性中所述的OpTypeImage
的Dim
操作数匹配。 -
VUID-vkCmdDispatch-format-07753
如果作为此命令的结果访问了VkImageView,则图像视图的format
的数字类型与OpTypeImage
的Sampled
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
如果此命令访问的 VkBufferView 的 VkFormat 的组件宽度小于 64 位,则该指令的OpTypeImage
操作数的SampledType
的Width
必须为 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
如果使用OpImageWeightedSampleQCOM
对 VkImageView 进行采样,则图像视图的格式特性必须包含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
如果使用OpImageBoxFilterQCOM
对 VkImageView 进行采样,则图像视图的格式特性必须包含VK_FORMAT_FEATURE_2_BOX_FILTER_SAMPLED_BIT_QCOM
。 -
VUID-vkCmdDispatch-OpImageBlockMatchSSDQCOM-06974
如果使用OpImageBlockMatchSSDQCOM
从 VkImageView 中读取数据,则图像视图的格式特性必须包含VK_FORMAT_FEATURE_2_BLOCK_MATCHING_BIT_QCOM
。 -
VUID-vkCmdDispatch-OpImageBlockMatchSADQCOM-06975
如果使用OpImageBlockMatchSADQCOM
从 VkImageView 中读取数据,则图像视图的格式特性必须包含VK_FORMAT_FEATURE_2_BLOCK_MATCHING_BIT_QCOM
。 -
VUID-vkCmdDispatch-OpImageBlockMatchSADQCOM-06976
如果使用OpImageBlockMatchSADQCOM
或 OpImageBlockMatchSSDQCOM 从参考图像读取数据,则指定的参考坐标必须通过整数纹素坐标验证。 -
VUID-vkCmdDispatch-OpImageWeightedSampleQCOM-06977
如果OpImageWeightedSampleQCOM
、OpImageBoxFilterQCOM
、OpImageBlockMatchWindowSSDQCOM
、OpImageBlockMatchWindowSADQCOM
、OpImageBlockMatchGatherSSDQCOM
、OpImageBlockMatchGatherSADQCOM
、OpImageBlockMatchSSDQCOM
或OpImageBlockMatchSADQCOM
使用 VkSampler,则该采样器必须使用VK_SAMPLER_CREATE_IMAGE_PROCESSING_BIT_QCOM
创建。 -
VUID-vkCmdDispatch-OpImageWeightedSampleQCOM-06978
如果除OpImageWeightedSampleQCOM
、OpImageBoxFilterQCOM
、OpImageBlockMatchWindowSSDQCOM
、OpImageBlockMatchWindowSADQCOM
、OpImageBlockMatchGatherSSDQCOM
、OpImageBlockMatchGatherSADQCOM
、OpImageBlockMatchSSDQCOM
或OpImageBlockMatchSADQCOM
之外的任何命令使用 VkSampler,则该采样器必须没有使用VK_SAMPLER_CREATE_IMAGE_PROCESSING_BIT_QCOM
创建。 -
VUID-vkCmdDispatch-OpImageBlockMatchWindow-09215
如果使用OpImageBlockMatchWindow*QCOM
或OpImageBlockMatchGather*QCOM
指令从 VkImageView 读取数据,则图像视图的格式特性必须包含VK_FORMAT_FEATURE_2_BLOCK_MATCHING_BIT_QCOM
。 -
VUID-vkCmdDispatch-OpImageBlockMatchWindow-09216
如果使用OpImageBlockMatchWindow*QCOM
或OpImageBlockMatchGather*QCOM
指令从 VkImageView 读取数据,则图像视图的格式必须是单分量格式。 -
VUID-vkCmdDispatch-OpImageBlockMatchWindow-09217
如果OpImageBlockMatchWindow*QCOM
或OpImageBlockMatchGather*QCOM
从参考图像读取数据,则指定的参考坐标必须通过整数纹素坐标验证。 -
VUID-vkCmdDispatch-None-07288
此命令执行的任何着色器调用必须终止。 -
VUID-vkCmdDispatch-None-09600
如果此命令访问的描述符的类型等于VK_DESCRIPTOR_TYPE_SAMPLE_WEIGHT_IMAGE_QCOM
、VK_DESCRIPTOR_TYPE_BLOCK_MATCH_IMAGE_QCOM
、VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE
、VK_DESCRIPTOR_TYPE_STORAGE_IMAGE
或VK_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
分配commandBuffer
的VkCommandPool
必须 支持计算操作。
-
对
commandBuffer
的主机访问 必须 进行外部同步。 -
对分配
commandBuffer
的VkCommandPool
的主机访问 必须 进行外部同步。
要记录间接分派命令,请调用
// Provided by VK_VERSION_1_0
void vkCmdDispatchIndirect(
VkCommandBuffer commandBuffer,
VkBuffer buffer,
VkDeviceSize offset);
-
commandBuffer
是要将命令记录到的命令缓冲区。 -
buffer
是包含分派参数的缓冲区。 -
offset
是buffer
中参数开始处的字节偏移量。
vkCmdDispatchIndirect
的行为类似于 vkCmdDispatch,不同之处在于参数是在执行期间由设备从缓冲区读取的。分派的参数编码在 VkDispatchIndirectCommand 结构中,该结构从 buffer
的 offset
开始获取。
-
VUID-vkCmdDispatchIndirect-magFilter-04553
如果使用以magFilter
或minFilter
等于VK_FILTER_LINEAR
、reductionMode
等于VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE
且compareEnable
等于VK_FALSE
创建的 VkSampler 来采样作为此命令结果的 VkImageView,则图像视图的格式特性 必须包含VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT
-
VUID-vkCmdDispatchIndirect-magFilter-09598
如果使用以magFilter
或minFilter
等于VK_FILTER_LINEAR
且reductionMode
等于VK_SAMPLER_REDUCTION_MODE_MIN
或VK_SAMPLER_REDUCTION_MODE_MAX
创建的 VkSampler 来采样作为此命令结果的 VkImageView,则图像视图的格式特性 必须包含VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_MINMAX_BIT
-
VUID-vkCmdDispatchIndirect-mipmapMode-04770
如果使用以mipmapMode
等于VK_SAMPLER_MIPMAP_MODE_LINEAR
、reductionMode
等于VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE
且compareEnable
等于VK_FALSE
创建的 VkSampler 来采样作为此命令结果的 VkImageView,则图像视图的格式特性 必须包含VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT
-
VUID-vkCmdDispatchIndirect-mipmapMode-09599
如果使用以mipmapMode
等于VK_SAMPLER_MIPMAP_MODE_LINEAR
且reductionMode
等于VK_SAMPLER_REDUCTION_MODE_MIN
或VK_SAMPLER_REDUCTION_MODE_MAX
创建的 VkSampler 来采样作为此命令结果的 VkImageView,则图像视图的格式特性 必须包含VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_MINMAX_BIT
-
VUID-vkCmdDispatchIndirect-unnormalizedCoordinates-09635
如果使用以unnormalizedCoordinates
等于VK_TRUE
创建的 VkSampler 来采样作为此命令结果的 VkImageView,则图像视图的levelCount
和layerCount
必须为 1 -
VUID-vkCmdDispatchIndirect-None-08609
如果使用以unnormalizedCoordinates
等于VK_TRUE
创建的 VkSampler 来采样作为此命令结果的 VkImageView,则图像视图的viewType
必须为VK_IMAGE_VIEW_TYPE_1D
或VK_IMAGE_VIEW_TYPE_2D
-
VUID-vkCmdDispatchIndirect-None-08610
如果使用一个unnormalizedCoordinates
等于VK_TRUE
创建的 VkSampler 来采样一个 VkImageView,那么该采样器必须不能用于任何名称中包含ImplicitLod
、Dref
或Proj
的 SPIR-VOpImageSample*
或OpImageSparseSample*
指令。 -
VUID-vkCmdDispatchIndirect-None-08611
如果使用一个unnormalizedCoordinates
等于VK_TRUE
创建的 VkSampler 来采样一个 VkImageView,那么该采样器必须不能用于任何包含 LOD 偏差或任何偏移值的 SPIR-VOpImageSample*
或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_3D
、VK_IMAGE_VIEW_TYPE_CUBE
或VK_IMAGE_VIEW_TYPE_CUBE_ARRAY
的 VkImageViewType。 -
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_MIN
或VK_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_QCOM
的 VkSamplerReductionModeCreateInfo::reductionMode
。 -
VUID-vkCmdDispatchIndirect-reductionMode-09213
任何由于此命令而使用等于VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE_RANGECLAMP_QCOM
的 VkSamplerReductionModeCreateInfo::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_NV
的 VkImageCreateInfo::flags
创建的 VkImage,如果由于该命令被采样,则必须仅使用VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE
的 VkSamplerAddressMode 进行采样。 -
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 使用的 VkDescriptorSetLayout 和 VkPushConstantRange 数组兼容,如管线布局兼容性中所述。 -
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_ACCESS
或VK_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_ACCESS
或VK_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转换的VkSampler或VkImageView对象,则该对象必须仅与OpImageSample*
或OpImageSparseSample*
指令一起使用。 -
VUID-vkCmdDispatchIndirect-ConstOffset-06551
如果绑定的着色器访问了启用采样器Y′CBCR转换的VkSampler或VkImageView对象,则该对象必须不使用ConstOffset
和Offset
操作数。 -
VUID-vkCmdDispatchIndirect-viewType-07752
如果作为此命令的结果访问了VkImageView,则图像视图的viewType
必须与SPIR-V图像维度和Vulkan ImageView类型之间的兼容性中所述的OpTypeImage
的Dim
操作数匹配。 -
VUID-vkCmdDispatchIndirect-format-07753
如果作为此命令的结果访问了VkImageView,则图像视图的format
的数字类型与OpTypeImage
的Sampled
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
如果此命令访问的 VkBufferView 的 VkFormat 的组件宽度小于 64 位,则该指令的OpTypeImage
操作数的SampledType
的Width
必须为 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
如果使用OpImageWeightedSampleQCOM
对 VkImageView 进行采样,则图像视图的格式特性必须包含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
如果使用OpImageBoxFilterQCOM
对 VkImageView 进行采样,则图像视图的格式特性必须包含VK_FORMAT_FEATURE_2_BOX_FILTER_SAMPLED_BIT_QCOM
。 -
VUID-vkCmdDispatchIndirect-OpImageBlockMatchSSDQCOM-06974
如果使用OpImageBlockMatchSSDQCOM
从 VkImageView 中读取数据,则图像视图的格式特性必须包含VK_FORMAT_FEATURE_2_BLOCK_MATCHING_BIT_QCOM
。 -
VUID-vkCmdDispatchIndirect-OpImageBlockMatchSADQCOM-06975
如果使用OpImageBlockMatchSADQCOM
从 VkImageView 中读取数据,则图像视图的格式特性必须包含VK_FORMAT_FEATURE_2_BLOCK_MATCHING_BIT_QCOM
。 -
VUID-vkCmdDispatchIndirect-OpImageBlockMatchSADQCOM-06976
如果使用OpImageBlockMatchSADQCOM
或 OpImageBlockMatchSSDQCOM 从参考图像读取数据,则指定的参考坐标必须通过整数纹素坐标验证。 -
VUID-vkCmdDispatchIndirect-OpImageWeightedSampleQCOM-06977
如果OpImageWeightedSampleQCOM
、OpImageBoxFilterQCOM
、OpImageBlockMatchWindowSSDQCOM
、OpImageBlockMatchWindowSADQCOM
、OpImageBlockMatchGatherSSDQCOM
、OpImageBlockMatchGatherSADQCOM
、OpImageBlockMatchSSDQCOM
或OpImageBlockMatchSADQCOM
使用 VkSampler,则该采样器必须使用VK_SAMPLER_CREATE_IMAGE_PROCESSING_BIT_QCOM
创建。 -
VUID-vkCmdDispatchIndirect-OpImageWeightedSampleQCOM-06978
如果除OpImageWeightedSampleQCOM
、OpImageBoxFilterQCOM
、OpImageBlockMatchWindowSSDQCOM
、OpImageBlockMatchWindowSADQCOM
、OpImageBlockMatchGatherSSDQCOM
、OpImageBlockMatchGatherSADQCOM
、OpImageBlockMatchSSDQCOM
或OpImageBlockMatchSADQCOM
之外的任何命令使用 VkSampler,则该采样器必须没有使用VK_SAMPLER_CREATE_IMAGE_PROCESSING_BIT_QCOM
创建。 -
VUID-vkCmdDispatchIndirect-OpImageBlockMatchWindow-09215
如果使用OpImageBlockMatchWindow*QCOM
或OpImageBlockMatchGather*QCOM
指令从 VkImageView 读取数据,则图像视图的格式特性必须包含VK_FORMAT_FEATURE_2_BLOCK_MATCHING_BIT_QCOM
。 -
VUID-vkCmdDispatchIndirect-OpImageBlockMatchWindow-09216
如果使用OpImageBlockMatchWindow*QCOM
或OpImageBlockMatchGather*QCOM
指令从 VkImageView 读取数据,则图像视图的格式必须是单分量格式。 -
VUID-vkCmdDispatchIndirect-OpImageBlockMatchWindow-09217
如果OpImageBlockMatchWindow*QCOM
或OpImageBlockMatchGather*QCOM
从参考图像读取数据,则指定的参考坐标必须通过整数纹素坐标验证。 -
VUID-vkCmdDispatchIndirect-None-07288
此命令执行的任何着色器调用必须终止。 -
VUID-vkCmdDispatchIndirect-None-09600
如果此命令访问的描述符的类型等于VK_DESCRIPTOR_TYPE_SAMPLE_WEIGHT_IMAGE_QCOM
、VK_DESCRIPTOR_TYPE_BLOCK_MATCH_IMAGE_QCOM
、VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE
、VK_DESCRIPTOR_TYPE_STORAGE_IMAGE
或VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT
中的任何一个,则该描述符标识的所有图像子资源必须处于写入该描述符时标识的图像布局中。
-
VUID-vkCmdDispatchIndirect-buffer-02708
如果buffer
不是稀疏的,则它必须完全且连续地绑定到单个VkDeviceMemory
对象。 -
VUID-vkCmdDispatchIndirect-buffer-02709
buffer
必须使用设置的VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT
位创建。 -
VUID-vkCmdDispatchIndirect-commandBuffer-02711
commandBuffer
不能是受保护的命令缓冲区。 -
VUID-vkCmdDispatchIndirect-offset-00407
offset
和VkDispatchIndirectCommand
的大小之和必须小于或等于buffer
的大小。
-
VUID-vkCmdDispatchIndirect-commandBuffer-parameter
commandBuffer
必须 是有效的 VkCommandBuffer 句柄。 -
VUID-vkCmdDispatchIndirect-buffer-parameter
buffer
必须是有效的 VkBuffer 句柄。 -
VUID-vkCmdDispatchIndirect-commandBuffer-recording
commandBuffer
必须 处于 记录状态。 -
VUID-vkCmdDispatchIndirect-commandBuffer-cmdpool
分配commandBuffer
的VkCommandPool
必须 支持计算操作。 -
VUID-vkCmdDispatchIndirect-commonparent
buffer
和commandBuffer
都必须已从相同的 VkDevice 创建、分配或检索。
-
对
commandBuffer
的主机访问 必须 进行外部同步。 -
对分配
commandBuffer
的VkCommandPool
的主机访问 必须 进行外部同步。
VkDispatchIndirectCommand
结构定义为:
// Provided by VK_VERSION_1_0
typedef struct VkDispatchIndirectCommand {
uint32_t x;
uint32_t y;
uint32_t z;
} VkDispatchIndirectCommand;
-
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);
或等效的命令
// 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);
-
commandBuffer
是要将命令记录到的命令缓冲区。 -
baseGroupX
是WorkgroupId
的 X 分量的起始值。 -
baseGroupY
是WorkgroupId
的 Y 分量的起始值。 -
baseGroupZ
是WorkgroupId
的 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
如果使用以magFilter
或minFilter
等于VK_FILTER_LINEAR
、reductionMode
等于VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE
且compareEnable
等于VK_FALSE
创建的 VkSampler 来采样作为此命令结果的 VkImageView,则图像视图的格式特性 必须包含VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT
-
VUID-vkCmdDispatchBase-magFilter-09598
如果使用以magFilter
或minFilter
等于VK_FILTER_LINEAR
且reductionMode
等于VK_SAMPLER_REDUCTION_MODE_MIN
或VK_SAMPLER_REDUCTION_MODE_MAX
创建的 VkSampler 来采样作为此命令结果的 VkImageView,则图像视图的格式特性 必须包含VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_MINMAX_BIT
-
VUID-vkCmdDispatchBase-mipmapMode-04770
如果使用以mipmapMode
等于VK_SAMPLER_MIPMAP_MODE_LINEAR
、reductionMode
等于VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE
且compareEnable
等于VK_FALSE
创建的 VkSampler 来采样作为此命令结果的 VkImageView,则图像视图的格式特性 必须包含VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT
-
VUID-vkCmdDispatchBase-mipmapMode-09599
如果使用以mipmapMode
等于VK_SAMPLER_MIPMAP_MODE_LINEAR
且reductionMode
等于VK_SAMPLER_REDUCTION_MODE_MIN
或VK_SAMPLER_REDUCTION_MODE_MAX
创建的 VkSampler 来采样作为此命令结果的 VkImageView,则图像视图的格式特性 必须包含VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_MINMAX_BIT
-
VUID-vkCmdDispatchBase-unnormalizedCoordinates-09635
如果使用以unnormalizedCoordinates
等于VK_TRUE
创建的 VkSampler 来采样作为此命令结果的 VkImageView,则图像视图的levelCount
和layerCount
必须为 1 -
VUID-vkCmdDispatchBase-None-08609
如果使用以unnormalizedCoordinates
等于VK_TRUE
创建的 VkSampler 来采样作为此命令结果的 VkImageView,则图像视图的viewType
必须为VK_IMAGE_VIEW_TYPE_1D
或VK_IMAGE_VIEW_TYPE_2D
-
VUID-vkCmdDispatchBase-None-08610
如果使用一个unnormalizedCoordinates
等于VK_TRUE
创建的 VkSampler 来采样一个 VkImageView,那么该采样器必须不能用于任何名称中包含ImplicitLod
、Dref
或Proj
的 SPIR-VOpImageSample*
或OpImageSparseSample*
指令。 -
VUID-vkCmdDispatchBase-None-08611
如果使用一个unnormalizedCoordinates
等于VK_TRUE
创建的 VkSampler 来采样一个 VkImageView,那么该采样器必须不能用于任何包含 LOD 偏差或任何偏移值的 SPIR-VOpImageSample*
或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_3D
、VK_IMAGE_VIEW_TYPE_CUBE
或VK_IMAGE_VIEW_TYPE_CUBE_ARRAY
的 VkImageViewType。 -
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_MIN
或VK_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_QCOM
的 VkSamplerReductionModeCreateInfo::reductionMode
。 -
VUID-vkCmdDispatchBase-reductionMode-09213
任何由于此命令而使用等于VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE_RANGECLAMP_QCOM
的 VkSamplerReductionModeCreateInfo::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_NV
的 VkImageCreateInfo::flags
创建的 VkImage,如果由于该命令被采样,则必须仅使用VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE
的 VkSamplerAddressMode 进行采样。 -
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 使用的 VkDescriptorSetLayout 和 VkPushConstantRange 数组兼容,如管线布局兼容性中所述。 -
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_ACCESS
或VK_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_ACCESS
或VK_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转换的VkSampler或VkImageView对象,则该对象必须仅与OpImageSample*
或OpImageSparseSample*
指令一起使用。 -
VUID-vkCmdDispatchBase-ConstOffset-06551
如果绑定的着色器访问了启用采样器Y′CBCR转换的VkSampler或VkImageView对象,则该对象必须不使用ConstOffset
和Offset
操作数。 -
VUID-vkCmdDispatchBase-viewType-07752
如果作为此命令的结果访问了VkImageView,则图像视图的viewType
必须与SPIR-V图像维度和Vulkan ImageView类型之间的兼容性中所述的OpTypeImage
的Dim
操作数匹配。 -
VUID-vkCmdDispatchBase-format-07753
如果作为此命令的结果访问了VkImageView,则图像视图的format
的数字类型与OpTypeImage
的Sampled
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
如果此命令访问的 VkBufferView 的 VkFormat 的组件宽度小于 64 位,则该指令的OpTypeImage
操作数的SampledType
的Width
必须为 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
如果使用OpImageWeightedSampleQCOM
对 VkImageView 进行采样,则图像视图的格式特性必须包含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
如果使用OpImageBoxFilterQCOM
对 VkImageView 进行采样,则图像视图的格式特性必须包含VK_FORMAT_FEATURE_2_BOX_FILTER_SAMPLED_BIT_QCOM
。 -
VUID-vkCmdDispatchBase-OpImageBlockMatchSSDQCOM-06974
如果使用OpImageBlockMatchSSDQCOM
从 VkImageView 中读取数据,则图像视图的格式特性必须包含VK_FORMAT_FEATURE_2_BLOCK_MATCHING_BIT_QCOM
。 -
VUID-vkCmdDispatchBase-OpImageBlockMatchSADQCOM-06975
如果使用OpImageBlockMatchSADQCOM
从 VkImageView 中读取数据,则图像视图的格式特性必须包含VK_FORMAT_FEATURE_2_BLOCK_MATCHING_BIT_QCOM
。 -
VUID-vkCmdDispatchBase-OpImageBlockMatchSADQCOM-06976
如果使用OpImageBlockMatchSADQCOM
或 OpImageBlockMatchSSDQCOM 从参考图像读取数据,则指定的参考坐标必须通过整数纹素坐标验证。 -
VUID-vkCmdDispatchBase-OpImageWeightedSampleQCOM-06977
如果OpImageWeightedSampleQCOM
、OpImageBoxFilterQCOM
、OpImageBlockMatchWindowSSDQCOM
、OpImageBlockMatchWindowSADQCOM
、OpImageBlockMatchGatherSSDQCOM
、OpImageBlockMatchGatherSADQCOM
、OpImageBlockMatchSSDQCOM
或OpImageBlockMatchSADQCOM
使用 VkSampler,则该采样器必须使用VK_SAMPLER_CREATE_IMAGE_PROCESSING_BIT_QCOM
创建。 -
VUID-vkCmdDispatchBase-OpImageWeightedSampleQCOM-06978
如果除OpImageWeightedSampleQCOM
、OpImageBoxFilterQCOM
、OpImageBlockMatchWindowSSDQCOM
、OpImageBlockMatchWindowSADQCOM
、OpImageBlockMatchGatherSSDQCOM
、OpImageBlockMatchGatherSADQCOM
、OpImageBlockMatchSSDQCOM
或OpImageBlockMatchSADQCOM
之外的任何命令使用 VkSampler,则该采样器必须没有使用VK_SAMPLER_CREATE_IMAGE_PROCESSING_BIT_QCOM
创建。 -
VUID-vkCmdDispatchBase-OpImageBlockMatchWindow-09215
如果使用OpImageBlockMatchWindow*QCOM
或OpImageBlockMatchGather*QCOM
指令从 VkImageView 读取数据,则图像视图的格式特性必须包含VK_FORMAT_FEATURE_2_BLOCK_MATCHING_BIT_QCOM
。 -
VUID-vkCmdDispatchBase-OpImageBlockMatchWindow-09216
如果使用OpImageBlockMatchWindow*QCOM
或OpImageBlockMatchGather*QCOM
指令从 VkImageView 读取数据,则图像视图的格式必须是单分量格式。 -
VUID-vkCmdDispatchBase-OpImageBlockMatchWindow-09217
如果OpImageBlockMatchWindow*QCOM
或OpImageBlockMatchGather*QCOM
从参考图像读取数据,则指定的参考坐标必须通过整数纹素坐标验证。 -
VUID-vkCmdDispatchBase-None-07288
此命令执行的任何着色器调用必须终止。 -
VUID-vkCmdDispatchBase-None-09600
如果此命令访问的描述符的类型等于VK_DESCRIPTOR_TYPE_SAMPLE_WEIGHT_IMAGE_QCOM
、VK_DESCRIPTOR_TYPE_BLOCK_MATCH_IMAGE_QCOM
、VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE
、VK_DESCRIPTOR_TYPE_STORAGE_IMAGE
或VK_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
如果baseGroupX
、baseGroupY
或baseGroupZ
中的任何一个不为零,则绑定的计算管线必须已使用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
分配commandBuffer
的VkCommandPool
必须 支持计算操作。
-
对
commandBuffer
的主机访问 必须 进行外部同步。 -
对分配
commandBuffer
的VkCommandPool
的主机访问 必须 进行外部同步。
子通道着色使用调用子通道的渲染区域的工作维度和指定的工作组大小对工作组进行分区来分派计算管线工作。允许使用诸如 subpassLoad
之类的子通道操作。
要记录子通道着色,请调用
// Provided by VK_HUAWEI_subpass_shading
void vkCmdSubpassShadingHUAWEI(
VkCommandBuffer commandBuffer);
-
commandBuffer
是要将命令记录到的命令缓冲区。
当命令执行时,将组装一个由 ceil (渲染区域大小 / 本地工作组大小) 本地工作组组成的全局工作组。
-
VUID-vkCmdSubpassShadingHUAWEI-magFilter-04553
如果使用以magFilter
或minFilter
等于VK_FILTER_LINEAR
、reductionMode
等于VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE
且compareEnable
等于VK_FALSE
创建的 VkSampler 来采样作为此命令结果的 VkImageView,则图像视图的格式特性 必须包含VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT
-
VUID-vkCmdSubpassShadingHUAWEI-magFilter-09598
如果使用以magFilter
或minFilter
等于VK_FILTER_LINEAR
且reductionMode
等于VK_SAMPLER_REDUCTION_MODE_MIN
或VK_SAMPLER_REDUCTION_MODE_MAX
创建的 VkSampler 来采样作为此命令结果的 VkImageView,则图像视图的格式特性 必须包含VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_MINMAX_BIT
-
VUID-vkCmdSubpassShadingHUAWEI-mipmapMode-04770
如果使用以mipmapMode
等于VK_SAMPLER_MIPMAP_MODE_LINEAR
、reductionMode
等于VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE
且compareEnable
等于VK_FALSE
创建的 VkSampler 来采样作为此命令结果的 VkImageView,则图像视图的格式特性 必须包含VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT
-
VUID-vkCmdSubpassShadingHUAWEI-mipmapMode-09599
如果使用以mipmapMode
等于VK_SAMPLER_MIPMAP_MODE_LINEAR
且reductionMode
等于VK_SAMPLER_REDUCTION_MODE_MIN
或VK_SAMPLER_REDUCTION_MODE_MAX
创建的 VkSampler 来采样作为此命令结果的 VkImageView,则图像视图的格式特性 必须包含VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_MINMAX_BIT
-
VUID-vkCmdSubpassShadingHUAWEI-unnormalizedCoordinates-09635
如果使用以unnormalizedCoordinates
等于VK_TRUE
创建的 VkSampler 来采样作为此命令结果的 VkImageView,则图像视图的levelCount
和layerCount
必须为 1 -
VUID-vkCmdSubpassShadingHUAWEI-None-08609
如果使用以unnormalizedCoordinates
等于VK_TRUE
创建的 VkSampler 来采样作为此命令结果的 VkImageView,则图像视图的viewType
必须为VK_IMAGE_VIEW_TYPE_1D
或VK_IMAGE_VIEW_TYPE_2D
-
VUID-vkCmdSubpassShadingHUAWEI-None-08610
如果使用一个unnormalizedCoordinates
等于VK_TRUE
创建的 VkSampler 来采样一个 VkImageView,那么该采样器必须不能用于任何名称中包含ImplicitLod
、Dref
或Proj
的 SPIR-VOpImageSample*
或OpImageSparseSample*
指令。 -
VUID-vkCmdSubpassShadingHUAWEI-None-08611
如果使用一个unnormalizedCoordinates
等于VK_TRUE
创建的 VkSampler 来采样一个 VkImageView,那么该采样器必须不能用于任何包含 LOD 偏差或任何偏移值的 SPIR-VOpImageSample*
或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_3D
、VK_IMAGE_VIEW_TYPE_CUBE
或VK_IMAGE_VIEW_TYPE_CUBE_ARRAY
的 VkImageViewType。 -
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_MIN
或VK_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_QCOM
的 VkSamplerReductionModeCreateInfo::reductionMode
。 -
VUID-vkCmdSubpassShadingHUAWEI-reductionMode-09213
任何由于此命令而使用等于VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE_RANGECLAMP_QCOM
的 VkSamplerReductionModeCreateInfo::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_NV
的 VkImageCreateInfo::flags
创建的 VkImage,如果由于该命令被采样,则必须仅使用VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE
的 VkSamplerAddressMode 进行采样。 -
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 使用的 VkDescriptorSetLayout 和 VkPushConstantRange 数组兼容,如管线布局兼容性中所述。 -
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_ACCESS
或VK_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_ACCESS
或VK_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转换的VkSampler或VkImageView对象,则该对象必须仅与OpImageSample*
或OpImageSparseSample*
指令一起使用。 -
VUID-vkCmdSubpassShadingHUAWEI-ConstOffset-06551
如果绑定的着色器访问了启用采样器Y′CBCR转换的VkSampler或VkImageView对象,则该对象必须不使用ConstOffset
和Offset
操作数。 -
VUID-vkCmdSubpassShadingHUAWEI-viewType-07752
如果作为此命令的结果访问了VkImageView,则图像视图的viewType
必须与SPIR-V图像维度和Vulkan ImageView类型之间的兼容性中所述的OpTypeImage
的Dim
操作数匹配。 -
VUID-vkCmdSubpassShadingHUAWEI-format-07753
如果作为此命令的结果访问了VkImageView,则图像视图的format
的数字类型与OpTypeImage
的Sampled
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
如果此命令访问的 VkBufferView 的 VkFormat 的组件宽度小于 64 位,则该指令的OpTypeImage
操作数的SampledType
的Width
必须为 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
如果使用OpImageWeightedSampleQCOM
对 VkImageView 进行采样,则图像视图的格式特性必须包含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
如果使用OpImageBoxFilterQCOM
对 VkImageView 进行采样,则图像视图的格式特性必须包含VK_FORMAT_FEATURE_2_BOX_FILTER_SAMPLED_BIT_QCOM
。 -
VUID-vkCmdSubpassShadingHUAWEI-OpImageBlockMatchSSDQCOM-06974
如果使用OpImageBlockMatchSSDQCOM
从 VkImageView 中读取数据,则图像视图的格式特性必须包含VK_FORMAT_FEATURE_2_BLOCK_MATCHING_BIT_QCOM
。 -
VUID-vkCmdSubpassShadingHUAWEI-OpImageBlockMatchSADQCOM-06975
如果使用OpImageBlockMatchSADQCOM
从 VkImageView 中读取数据,则图像视图的格式特性必须包含VK_FORMAT_FEATURE_2_BLOCK_MATCHING_BIT_QCOM
。 -
VUID-vkCmdSubpassShadingHUAWEI-OpImageBlockMatchSADQCOM-06976
如果使用OpImageBlockMatchSADQCOM
或 OpImageBlockMatchSSDQCOM 从参考图像读取数据,则指定的参考坐标必须通过整数纹素坐标验证。 -
VUID-vkCmdSubpassShadingHUAWEI-OpImageWeightedSampleQCOM-06977
如果OpImageWeightedSampleQCOM
、OpImageBoxFilterQCOM
、OpImageBlockMatchWindowSSDQCOM
、OpImageBlockMatchWindowSADQCOM
、OpImageBlockMatchGatherSSDQCOM
、OpImageBlockMatchGatherSADQCOM
、OpImageBlockMatchSSDQCOM
或OpImageBlockMatchSADQCOM
使用 VkSampler,则该采样器必须使用VK_SAMPLER_CREATE_IMAGE_PROCESSING_BIT_QCOM
创建。 -
VUID-vkCmdSubpassShadingHUAWEI-OpImageWeightedSampleQCOM-06978
如果除OpImageWeightedSampleQCOM
、OpImageBoxFilterQCOM
、OpImageBlockMatchWindowSSDQCOM
、OpImageBlockMatchWindowSADQCOM
、OpImageBlockMatchGatherSSDQCOM
、OpImageBlockMatchGatherSADQCOM
、OpImageBlockMatchSSDQCOM
或OpImageBlockMatchSADQCOM
之外的任何命令使用 VkSampler,则该采样器必须没有使用VK_SAMPLER_CREATE_IMAGE_PROCESSING_BIT_QCOM
创建。 -
VUID-vkCmdSubpassShadingHUAWEI-OpImageBlockMatchWindow-09215
如果使用OpImageBlockMatchWindow*QCOM
或OpImageBlockMatchGather*QCOM
指令从 VkImageView 读取数据,则图像视图的格式特性必须包含VK_FORMAT_FEATURE_2_BLOCK_MATCHING_BIT_QCOM
。 -
VUID-vkCmdSubpassShadingHUAWEI-OpImageBlockMatchWindow-09216
如果使用OpImageBlockMatchWindow*QCOM
或OpImageBlockMatchGather*QCOM
指令从 VkImageView 读取数据,则图像视图的格式必须是单分量格式。 -
VUID-vkCmdSubpassShadingHUAWEI-OpImageBlockMatchWindow-09217
如果OpImageBlockMatchWindow*QCOM
或OpImageBlockMatchGather*QCOM
从参考图像读取数据,则指定的参考坐标必须通过整数纹素坐标验证。 -
VUID-vkCmdSubpassShadingHUAWEI-None-07288
此命令执行的任何着色器调用必须终止。 -
VUID-vkCmdSubpassShadingHUAWEI-None-09600
如果此命令访问的描述符的类型等于VK_DESCRIPTOR_TYPE_SAMPLE_WEIGHT_IMAGE_QCOM
、VK_DESCRIPTOR_TYPE_BLOCK_MATCH_IMAGE_QCOM
、VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE
、VK_DESCRIPTOR_TYPE_STORAGE_IMAGE
或VK_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
分配commandBuffer
的VkCommandPool
必须支持图形操作。 -
VUID-vkCmdSubpassShadingHUAWEI-videocoding
此命令 必须 仅在视频编码范围之外调用。
-
对
commandBuffer
的主机访问 必须 进行外部同步。 -
对分配
commandBuffer
的VkCommandPool
的主机访问 必须 进行外部同步。
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);
-
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
分配commandBuffer
的VkCommandPool
必须支持图形或计算操作 -
VUID-vkCmdCudaLaunchKernelNV-videocoding
此命令 必须 仅在视频编码范围之外调用。
-
对分配
commandBuffer
的VkCommandPool
的主机访问 必须 进行外部同步。
传递调度参数和参数
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;
-
sType
是一个 VkStructureType 值,用于标识此结构。 -
pNext
是NULL
或者是指向扩展此结构的结构的指针。 -
function
是要启动的函数的 CUDA 驱动程序句柄。 -
gridDimX
是在 X 维度中要调度的局部工作组的数量。它必须小于或等于VkPhysicalDeviceLimits
::maxComputeWorkGroupCount
[0] -
gridDimY
是在 Y 维度中要调度的局部工作组的数量。它必须小于或等于VkPhysicalDeviceLimits
::maxComputeWorkGroupCount
[1] -
gridDimZ
是在 Z 维度中要调度的局部工作组的数量。它必须小于或等于VkPhysicalDeviceLimits
::maxComputeWorkGroupCount
[2] -
blockDimX
是 X 维度中的块大小。 -
blockDimY
是 Y 维度中的块大小。 -
blockDimZ
是 Z 维度中的块大小。 -
sharedMemBytes
是每个线程块的动态共享内存大小(以字节为单位)。 -
paramCount
是pParams
表的长度。 -
pParams
是指向paramCount
个指针的数组的指针,这些指针对应于function
的参数。 -
extraCount
保留供将来使用。 -
pExtras
保留供将来使用。
function
的内核参数通过 pParams
指定,这与 cuLaunchKernel 中描述的方式非常相似。
如果 function
有 N 个参数,则 pParams
必须是一个包含 N 个指针的数组,并且 paramCount
必须为 N。 kernelParams
[0] 到 kernelParams
[N-1] 中的每一个必须指向一个内存区域,实际的内核参数将从该区域复制。内核参数的数量及其偏移量和大小在此处未指定,因为该信息存储在 VkCudaFunctionNV 对象中。
由 pParams
和 kernelParams
[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-sType-sType
sType
必须为VK_STRUCTURE_TYPE_CUDA_LAUNCH_INFO_NV
-
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 读取函数(例如
surf3Dread
、surf2Dread
和surf1Dread
)从中读取。 -
你可以通过使用 CUDA surface 写入函数(例如
surf3Dwrite
、surf2Dwrite
和surf1Dwrite
)写入其中。
有关更多详细信息,请参阅 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);
以下是如何为 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 = ¶ms[0];
launchInfo.extraCount = 0;
launchInfo.pExtras = nullptr;
vkCmdCudaLaunchKernelNV(commandBuffer, &launchInfo);
在 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);
}