// Copyright 2020-2024 The Khronos Group Inc.
//
// SPDX-License-Identifier: CC-BY-4.0

// Common Valid Usage
// Common to VkCmdBlitImage* commands
  * [[VUID-{refpage}-pRegions-00215]]
    The source region specified by each element of pname:pRegions must: be a
    region that is contained within pname:srcImage
  * [[VUID-{refpage}-pRegions-00216]]
    The destination region specified by each element of pname:pRegions must:
    be a region that is contained within pname:dstImage
  * [[VUID-{refpage}-pRegions-00217]]
    The union of all destination regions, specified by the elements of
    pname:pRegions, must: not overlap in memory with any texel that may: be
    sampled during the blit operation
  * [[VUID-{refpage}-srcImage-01999]]
    The <<resources-image-format-features,format features>> of
    pname:srcImage must: contain ename:VK_FORMAT_FEATURE_BLIT_SRC_BIT
ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
  * [[VUID-{refpage}-srcImage-06421]]
    pname:srcImage must: not use a
    <<formats-requiring-sampler-ycbcr-conversion, format that requires a
    sampler {YCbCr} conversion>>
endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
  * [[VUID-{refpage}-srcImage-00219]]
    pname:srcImage must: have been created with
    ename:VK_IMAGE_USAGE_TRANSFER_SRC_BIT usage flag
  * [[VUID-{refpage}-srcImage-00220]]
    If pname:srcImage is non-sparse then it must: be bound completely and
    contiguously to a single sname:VkDeviceMemory object
  * [[VUID-{refpage}-srcImageLayout-00221]]
    pname:srcImageLayout must: specify the layout of the image subresources
    of pname:srcImage specified in pname:pRegions at the time this command
    is executed on a sname:VkDevice
ifndef::VK_KHR_shared_presentable_image[]
  * [[VUID-{refpage}-srcImageLayout-00222]]
    pname:srcImageLayout must: be ename:VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL
    or ename:VK_IMAGE_LAYOUT_GENERAL
endif::VK_KHR_shared_presentable_image[]
ifdef::VK_KHR_shared_presentable_image[]
  * [[VUID-{refpage}-srcImageLayout-01398]]
    pname:srcImageLayout must: be ename:VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR,
    ename:VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL or
    ename:VK_IMAGE_LAYOUT_GENERAL
endif::VK_KHR_shared_presentable_image[]
  * [[VUID-{refpage}-srcImage-09459]]
    If pname:srcImage and pname:dstImage are the same, and an elements of
    pname:pRegions contains the pname:srcSubresource and
    pname:dstSubresource with matching pname:mipLevel and overlapping array
    layers, then the pname:srcImageLayout and pname:dstImageLayout must: be
    ename:VK_IMAGE_LAYOUT_GENERAL
ifdef::VK_KHR_shared_presentable_image[]
    or ename:VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR
endif::VK_KHR_shared_presentable_image[]
  * [[VUID-{refpage}-dstImage-02000]]
    The <<resources-image-format-features,format features>> of
    pname:dstImage must: contain ename:VK_FORMAT_FEATURE_BLIT_DST_BIT
ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
  * [[VUID-{refpage}-dstImage-06422]]
    pname:dstImage must: not use a
    <<formats-requiring-sampler-ycbcr-conversion, format that requires a
    sampler {YCbCr} conversion>>
endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
  * [[VUID-{refpage}-dstImage-00224]]
    pname:dstImage must: have been created with
    ename:VK_IMAGE_USAGE_TRANSFER_DST_BIT usage flag
  * [[VUID-{refpage}-dstImage-00225]]
    If pname:dstImage is non-sparse then it must: be bound completely and
    contiguously to a single sname:VkDeviceMemory object
  * [[VUID-{refpage}-dstImageLayout-00226]]
    pname:dstImageLayout must: specify the layout of the image subresources
    of pname:dstImage specified in pname:pRegions at the time this command
    is executed on a sname:VkDevice
ifndef::VK_KHR_shared_presentable_image[]
  * [[VUID-{refpage}-dstImageLayout-00227]]
    pname:dstImageLayout must: be ename:VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL
    or ename:VK_IMAGE_LAYOUT_GENERAL
endif::VK_KHR_shared_presentable_image[]
ifdef::VK_KHR_shared_presentable_image[]
  * [[VUID-{refpage}-dstImageLayout-01399]]
    pname:dstImageLayout must: be ename:VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR,
    ename:VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL or
    ename:VK_IMAGE_LAYOUT_GENERAL
endif::VK_KHR_shared_presentable_image[]
  * [[VUID-{refpage}-srcImage-00229]]
    If either of pname:srcImage or pname:dstImage was created with a signed
    integer elink:VkFormat, the other must: also have been created with a
    signed integer elink:VkFormat
  * [[VUID-{refpage}-srcImage-00230]]
    If either of pname:srcImage or pname:dstImage was created with an
    unsigned integer elink:VkFormat, the other must: also have been created
    with an unsigned integer elink:VkFormat
  * [[VUID-{refpage}-srcImage-00231]]
    If either of pname:srcImage or pname:dstImage was created with a
    depth/stencil format, the other must: have exactly the same format
  * [[VUID-{refpage}-srcImage-00232]]
    If pname:srcImage was created with a depth/stencil format, pname:filter
    must: be ename:VK_FILTER_NEAREST
  * [[VUID-{refpage}-srcImage-00233]]
    pname:srcImage must: have been created with a pname:samples value of
    ename:VK_SAMPLE_COUNT_1_BIT
  * [[VUID-{refpage}-dstImage-00234]]
    pname:dstImage must: have been created with a pname:samples value of
    ename:VK_SAMPLE_COUNT_1_BIT
  * [[VUID-{refpage}-filter-02001]]
    If pname:filter is ename:VK_FILTER_LINEAR, then the
    <<resources-image-format-features,format features>> of pname:srcImage
    must: contain ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT
ifdef::VK_IMG_filter_cubic,VK_EXT_filter_cubic[]
  * [[VUID-{refpage}-filter-02002]]
    If pname:filter is ename:VK_FILTER_CUBIC_EXT, then the
    <<resources-image-format-features,format features>> of pname:srcImage
    must: contain ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT
  * [[VUID-{refpage}-filter-00237]]
    If pname:filter is ename:VK_FILTER_CUBIC_EXT, pname:srcImage must: be of
    type ename:VK_IMAGE_TYPE_2D
endif::VK_IMG_filter_cubic,VK_EXT_filter_cubic[]
  * [[VUID-{refpage}-srcSubresource-01705]]
    The pname:srcSubresource.mipLevel member of each element of
    pname:pRegions must: be less than the pname:mipLevels specified in
    slink:VkImageCreateInfo when pname:srcImage was created
  * [[VUID-{refpage}-dstSubresource-01706]]
    The pname:dstSubresource.mipLevel member of each element of
    pname:pRegions must: be less than the pname:mipLevels specified in
    slink:VkImageCreateInfo when pname:dstImage was created
  * [[VUID-{refpage}-srcSubresource-01707]]
ifdef::VK_KHR_maintenance5[]
    If pname:srcSubresource.layerCount is not
    ename:VK_REMAINING_ARRAY_LAYERS,
endif::VK_KHR_maintenance5[]
    [eq]#pname:srcSubresource.baseArrayLayer {plus}
    pname:srcSubresource.layerCount# of each element of pname:pRegions must:
    be less than or equal to the pname:arrayLayers specified in
    slink:VkImageCreateInfo when pname:srcImage was created
  * [[VUID-{refpage}-dstSubresource-01708]]
ifdef::VK_KHR_maintenance5[]
    If pname:srcSubresource.layerCount is not
    ename:VK_REMAINING_ARRAY_LAYERS,
endif::VK_KHR_maintenance5[]
    [eq]#pname:dstSubresource.baseArrayLayer {plus}
    pname:dstSubresource.layerCount# of each element of pname:pRegions must:
    be less than or equal to the pname:arrayLayers specified in
    slink:VkImageCreateInfo when pname:dstImage was created
ifdef::VK_EXT_fragment_density_map[]
  * [[VUID-{refpage}-dstImage-02545]]
    pname:dstImage and pname:srcImage must: not have been created with
    pname:flags containing ename:VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT
endif::VK_EXT_fragment_density_map[]
  * [[VUID-{refpage}-srcImage-00240]]
    If either pname:srcImage or pname:dstImage is of type
    ename:VK_IMAGE_TYPE_3D, then for each element of pname:pRegions,
    pname:srcSubresource.baseArrayLayer and
    pname:dstSubresource.baseArrayLayer must: each be `0`, and
    pname:srcSubresource.layerCount and pname:dstSubresource.layerCount
    must: each be `1`
  * [[VUID-{refpage}-aspectMask-00241]]
    For each element of pname:pRegions, pname:srcSubresource.aspectMask
    must: specify aspects present in pname:srcImage
  * [[VUID-{refpage}-aspectMask-00242]]
    For each element of pname:pRegions, pname:dstSubresource.aspectMask
    must: specify aspects present in pname:dstImage
  * [[VUID-{refpage}-srcOffset-00243]]
    For each element of pname:pRegions, pname:srcOffsets[0].x and
    pname:srcOffsets[1].x must: both be greater than or equal to `0` and
    less than or equal to the width of the specified pname:srcSubresource of
    pname:srcImage
  * [[VUID-{refpage}-srcOffset-00244]]
    For each element of pname:pRegions, pname:srcOffsets[0].y and
    pname:srcOffsets[1].y must: both be greater than or equal to `0` and
    less than or equal to the height of the specified pname:srcSubresource
    of pname:srcImage
  * [[VUID-{refpage}-srcImage-00245]]
    If pname:srcImage is of type ename:VK_IMAGE_TYPE_1D, then for each
    element of pname:pRegions, pname:srcOffsets[0].y must: be `0` and
    pname:srcOffsets[1].y must: be `1`
  * [[VUID-{refpage}-srcOffset-00246]]
    For each element of pname:pRegions, pname:srcOffsets[0].z and
    pname:srcOffsets[1].z must: both be greater than or equal to `0` and
    less than or equal to the depth of the specified pname:srcSubresource of
    pname:srcImage
  * [[VUID-{refpage}-srcImage-00247]]
    If pname:srcImage is of type ename:VK_IMAGE_TYPE_1D or
    ename:VK_IMAGE_TYPE_2D, then for each element of pname:pRegions,
    pname:srcOffsets[0].z must: be `0` and pname:srcOffsets[1].z must: be
    `1`
  * [[VUID-{refpage}-dstOffset-00248]]
    For each element of pname:pRegions, pname:dstOffsets[0].x and
    pname:dstOffsets[1].x must: both be greater than or equal to `0` and
    less than or equal to the width of the specified pname:dstSubresource of
    pname:dstImage
  * [[VUID-{refpage}-dstOffset-00249]]
    For each element of pname:pRegions, pname:dstOffsets[0].y and
    pname:dstOffsets[1].y must: both be greater than or equal to `0` and
    less than or equal to the height of the specified pname:dstSubresource
    of pname:dstImage
  * [[VUID-{refpage}-dstImage-00250]]
    If pname:dstImage is of type ename:VK_IMAGE_TYPE_1D, then for each
    element of pname:pRegions, pname:dstOffsets[0].y must: be `0` and
    pname:dstOffsets[1].y must: be `1`
  * [[VUID-{refpage}-dstOffset-00251]]
    For each element of pname:pRegions, pname:dstOffsets[0].z and
    pname:dstOffsets[1].z must: both be greater than or equal to `0` and
    less than or equal to the depth of the specified pname:dstSubresource of
    pname:dstImage
  * [[VUID-{refpage}-dstImage-00252]]
    If pname:dstImage is of type ename:VK_IMAGE_TYPE_1D or
    ename:VK_IMAGE_TYPE_2D, then for each element of pname:pRegions,
    pname:dstOffsets[0].z must: be `0` and pname:dstOffsets[1].z must: be
    `1`
// Common Valid Usage
