// Copyright 2020-2021 The Khronos Group Inc. // // SPDX-License-Identifier: CC-BY-4.0 // Common Valid Usage // Common to VkCmdCopyImage* commands * [[VUID-{refpage}-pRegions-00124]] The union of all source regions, and the union of all destination regions, specified by the elements of pname:pRegions, must: not overlap in memory ifdef::VK_VERSION_1_1,VK_KHR_maintenance1[] * [[VUID-{refpage}-srcImage-01995]] The <> of pname:srcImage must: contain ename:VK_FORMAT_FEATURE_TRANSFER_SRC_BIT endif::VK_VERSION_1_1,VK_KHR_maintenance1[] * [[VUID-{refpage}-srcImage-00126]] pname:srcImage must: have been created with ename:VK_IMAGE_USAGE_TRANSFER_SRC_BIT usage flag ifndef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[] * [[VUID-{refpage}-srcImage-00127]] If pname:srcImage is non-sparse then it must: be bound completely and contiguously to a single sname:VkDeviceMemory object endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[] ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[] * [[VUID-{refpage}-srcImage-01546]] If pname:srcImage is non-sparse then the image or _disjoint_ plane to be copied must: be bound completely and contiguously to a single sname:VkDeviceMemory object endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[] * [[VUID-{refpage}-srcImageLayout-00128]] 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-00129]] 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-01917]] pname:srcImageLayout must: be ename:VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, ename:VK_IMAGE_LAYOUT_GENERAL, or ename:VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR endif::VK_KHR_shared_presentable_image[] ifdef::VK_VERSION_1_1,VK_KHR_maintenance1[] * [[VUID-{refpage}-dstImage-01996]] The <> of pname:dstImage must: contain ename:VK_FORMAT_FEATURE_TRANSFER_DST_BIT endif::VK_VERSION_1_1,VK_KHR_maintenance1[] * [[VUID-{refpage}-dstImage-00131]] pname:dstImage must: have been created with ename:VK_IMAGE_USAGE_TRANSFER_DST_BIT usage flag ifndef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[] * [[VUID-{refpage}-dstImage-00132]] If pname:dstImage is non-sparse then it must: be bound completely and contiguously to a single sname:VkDeviceMemory object endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[] ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[] * [[VUID-{refpage}-dstImage-01547]] If pname:dstImage is non-sparse then the image or _disjoint_ plane that is the destination of the copy must: be bound completely and contiguously to a single sname:VkDeviceMemory object endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[] * [[VUID-{refpage}-dstImageLayout-00133]] 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-00134]] 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-01395]] pname:dstImageLayout must: be ename:VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, ename:VK_IMAGE_LAYOUT_GENERAL, or ename:VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR endif::VK_KHR_shared_presentable_image[] ifndef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[] * [[VUID-{refpage}-srcImage-00135]] The elink:VkFormat of each of pname:srcImage and pname:dstImage must: be compatible, as defined <> endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[] ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[] * [[VUID-{refpage}-srcImage-01548]] If the elink:VkFormat of each of pname:srcImage and pname:dstImage is not a <>, the elink:VkFormat of each of pname:srcImage and pname:dstImage must: be compatible, as defined <> * [[VUID-{refpage}-None-01549]] In a copy to or from a plane of a <>, the elink:VkFormat of the image and plane must: be compatible according to <> for the plane being copied endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[] * [[VUID-{refpage}-srcImage-00136]] The sample count of pname:srcImage and pname:dstImage must: match * [[VUID-{refpage}-srcSubresource-01696]] 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-01697]] 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-01698]] The [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-01699]] The [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 * [[VUID-{refpage}-srcOffset-01783]] The pname:srcOffset and pname:extent members of each element of pname:pRegions must: respect the image transfer granularity requirements of pname:commandBuffer's command pool's queue family, as described in slink:VkQueueFamilyProperties * [[VUID-{refpage}-dstOffset-01784]] The pname:dstOffset and pname:extent members of each element of pname:pRegions must: respect the image transfer granularity requirements of pname:commandBuffer's command pool's queue family, as described in slink:VkQueueFamilyProperties ifdef::VK_EXT_fragment_density_map[] * [[VUID-{refpage}-dstImage-02542]] 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[] // The remaining common VU used to be in image_copy_common.txt and have been // rewritten to apply to the calling command rather than the structure // parameter(s) of that command. ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[] * [[VUID-{refpage}-srcImage-01551]] If neither pname:srcImage nor pname:dstImage has a <> then for each element of pname:pRegions, pname:srcSubresource.aspectMask and pname:dstSubresource.aspectMask must: match * [[VUID-{refpage}-srcImage-01552]] If pname:srcImage has a elink:VkFormat with <> then for each element of pname:pRegions, pname:srcSubresource.aspectMask must: be ename:VK_IMAGE_ASPECT_PLANE_0_BIT or ename:VK_IMAGE_ASPECT_PLANE_1_BIT * [[VUID-{refpage}-srcImage-01553]] If pname:srcImage has a elink:VkFormat with <> then for each element of pname:pRegions, pname:srcSubresource.aspectMask must: be ename:VK_IMAGE_ASPECT_PLANE_0_BIT, ename:VK_IMAGE_ASPECT_PLANE_1_BIT, or ename:VK_IMAGE_ASPECT_PLANE_2_BIT * [[VUID-{refpage}-dstImage-01554]] If pname:dstImage has a elink:VkFormat with <> then for each element of pname:pRegions, pname:dstSubresource.aspectMask must: be ename:VK_IMAGE_ASPECT_PLANE_0_BIT or ename:VK_IMAGE_ASPECT_PLANE_1_BIT * [[VUID-{refpage}-dstImage-01555]] If pname:dstImage has a elink:VkFormat with <> then for each element of pname:pRegions, pname:dstSubresource.aspectMask must: be ename:VK_IMAGE_ASPECT_PLANE_0_BIT, ename:VK_IMAGE_ASPECT_PLANE_1_BIT, or ename:VK_IMAGE_ASPECT_PLANE_2_BIT * [[VUID-{refpage}-srcImage-01556]] If pname:srcImage has a <> and the pname:dstImage does not have a multi-planar image format, then for each element of pname:pRegions, pname:dstSubresource.aspectMask must: be ename:VK_IMAGE_ASPECT_COLOR_BIT * [[VUID-{refpage}-dstImage-01557]] If pname:dstImage has a <> and the pname:srcImage does not have a multi-planar image format, then for each element of pname:pRegions, pname:srcSubresource.aspectMask must: be ename:VK_IMAGE_ASPECT_COLOR_BIT endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[] ifndef::VK_VERSION_1_1,VK_KHR_maintenance1[] * [[VUID-{refpage}-srcImage-00139]] 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` endif::VK_VERSION_1_1,VK_KHR_maintenance1[] ifdef::VK_VERSION_1_1,VK_KHR_maintenance1[] * [[VUID-{refpage}-srcImage-04443]] If pname:srcImage is of type ename:VK_IMAGE_TYPE_3D, then for each element of pname:pRegions, pname:srcSubresource.baseArrayLayer must: be `0` and pname:srcSubresource.layerCount must: be `1` * [[VUID-{refpage}-dstImage-04444]] If pname:dstImage is of type ename:VK_IMAGE_TYPE_3D, then for each element of pname:pRegions, pname:dstSubresource.baseArrayLayer must: be `0` and pname:dstSubresource.layerCount must: be `1` endif::VK_VERSION_1_1,VK_KHR_maintenance1[] * [[VUID-{refpage}-aspectMask-00142]] For each element of pname:pRegions, pname:srcSubresource.aspectMask must: specify aspects present in pname:srcImage * [[VUID-{refpage}-aspectMask-00143]] For each element of pname:pRegions, pname:dstSubresource.aspectMask must: specify aspects present in pname:dstImage * [[VUID-{refpage}-srcOffset-00144]] For each element of pname:pRegions, pname:srcOffset.x and [eq]#(pname:extent.width {plus} pname:srcOffset.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-00145]] For each element of pname:pRegions, pname:srcOffset.y and [eq]#(pname:extent.height {plus} pname:srcOffset.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-00146]] If pname:srcImage is of type ename:VK_IMAGE_TYPE_1D, then for each element of pname:pRegions, pname:srcOffset.y must: be `0` and pname:extent.height must: be `1` * [[VUID-{refpage}-srcOffset-00147]] For each element of pname:pRegions, pname:srcOffset.z and [eq]#(pname:extent.depth {plus} pname:srcOffset.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-01785]] If pname:srcImage is of type ename:VK_IMAGE_TYPE_1D, then for each element of pname:pRegions, pname:srcOffset.z must: be `0` and pname:extent.depth must: be `1` * [[VUID-{refpage}-dstImage-01786]] If pname:dstImage is of type ename:VK_IMAGE_TYPE_1D, then for each element of pname:pRegions, pname:dstOffset.z must: be `0` and pname:extent.depth must: be `1` * [[VUID-{refpage}-srcImage-01787]] If pname:srcImage is of type ename:VK_IMAGE_TYPE_2D, then for each element of pname:pRegions, pname:srcOffset.z must: be `0` * [[VUID-{refpage}-dstImage-01788]] If pname:dstImage is of type ename:VK_IMAGE_TYPE_2D, then for each element of pname:pRegions, pname:dstOffset.z must: be `0` ifndef::VK_VERSION_1_1,VK_KHR_maintenance1[] * [[VUID-{refpage}-srcImage-01789]] If pname:srcImage or pname:dstImage is of type ename:VK_IMAGE_TYPE_2D, then for each element of pname:pRegions, pname:extent.depth must: be `1` endif::VK_VERSION_1_1,VK_KHR_maintenance1[] ifdef::VK_VERSION_1_1,VK_KHR_maintenance1[] * [[VUID-{refpage}-srcImage-01790]] If pname:srcImage and pname:dstImage are both of type ename:VK_IMAGE_TYPE_2D, then for each element of pname:pRegions, pname:extent.depth must: be `1` * [[VUID-{refpage}-srcImage-01791]] If pname:srcImage is of type ename:VK_IMAGE_TYPE_2D, and pname:dstImage is of type ename:VK_IMAGE_TYPE_3D, then for each element of pname:pRegions, pname:extent.depth must: equal pname:srcSubresource.layerCount * [[VUID-{refpage}-dstImage-01792]] If pname:dstImage is of type ename:VK_IMAGE_TYPE_2D, and pname:srcImage is of type ename:VK_IMAGE_TYPE_3D, then for each element of pname:pRegions, pname:extent.depth must: equal pname:dstSubresource.layerCount endif::VK_VERSION_1_1,VK_KHR_maintenance1[] * [[VUID-{refpage}-dstOffset-00150]] For each element of pname:pRegions, pname:dstOffset.x and [eq]#(pname:extent.width {plus} pname:dstOffset.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-00151]] For each element of pname:pRegions, pname:dstOffset.y and [eq]#(pname:extent.height {plus} pname:dstOffset.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-00152]] If pname:dstImage is of type ename:VK_IMAGE_TYPE_1D, then for each element of pname:pRegions, pname:dstOffset.y must: be `0` and pname:extent.height must: be `1` * [[VUID-{refpage}-dstOffset-00153]] For each element of pname:pRegions, pname:dstOffset.z and [eq]#(pname:extent.depth {plus} pname:dstOffset.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}-srcImage-01727]] If pname:srcImage is a <>, then for each element of pname:pRegions, all members of pname:srcOffset must: be a multiple of the corresponding dimensions of the compressed texel block * [[VUID-{refpage}-srcImage-01728]] If pname:srcImage is a <>, then for each element of pname:pRegions, pname:extent.width must: be a multiple of the compressed texel block width or [eq]#(pname:extent.width {plus} pname:srcOffset.x)# must: equal the width of the specified pname:srcSubresource of pname:srcImage * [[VUID-{refpage}-srcImage-01729]] If pname:srcImage is a <>, then for each element of pname:pRegions, pname:extent.height must: be a multiple of the compressed texel block height or [eq]#(pname:extent.height {plus} pname:srcOffset.y)# must: equal the height of the specified pname:srcSubresource of pname:srcImage * [[VUID-{refpage}-srcImage-01730]] If pname:srcImage is a <>, then for each element of pname:pRegions, pname:extent.depth must: be a multiple of the compressed texel block depth or [eq]#(pname:extent.depth {plus} pname:srcOffset.z)# must: equal the depth of the specified pname:srcSubresource of pname:srcImage * [[VUID-{refpage}-dstImage-01731]] If pname:dstImage is a <>, then for each element of pname:pRegions, all members of pname:dstOffset must: be a multiple of the corresponding dimensions of the compressed texel block * [[VUID-{refpage}-dstImage-01732]] If pname:dstImage is a <>, then for each element of pname:pRegions, pname:extent.width must: be a multiple of the compressed texel block width or [eq]#(pname:extent.width {plus} pname:dstOffset.x)# must: equal the width of the specified pname:dstSubresource of pname:dstImage * [[VUID-{refpage}-dstImage-01733]] If pname:dstImage is a <>, then for each element of pname:pRegions, pname:extent.height must: be a multiple of the compressed texel block height or [eq]#(pname:extent.height {plus} pname:dstOffset.y)# must: equal the height of the specified pname:dstSubresource of pname:dstImage * [[VUID-{refpage}-dstImage-01734]] If pname:dstImage is a <>, then for each element of pname:pRegions, pname:extent.depth must: be a multiple of the compressed texel block depth or [eq]#(pname:extent.depth {plus} pname:dstOffset.z)# must: equal the depth of the specified pname:dstSubresource of pname:dstImage // Common Valid Usage