// Copyright 2019-2021 The Khronos Group Inc.
//
// SPDX-License-Identifier: CC-BY-4.0

// Common Valid Usage
// Common to all dispatch and drawing commands
  * [[VUID-{refpage}-magFilter-04553]]
    If a slink:VkSampler created with pname:magFilter or pname:minFilter
    equal to ename:VK_FILTER_LINEAR and pname:compareEnable equal to
    ename:VK_FALSE is used to sample a slink:VkImageView as a result of this
    command, then the image view's
    <<resources-image-view-format-features,format features>> must: contain
    ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT
  * [[VUID-{refpage}-mipmapMode-04770]]
    If a slink:VkSampler created with pname:mipmapMode equal to
    ename:VK_SAMPLER_MIPMAP_MODE_LINEAR and pname:compareEnable equal to
    ename:VK_FALSE is used to sample a slink:VkImageView as a result of this
    command, then the image view's
    <<resources-image-view-format-features,format features>> must: contain
    ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT
  * [[VUID-{refpage}-None-02691]]
    If a sname:VkImageView is accessed using atomic operations as a result
    of this command, then the image view's
    <<resources-image-view-format-features,format features>> must: contain
    ename:VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT
ifdef::VK_IMG_filter_cubic,VK_EXT_filter_cubic[]
  * [[VUID-{refpage}-None-02692]]
    If a sname:VkImageView is sampled with ename:VK_FILTER_CUBIC_EXT as a
    result of this command, then the image view's
    <<resources-image-view-format-features,format features>> must: contain
    ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT
ifndef::VK_EXT_filter_cubic[]
  * [[VUID-{refpage}-None-02693]]
    Any slink:VkImageView being sampled with ename:VK_FILTER_CUBIC_EXT as a
    result of this command must: not have a elink:VkImageViewType of
    ename:VK_IMAGE_VIEW_TYPE_3D, ename:VK_IMAGE_VIEW_TYPE_CUBE, or
    ename:VK_IMAGE_VIEW_TYPE_CUBE_ARRAY
endif::VK_EXT_filter_cubic[]
ifdef::VK_EXT_filter_cubic[]
  * [[VUID-{refpage}-filterCubic-02694]]
    Any slink:VkImageView being sampled with ename:VK_FILTER_CUBIC_EXT as a
    result of this command must: have a elink:VkImageViewType and format
    that supports cubic filtering, as specified by
    sname:VkFilterCubicImageViewImageFormatPropertiesEXT::pname:filterCubic
    returned by fname:vkGetPhysicalDeviceImageFormatProperties2
  * [[VUID-{refpage}-filterCubicMinmax-02695]]
    Any slink:VkImageView being sampled with ename:VK_FILTER_CUBIC_EXT with
    a reduction mode of either ename:VK_SAMPLER_REDUCTION_MODE_MIN or
    ename:VK_SAMPLER_REDUCTION_MODE_MAX as a result of this command must:
    have a elink:VkImageViewType and format that supports cubic filtering
    together with minmax filtering, as specified by
    sname:VkFilterCubicImageViewImageFormatPropertiesEXT::pname:filterCubicMinmax
    returned by fname:vkGetPhysicalDeviceImageFormatProperties2
endif::VK_EXT_filter_cubic[]
endif::VK_IMG_filter_cubic,VK_EXT_filter_cubic[]
ifdef::VK_NV_corner_sampled_image[]
  * [[VUID-{refpage}-flags-02696]]
    Any slink:VkImage created with a slink:VkImageCreateInfo::pname:flags
    containing ename:VK_IMAGE_CREATE_CORNER_SAMPLED_BIT_NV sampled as a
    result of this command must: only be sampled using a
    elink:VkSamplerAddressMode of
    ename:VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE
endif::VK_NV_corner_sampled_image[]
ifdef::VK_KHR_format_feature_flags2[]
  * [[VUID-{refpage}-OpTypeImage-06423]]
    Any slink:VkImageView or slink:VkBufferView being written as a storage
    image or storage texel buffer where the image format field of the
    code:OpTypeImage is code:Unknown must: have image format features that
    support ename:VK_FORMAT_FEATURE_2_STORAGE_WRITE_WITHOUT_FORMAT_BIT_KHR
  * [[VUID-{refpage}-OpTypeImage-06424]]
    Any slink:VkImageView or slink:VkBufferView being read as a storage
    image or storage texel buffer where the image format field of the
    code:OpTypeImage is code:Unknown must: have image format features that
    support ename:VK_FORMAT_FEATURE_2_STORAGE_READ_WITHOUT_FORMAT_BIT_KHR
endif::VK_KHR_format_feature_flags2[]
  * [[VUID-{refpage}-None-02697]]
    For each set _n_ that is statically used by the sname:VkPipeline bound
    to the pipeline bind point used by this command, a descriptor set must:
    have been bound to _n_ at the same pipeline bind point, with a
    sname:VkPipelineLayout that is compatible for set _n_, with the
    sname:VkPipelineLayout used to create the current sname:VkPipeline, as
    described in <<descriptorsets-compatibility>>
ifndef::VK_KHR_maintenance4[]
  * [[VUID-{refpage}-None-02698]]
    For each push constant that is statically used by the sname:VkPipeline
    bound to the pipeline bind point used by this command, a push constant
    value must: have been set for the same pipeline bind point, with a
    sname:VkPipelineLayout that is compatible for push constants, with the
    sname:VkPipelineLayout used to create the current sname:VkPipeline, as
    described in <<descriptorsets-compatibility>>
endif::VK_KHR_maintenance4[]
ifdef::VK_KHR_maintenance4[]
  * [[VUID-{refpage}-maintenance4-06425]]
    If the <<features-maintenance4, pname:maintenance4>> feature is not
    enabled, then for each push constant that is statically used by the
    sname:VkPipeline bound to the pipeline bind point used by this command,
    a push constant value must: have been set for the same pipeline bind
    point, with a sname:VkPipelineLayout that is compatible for push
    constants, with the sname:VkPipelineLayout used to create the current
    sname:VkPipeline, as described in <<descriptorsets-compatibility>>
endif::VK_KHR_maintenance4[]
  * [[VUID-{refpage}-None-02699]]
    Descriptors in each bound descriptor set, specified via
    fname:vkCmdBindDescriptorSets, must: be valid if they are statically
    used by the sname:VkPipeline bound to the pipeline bind point used by
    this command
  * [[VUID-{refpage}-None-02700]]
    A valid pipeline must: be bound to the pipeline bind point used by this
    command
  * [[VUID-{refpage}-commandBuffer-02701]]
    If the sname:VkPipeline object bound to the pipeline bind point used by
    this command requires any dynamic state, that state must: have been set
    or inherited (if the `apiext:VK_NV_inherited_viewport_scissor` extension
    is enabled) for pname:commandBuffer, and done so after any previously
    bound pipeline with the corresponding state not specified as dynamic
  * [[VUID-{refpage}-None-02859]]
    There must: not have been any calls to dynamic state setting commands
    for any state not specified as dynamic in the sname:VkPipeline object
    bound to the pipeline bind point used by this command, since that
    pipeline was bound
  * [[VUID-{refpage}-None-02702]]
    If the sname:VkPipeline object bound to the pipeline bind point used by
    this command accesses a sname:VkSampler object that uses unnormalized
    coordinates, that sampler must: not be used to sample from any
    sname:VkImage with a sname:VkImageView of the type
    ename:VK_IMAGE_VIEW_TYPE_3D, ename:VK_IMAGE_VIEW_TYPE_CUBE,
    ename:VK_IMAGE_VIEW_TYPE_1D_ARRAY, ename:VK_IMAGE_VIEW_TYPE_2D_ARRAY or
    ename:VK_IMAGE_VIEW_TYPE_CUBE_ARRAY, in any shader stage
  * [[VUID-{refpage}-None-02703]]
    If the sname:VkPipeline object bound to the pipeline bind point used by
    this command accesses a sname:VkSampler object that uses unnormalized
    coordinates, that sampler must: not be used with any of the SPIR-V
    `OpImageSample*` or `OpImageSparseSample*` instructions with
    code:ImplicitLod, code:Dref or code:Proj in their name, in any shader
    stage
  * [[VUID-{refpage}-None-02704]]
    If the sname:VkPipeline object bound to the pipeline bind point used by
    this command accesses a sname:VkSampler object that uses unnormalized
    coordinates, that sampler must: not be used with any of the SPIR-V
    `OpImageSample*` or `OpImageSparseSample*` instructions that includes a
    LOD bias or any offset values, in any shader stage
  * [[VUID-{refpage}-None-02705]]
    If the <<features-robustBufferAccess,robust buffer access>> feature is
    not enabled, and if the sname:VkPipeline object bound to the pipeline
    bind point used by this command accesses a uniform buffer, it must: not
    access values outside of the range of the buffer as specified in the
    descriptor set bound to the same pipeline bind point
  * [[VUID-{refpage}-None-02706]]
    If the <<features-robustBufferAccess,robust buffer access>> feature is
    not enabled, and if the sname:VkPipeline object bound to the pipeline
    bind point used by this command accesses a storage buffer, it must: not
    access values outside of the range of the buffer as specified in the
    descriptor set bound to the same pipeline bind point
ifdef::VK_VERSION_1_1[]
  * [[VUID-{refpage}-commandBuffer-02707]]
    If pname:commandBuffer is an unprotected command buffer and
    <<limits-protectedNoFault, pname:protectedNoFault>> is not supported,
    any resource accessed by the slink:VkPipeline object bound to the
    pipeline bind point used by this command must: not be a protected
    resource
endif::VK_VERSION_1_1[]
  * [[VUID-{refpage}-None-04115]]
    If a slink:VkImageView is accessed using code:OpImageWrite as a result
    of this command, then the code:Type of the code:Texel operand of that
    instruction must: have at least as many components as the image view's
    format
  * [[VUID-{refpage}-OpImageWrite-04469]]
    If a slink:VkBufferView is accessed using code:OpImageWrite as a result
    of this command, then the code:Type of the code:Texel operand of that
    instruction must: have at least as many components as the buffer view's
    format
ifdef::VK_EXT_shader_image_atomic_int64[]
  * [[VUID-{refpage}-SampledType-04470]]
    If a slink:VkImageView with a elink:VkFormat that has a 64-bit component
    width is accessed as a result of this command, the code:SampledType of
    the code:OpTypeImage operand of that instruction must: have a code:Width
    of 64
  * [[VUID-{refpage}-SampledType-04471]]
    If a slink:VkImageView with a elink:VkFormat that has a component width
    less than 64-bit is accessed as a result of this command, the
    code:SampledType of the code:OpTypeImage operand of that instruction
    must: have a code:Width of 32
  * [[VUID-{refpage}-SampledType-04472]]
    If a slink:VkBufferView with a elink:VkFormat that has a 64-bit
    component width is accessed as a result of this command, the
    code:SampledType of the code:OpTypeImage operand of that instruction
    must: have a code:Width of 64
  * [[VUID-{refpage}-SampledType-04473]]
    If a slink:VkBufferView with a elink:VkFormat that has a component width
    less than 64-bit is accessed as a result of this command, the
    code:SampledType of the code:OpTypeImage operand of that instruction
    must: have a code:Width of 32
  * [[VUID-{refpage}-sparseImageInt64Atomics-04474]]
    If the
    <<features-sparseImageInt64Atomics,pname:sparseImageInt64Atomics>>
    feature is not enabled, slink:VkImage objects created with the
    ename:VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT flag must: not be accessed by
    atomic instructions through an code:OpTypeImage with a code:SampledType
    with a code:Width of 64 by this command
  * [[VUID-{refpage}-sparseImageInt64Atomics-04475]]
    If the
    <<features-sparseImageInt64Atomics,pname:sparseImageInt64Atomics>>
    feature is not enabled, slink:VkBuffer objects created with the
    ename:VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT flag must: not be accessed
    by atomic instructions through an code:OpTypeImage with a
    code:SampledType with a code:Width of 64 by this command
endif::VK_EXT_shader_image_atomic_int64[]
// Common Valid Usage
