megacommit
diff --git a/layers/buffer_validation.cpp b/layers/buffer_validation.cpp
index 06f4530..97aa080 100644
--- a/layers/buffer_validation.cpp
+++ b/layers/buffer_validation.cpp
@@ -1389,6 +1389,35 @@
     return skip;
 }
 
+bool ValidateImageMipLevel(layer_data *device_data, const GLOBAL_CB_NODE *cb_node, const IMAGE_STATE *img, uint32_t mip_level,
+                           const uint32_t i, const char *function, const char *member, UNIQUE_VALIDATION_ERROR_CODE vuid) {
+    const debug_report_data *report_data = core_validation::GetReportData(device_data);
+    bool skip = false;
+    if (mip_level >= img->createInfo.mipLevels) {
+        skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
+                        HandleToUint64(cb_node->commandBuffer), vuid,
+                        "In %s, pRegions[%u].%s.mipLevel is %u, but provided image %" PRIx64 " has %u mip levels.", function, i,
+                        member, mip_level, HandleToUint64(img->image), img->createInfo.mipLevels);
+    }
+    return skip;
+}
+
+bool ValidateImageArrayLayerRange(layer_data *device_data, const GLOBAL_CB_NODE *cb_node, const IMAGE_STATE *img,
+                                  const uint32_t base_layer, const uint32_t layer_count, const uint32_t i, const char *function,
+                                  const char *member, UNIQUE_VALIDATION_ERROR_CODE vuid) {
+    const debug_report_data *report_data = core_validation::GetReportData(device_data);
+    bool skip = false;
+    if (base_layer >= img->createInfo.arrayLayers || layer_count > img->createInfo.arrayLayers ||
+        (base_layer + layer_count) > img->createInfo.arrayLayers) {
+        skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
+                        HandleToUint64(cb_node->commandBuffer), vuid,
+                        "In %s, pRegions[%u].%s.baseArrayLayer is %u and .layerCount is "
+                        "%u, but provided image %" PRIx64 " has %u array layers.",
+                        function, i, member, base_layer, layer_count, HandleToUint64(img->image), img->createInfo.arrayLayers);
+    }
+    return skip;
+}
+
 // Check valid usage Image Transfer Granularity requirements for elements of a VkBufferImageCopy structure
 bool ValidateCopyBufferImageTransferGranularityRequirements(layer_data *device_data, const GLOBAL_CB_NODE *cb_node,
                                                             const IMAGE_STATE *img, const VkBufferImageCopy *region,
@@ -1786,19 +1815,18 @@
             slice_override = (depth_slices != 1);
         }
 
-        if (region.srcSubresource.layerCount == 0) {
-            std::stringstream ss;
-            ss << "vkCmdCopyImage: number of layers in pRegions[" << i << "] srcSubresource is zero";
-            skip |= log_msg(report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
-                            HandleToUint64(command_buffer), DRAWSTATE_INVALID_IMAGE_ASPECT, "%s", ss.str().c_str());
-        }
-
-        if (region.dstSubresource.layerCount == 0) {
-            std::stringstream ss;
-            ss << "vkCmdCopyImage: number of layers in pRegions[" << i << "] dstSubresource is zero";
-            skip |= log_msg(report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
-                            HandleToUint64(command_buffer), DRAWSTATE_INVALID_IMAGE_ASPECT, "%s", ss.str().c_str());
-        }
+        skip |= ValidateImageSubresourceLayers(device_data, cb_node, &region.srcSubresource, "vkCmdCopyImage", "srcSubresource", i);
+        skip |= ValidateImageSubresourceLayers(device_data, cb_node, &region.dstSubresource, "vkCmdCopyImage", "dstSubresource", i);
+        skip |= ValidateImageMipLevel(device_data, cb_node, src_image_state, region.srcSubresource.mipLevel, i, "vkCmdCopyImage",
+                                      "srcSubresource", VALIDATION_ERROR_19000d40);
+        skip |= ValidateImageMipLevel(device_data, cb_node, dst_image_state, region.dstSubresource.mipLevel, i, "vkCmdCopyImage",
+                                      "dstSubresource", VALIDATION_ERROR_19000d42);
+        skip |= ValidateImageArrayLayerRange(device_data, cb_node, src_image_state, region.srcSubresource.baseArrayLayer,
+                                             region.srcSubresource.layerCount, i, "vkCmdCopyImage", "srcSubresource",
+                                             VALIDATION_ERROR_19000d44);
+        skip |= ValidateImageArrayLayerRange(device_data, cb_node, dst_image_state, region.dstSubresource.baseArrayLayer,
+                                             region.dstSubresource.layerCount, i, "vkCmdCopyImage", "dstSubresource",
+                                             VALIDATION_ERROR_19000d46);
 
         if (GetDeviceExtensions(device_data)->vk_khr_maintenance1) {
             // No chance of mismatch if we're overriding depth slice count
@@ -1861,57 +1889,6 @@
                             HandleToUint64(command_buffer), VALIDATION_ERROR_09c0011e, "%s.", ss.str().c_str());
         }
 
-        // AspectMask must not contain VK_IMAGE_ASPECT_METADATA_BIT
-        if ((region.srcSubresource.aspectMask & VK_IMAGE_ASPECT_METADATA_BIT) ||
-            (region.dstSubresource.aspectMask & VK_IMAGE_ASPECT_METADATA_BIT)) {
-            std::stringstream ss;
-            ss << "vkCmdCopyImage: pRegions[" << i << "] may not specify aspectMask containing VK_IMAGE_ASPECT_METADATA_BIT";
-            skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
-                            HandleToUint64(command_buffer), VALIDATION_ERROR_0a600150, "%s.", ss.str().c_str());
-        }
-
-        // For each region, if aspectMask contains VK_IMAGE_ASPECT_COLOR_BIT, it must not contain either of
-        // VK_IMAGE_ASPECT_DEPTH_BIT or VK_IMAGE_ASPECT_STENCIL_BIT
-        if ((region.srcSubresource.aspectMask & VK_IMAGE_ASPECT_COLOR_BIT) &&
-            (region.srcSubresource.aspectMask & (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT))) {
-            char const str[] = "vkCmdCopyImage aspectMask cannot specify both COLOR and DEPTH/STENCIL aspects";
-            skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
-                            HandleToUint64(command_buffer), VALIDATION_ERROR_0a60014e, "%s.", str);
-        }
-
-        // MipLevel must be less than the mipLevels specified in VkImageCreateInfo when the image was created
-        if (region.srcSubresource.mipLevel >= src_image_state->createInfo.mipLevels) {
-            std::stringstream ss;
-            ss << "vkCmdCopyImage: pRegions[" << i
-               << "] specifies a src mipLevel greater than the number specified when the srcImage was created.";
-            skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
-                            HandleToUint64(command_buffer), VALIDATION_ERROR_19000d40, "%s.", ss.str().c_str());
-        }
-        if (region.dstSubresource.mipLevel >= dst_image_state->createInfo.mipLevels) {
-            std::stringstream ss;
-            ss << "vkCmdCopyImage: pRegions[" << i
-               << "] specifies a dst mipLevel greater than the number specified when the dstImage was created.";
-            skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
-                            HandleToUint64(command_buffer), VALIDATION_ERROR_19000d42, "%s.", ss.str().c_str());
-        }
-
-        // (baseArrayLayer + layerCount) must be less than or equal to the arrayLayers specified in VkImageCreateInfo when the
-        // image was created
-        if ((region.srcSubresource.baseArrayLayer + region.srcSubresource.layerCount) > src_image_state->createInfo.arrayLayers) {
-            std::stringstream ss;
-            ss << "vkCmdCopyImage: srcImage arrayLayers was " << src_image_state->createInfo.arrayLayers << " but subRegion[" << i
-               << "] baseArrayLayer + layerCount is " << (region.srcSubresource.baseArrayLayer + region.srcSubresource.layerCount);
-            skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
-                            HandleToUint64(command_buffer), VALIDATION_ERROR_19000d44, "%s.", ss.str().c_str());
-        }
-        if ((region.dstSubresource.baseArrayLayer + region.dstSubresource.layerCount) > dst_image_state->createInfo.arrayLayers) {
-            std::stringstream ss;
-            ss << "vkCmdCopyImage: dstImage arrayLayers was " << dst_image_state->createInfo.arrayLayers << " but subRegion[" << i
-               << "] baseArrayLayer + layerCount is " << (region.dstSubresource.baseArrayLayer + region.dstSubresource.layerCount);
-            skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
-                            HandleToUint64(command_buffer), VALIDATION_ERROR_19000d46, "%s.", ss.str().c_str());
-        }
-
         // Check region extents for 1D-1D, 2D-2D, and 3D-3D copies
         if (src_image_state->createInfo.imageType == dst_image_state->createInfo.imageType) {
             // The source region specified by a given element of regions must be a region that is contained within srcImage
@@ -1996,6 +1973,7 @@
         // The union of all source regions, and the union of all destination regions, specified by the elements of regions,
         // must not overlap in memory
         if (src_image_state->image == dst_image_state->image) {
+            // TODO: This is an O(region_count^2) loop
             for (uint32_t j = 0; j < region_count; j++) {
                 if (RegionIntersects(&region, &regions[j], src_image_state->createInfo.imageType,
                                      FormatIsMultiplane(src_image_state->createInfo.format))) {
@@ -2244,25 +2222,27 @@
         const UNIQUE_VALIDATION_ERROR_CODE invalid_dst_layout_vuid =
             core_validation::GetDeviceExtensions(device_data)->vk_khr_shared_presentable_image ? VALIDATION_ERROR_1c800af2
                                                                                                : VALIDATION_ERROR_1c80020e;
-        // For each region, the number of layers in the image subresource should not be zero
-        // For each region, src and dest image aspect must be color only
         for (uint32_t i = 0; i < regionCount; i++) {
-            if (pRegions[i].srcSubresource.layerCount == 0) {
-                char const str[] = "vkCmdResolveImage: number of layers in source subresource is zero";
-                skip |= log_msg(report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
-                                HandleToUint64(cb_node->commandBuffer), DRAWSTATE_MISMATCHED_IMAGE_ASPECT, str);
-            }
-            if (pRegions[i].dstSubresource.layerCount == 0) {
-                char const str[] = "vkCmdResolveImage: number of layers in destination subresource is zero";
-                skip |= log_msg(report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
-                                HandleToUint64(cb_node->commandBuffer), DRAWSTATE_MISMATCHED_IMAGE_ASPECT, str);
-            }
+            skip |= ValidateImageSubresourceLayers(device_data, cb_node, &pRegions[i].srcSubresource, "vkCmdResolveImage()",
+                                                   "srcSubresource", i);
+            skip |= ValidateImageSubresourceLayers(device_data, cb_node, &pRegions[i].dstSubresource, "vkCmdResolveImage()",
+                                                   "dstSubresource", i);
             skip |= VerifyImageLayout(device_data, cb_node, src_image_state, pRegions[i].srcSubresource, src_image_layout,
                                       VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, "vkCmdResolveImage()", invalid_src_layout_vuid,
                                       VALIDATION_ERROR_1c800208, &hit_error);
             skip |= VerifyImageLayout(device_data, cb_node, dst_image_state, pRegions[i].dstSubresource, dst_image_layout,
                                       VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, "vkCmdResolveImage()", invalid_dst_layout_vuid,
                                       VALIDATION_ERROR_1c80020c, &hit_error);
+            skip |= ValidateImageMipLevel(device_data, cb_node, src_image_state, pRegions[i].srcSubresource.mipLevel, i,
+                                          "vkCmdResolveImage()", "srcSubresource", VALIDATION_ERROR_1c800d5a);
+            skip |= ValidateImageMipLevel(device_data, cb_node, dst_image_state, pRegions[i].dstSubresource.mipLevel, i,
+                                          "vkCmdResolveImage()", "dstSubresource", VALIDATION_ERROR_1c800d5c);
+            skip |= ValidateImageArrayLayerRange(device_data, cb_node, src_image_state, pRegions[i].srcSubresource.baseArrayLayer,
+                                                 pRegions[i].srcSubresource.layerCount, i, "vkCmdResolveImage()", "srcSubresource",
+                                                 VALIDATION_ERROR_1c800d5e);
+            skip |= ValidateImageArrayLayerRange(device_data, cb_node, dst_image_state, pRegions[i].dstSubresource.baseArrayLayer,
+                                                 pRegions[i].dstSubresource.layerCount, i, "vkCmdResolveImage()", "srcSubresource",
+                                                 VALIDATION_ERROR_1c800d60);
 
             // layer counts must match
             if (pRegions[i].srcSubresource.layerCount != pRegions[i].dstSubresource.layerCount) {
@@ -2468,6 +2448,20 @@
                 VerifyImageLayout(device_data, cb_node, dst_image_state, rgn.dstSubresource, dst_image_layout,
                                   VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, "vkCmdBlitImage()", invalid_dst_layout_vuid,
                                   VALIDATION_ERROR_184001c4, &hit_error);
+            skip |=
+                ValidateImageSubresourceLayers(device_data, cb_node, &rgn.srcSubresource, "vkCmdBlitImage()", "srcSubresource", i);
+            skip |=
+                ValidateImageSubresourceLayers(device_data, cb_node, &rgn.dstSubresource, "vkCmdBlitImage()", "dstSubresource", i);
+            skip |= ValidateImageMipLevel(device_data, cb_node, src_image_state, rgn.srcSubresource.mipLevel, i, "vkCmdBlitImage()",
+                                          "srcSubresource", VALIDATION_ERROR_18400d52);
+            skip |= ValidateImageMipLevel(device_data, cb_node, dst_image_state, rgn.dstSubresource.mipLevel, i, "vkCmdBlitImage()",
+                                          "dstSubresource", VALIDATION_ERROR_18400d54);
+            skip |= ValidateImageArrayLayerRange(device_data, cb_node, src_image_state, rgn.srcSubresource.baseArrayLayer,
+                                                 rgn.srcSubresource.layerCount, i, "vkCmdBlitImage()", "srcSubresource",
+                                                 VALIDATION_ERROR_18400d56);
+            skip |= ValidateImageArrayLayerRange(device_data, cb_node, dst_image_state, rgn.dstSubresource.baseArrayLayer,
+                                                 rgn.dstSubresource.layerCount, i, "vkCmdBlitImage()", "dstSubresource",
+                                                 VALIDATION_ERROR_18400d58);
             // Warn for zero-sized regions
             if ((rgn.srcOffsets[0].x == rgn.srcOffsets[1].x) || (rgn.srcOffsets[0].y == rgn.srcOffsets[1].y) ||
                 (rgn.srcOffsets[0].z == rgn.srcOffsets[1].z)) {
@@ -2483,16 +2477,6 @@
                 skip |= log_msg(report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
                                 HandleToUint64(cb_node->commandBuffer), DRAWSTATE_INVALID_EXTENTS, "%s", ss.str().c_str());
             }
-            if (rgn.srcSubresource.layerCount == 0) {
-                char const str[] = "vkCmdBlitImage: number of layers in source subresource is zero";
-                skip |= log_msg(report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
-                                HandleToUint64(cb_node->commandBuffer), DRAWSTATE_MISMATCHED_IMAGE_ASPECT, str);
-            }
-            if (rgn.dstSubresource.layerCount == 0) {
-                char const str[] = "vkCmdBlitImage: number of layers in destination subresource is zero";
-                skip |= log_msg(report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
-                                HandleToUint64(cb_node->commandBuffer), DRAWSTATE_MISMATCHED_IMAGE_ASPECT, str);
-            }
 
             // Check that src/dst layercounts match
             if (rgn.srcSubresource.layerCount != rgn.dstSubresource.layerCount) {
@@ -2574,12 +2558,7 @@
                             "vkCmdBlitImage: region [%d] srcOffset[].z values (%1d, %1d) exceed srcSubresource depth extent (%1d).",
                             i, rgn.srcOffsets[0].z, rgn.srcOffsets[1].z, src_extent.depth);
             }
-            if (rgn.srcSubresource.mipLevel >= src_image_state->createInfo.mipLevels) {
-                skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
-                                HandleToUint64(cb_node->commandBuffer), VALIDATION_ERROR_184001ae,
-                                "vkCmdBlitImage: region [%d] source image, attempt to access a non-existant mip level %1d.", i,
-                                rgn.srcSubresource.mipLevel);
-            } else if (oob) {
+            if (oob) {
                 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
                                 HandleToUint64(cb_node->commandBuffer), VALIDATION_ERROR_184001ae,
                                 "vkCmdBlitImage: region [%d] source image blit region exceeds image dimensions.", i);
@@ -2635,12 +2614,7 @@
                             "vkCmdBlitImage: region [%d] dstOffset[].z values (%1d, %1d) exceed dstSubresource depth extent (%1d).",
                             i, rgn.dstOffsets[0].z, rgn.dstOffsets[1].z, dst_extent.depth);
             }
-            if (rgn.dstSubresource.mipLevel >= dst_image_state->createInfo.mipLevels) {
-                skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
-                                HandleToUint64(cb_node->commandBuffer), VALIDATION_ERROR_184001b0,
-                                "vkCmdBlitImage: region [%d] destination image, attempt to access a non-existant mip level %1d.", i,
-                                rgn.dstSubresource.mipLevel);
-            } else if (oob) {
+            if (oob) {
                 skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
                                 HandleToUint64(cb_node->commandBuffer), VALIDATION_ERROR_184001b0,
                                 "vkCmdBlitImage: region [%d] destination image blit region exceeds image dimensions.", i);
@@ -3089,6 +3063,35 @@
     return skip;
 }
 
+bool ValidateImageSubresourceLayers(layer_data *dev_data, const GLOBAL_CB_NODE *cb_node,
+                                    const VkImageSubresourceLayers *subresource_layers, char const *func_name, char const *member,
+                                    uint32_t i) {
+    bool skip = false;
+    const debug_report_data *report_data = core_validation::GetReportData(dev_data);
+    // layerCount must not be zero
+    if (subresource_layers->layerCount == 0) {
+        skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
+                        HandleToUint64(cb_node->commandBuffer), VALIDATION_ERROR_0a600d48,
+                        "In %s, pRegions[%u].%s.layerCount must not be zero.", func_name, i, member);
+    }
+    // aspectMask must not contain VK_IMAGE_ASPECT_METADATA_BIT
+    if (subresource_layers->aspectMask & VK_IMAGE_ASPECT_METADATA_BIT) {
+        skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
+                        HandleToUint64(cb_node->commandBuffer), VALIDATION_ERROR_0a600150,
+                        "In %s, pRegions[%u].%s.aspectMask has VK_IMAGE_ASPECT_METADATA_BIT set.", func_name, i, member);
+    }
+    // if aspectMask contains COLOR, it must not contain either DEPTH or STENCIL
+    if ((subresource_layers->aspectMask & VK_IMAGE_ASPECT_COLOR_BIT) &&
+        (subresource_layers->aspectMask & (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT))) {
+        skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
+                        HandleToUint64(cb_node->commandBuffer), VALIDATION_ERROR_0a60014e,
+                        "In %s, pRegions[%u].%s.aspectMask has VK_IMAGE_ASPECT_COLOR_BIT and either VK_IMAGE_ASPECT_DEPTH_BIT or "
+                        "VK_IMAGE_ASPECT_STENCIL_BIT set.",
+                        func_name, i, member);
+    }
+    return skip;
+}
+
 // Helper function to validate usage flags for buffers. For given buffer_state send actual vs. desired usage off to helper above
 // where an error will be flagged if usage is not correct
 bool ValidateBufferUsageFlags(layer_data *device_data, BUFFER_STATE const *buffer_state, VkFlags desired, bool strict,
@@ -4033,11 +4036,18 @@
         core_validation::GetDeviceExtensions(device_data)->vk_khr_shared_presentable_image ? VALIDATION_ERROR_19200aea
                                                                                            : VALIDATION_ERROR_1920017c;
     for (uint32_t i = 0; i < regionCount; ++i) {
+        skip |= ValidateImageSubresourceLayers(device_data, cb_node, &pRegions[i].imageSubresource, "vkCmdCopyImageToBuffer()",
+                                               "imageSubresource", i);
         skip |= VerifyImageLayout(device_data, cb_node, src_image_state, pRegions[i].imageSubresource, srcImageLayout,
                                   VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, "vkCmdCopyImageToBuffer()", invalid_layout_vuid,
                                   VALIDATION_ERROR_1920017a, &hit_error);
         skip |= ValidateCopyBufferImageTransferGranularityRequirements(device_data, cb_node, src_image_state, &pRegions[i], i,
                                                                        "vkCmdCopyImageToBuffer()", VALIDATION_ERROR_19200e04);
+        skip |= ValidateImageMipLevel(device_data, cb_node, src_image_state, pRegions[i].imageSubresource.mipLevel, i,
+                                      "vkCmdCopyImageToBuffer()", "imageSubresource", VALIDATION_ERROR_19200d4e);
+        skip |= ValidateImageArrayLayerRange(device_data, cb_node, src_image_state, pRegions[i].imageSubresource.baseArrayLayer,
+                                             pRegions[i].imageSubresource.layerCount, i, "vkCmdCopyImageToBuffer()",
+                                             "imageSubresource", VALIDATION_ERROR_19200d50);
     }
     return skip;
 }
@@ -4094,11 +4104,18 @@
         core_validation::GetDeviceExtensions(device_data)->vk_khr_shared_presentable_image ? VALIDATION_ERROR_18e00ae8
                                                                                            : VALIDATION_ERROR_18e0016a;
     for (uint32_t i = 0; i < regionCount; ++i) {
+        skip |= ValidateImageSubresourceLayers(device_data, cb_node, &pRegions[i].imageSubresource, "vkCmdCopyBufferToImage()",
+                                               "imageSubresource", i);
         skip |= VerifyImageLayout(device_data, cb_node, dst_image_state, pRegions[i].imageSubresource, dstImageLayout,
                                   VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, "vkCmdCopyBufferToImage()", invalid_layout_vuid,
                                   VALIDATION_ERROR_18e00168, &hit_error);
         skip |= ValidateCopyBufferImageTransferGranularityRequirements(device_data, cb_node, dst_image_state, &pRegions[i], i,
                                                                        "vkCmdCopyBufferToImage()", VALIDATION_ERROR_18e00e02);
+        skip |= ValidateImageMipLevel(device_data, cb_node, dst_image_state, pRegions[i].imageSubresource.mipLevel, i,
+                                      "vkCmdCopyBufferToImage()", "imageSubresource", VALIDATION_ERROR_18e00d4a);
+        skip |= ValidateImageArrayLayerRange(device_data, cb_node, dst_image_state, pRegions[i].imageSubresource.baseArrayLayer,
+                                             pRegions[i].imageSubresource.layerCount, i, "vkCmdCopyBufferToImage()",
+                                             "imageSubresource", VALIDATION_ERROR_18e00d4c);
     }
     return skip;
 }
diff --git a/layers/buffer_validation.h b/layers/buffer_validation.h
index 58580d0..3042a33 100644
--- a/layers/buffer_validation.h
+++ b/layers/buffer_validation.h
@@ -180,6 +180,10 @@
                                      char const *func_name, UNIQUE_VALIDATION_ERROR_CODE linear_vuid,
                                      UNIQUE_VALIDATION_ERROR_CODE optimal_vuid);
 
+bool ValidateImageSubresourceLayers(layer_data *dev_data, const GLOBAL_CB_NODE *cb_node,
+                                    const VkImageSubresourceLayers *subresource_layers, char const *func_name, char const *member,
+                                    uint32_t i);
+
 bool ValidateBufferUsageFlags(layer_data *dev_data, BUFFER_STATE const *buffer_state, VkFlags desired, bool strict,
                               int32_t const msgCode, char const *func_name, char const *usage_string);
 
@@ -215,6 +219,12 @@
                                                             const IMAGE_STATE *img, const VkBufferImageCopy *region,
                                                             const uint32_t i, const char *function,
                                                             UNIQUE_VALIDATION_ERROR_CODE vuid);
+bool ValidateImageMipLevel(layer_data *device_data, const GLOBAL_CB_NODE *cb_node, const IMAGE_STATE *img, uint32_t mip_level,
+                           const uint32_t i, const char *function, const char *member, UNIQUE_VALIDATION_ERROR_CODE vuid);
+
+bool ValidateImageArrayLayerRange(layer_data *device_data, const GLOBAL_CB_NODE *cb_node, const IMAGE_STATE *img,
+                                  const uint32_t base_layer, const uint32_t layer_count, const uint32_t i, const char *function,
+                                  const char *member, UNIQUE_VALIDATION_ERROR_CODE vuid);
 
 void PreCallRecordCmdCopyImage(layer_data *device_data, GLOBAL_CB_NODE *cb_node, IMAGE_STATE *src_image_state,
                                IMAGE_STATE *dst_image_state, uint32_t region_count, const VkImageCopy *regions,
diff --git a/layers/vk_validation_error_database.txt b/layers/vk_validation_error_database.txt
index f5a3d65..b0aaa33 100644
--- a/layers/vk_validation_error_database.txt
+++ b/layers/vk_validation_error_database.txt
@@ -792,7 +792,7 @@
 VALIDATION_ERROR_0a600150~^~Y~^~CopyImageAspectMismatch~^~VkImageSubresourceLayers~^~VUID-VkImageSubresourceLayers-aspectMask-00168~^~core~^~The spec valid usage text states 'aspectMask must not contain VK_IMAGE_ASPECT_METADATA_BIT' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageSubresourceLayers-aspectMask-00168)~^~
 VALIDATION_ERROR_0a600c01~^~Y~^~Unknown~^~VkImageSubresourceLayers~^~VUID-VkImageSubresourceLayers-aspectMask-parameter~^~core~^~The spec valid usage text states 'aspectMask must be a valid combination of VkImageAspectFlagBits values' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageSubresourceLayers-aspectMask-parameter)~^~implicit
 VALIDATION_ERROR_0a600c03~^~Y~^~Unknown~^~VkImageSubresourceLayers~^~VUID-VkImageSubresourceLayers-aspectMask-requiredbitmask~^~core~^~The spec valid usage text states 'aspectMask must not be 0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageSubresourceLayers-aspectMask-requiredbitmask)~^~implicit
-VALIDATION_ERROR_0a600d48~^~N~^~None~^~VkImageSubresourceLayers~^~VUID-VkImageSubresourceLayers-layerCount-01700~^~core~^~The spec valid usage text states 'layerCount must be greater than 0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageSubresourceLayers-layerCount-01700)~^~
+VALIDATION_ERROR_0a600d48~^~Y~^~None~^~VkImageSubresourceLayers~^~VUID-VkImageSubresourceLayers-layerCount-01700~^~core~^~The spec valid usage text states 'layerCount must be greater than 0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageSubresourceLayers-layerCount-01700)~^~
 VALIDATION_ERROR_0a800c01~^~N~^~Unknown~^~VkImageSubresourceRange~^~VUID-VkImageSubresourceRange-aspectMask-parameter~^~core~^~The spec valid usage text states 'aspectMask must be a valid combination of VkImageAspectFlagBits values' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageSubresourceRange-aspectMask-parameter)~^~implicit
 VALIDATION_ERROR_0a800c03~^~Y~^~Unknown~^~VkImageSubresourceRange~^~VUID-VkImageSubresourceRange-aspectMask-requiredbitmask~^~core~^~The spec valid usage text states 'aspectMask must not be 0' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageSubresourceRange-aspectMask-requiredbitmask)~^~implicit
 VALIDATION_ERROR_0a800d0c~^~N~^~None~^~VkImageSubresourceRange~^~VUID-VkImageSubresourceRange-aspectMask-01670~^~(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'If aspectMask includes VK_IMAGE_ASPECT_COLOR_BIT, then it must not include any of VK_IMAGE_ASPECT_PLANE_0_BIT, VK_IMAGE_ASPECT_PLANE_1_BIT, or VK_IMAGE_ASPECT_PLANE_2_BIT' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkImageSubresourceRange-aspectMask-01670)~^~
@@ -1776,10 +1776,10 @@
 VALIDATION_ERROR_18400aee~^~Y~^~InvalidImageLayoutSharedPresentableImage~^~vkCmdBlitImage~^~VUID-vkCmdBlitImage-dstImageLayout-01399~^~(VK_KHR_shared_presentable_image)~^~The spec valid usage text states 'dstImageLayout must be VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdBlitImage-dstImageLayout-01399)~^~
 VALIDATION_ERROR_18400c32~^~N~^~None~^~vkCmdBlitImage~^~VUID-vkCmdBlitImage-srcImage-01561~^~(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'srcImage must not use a format listed in features-formats-requiring-sampler-ycbcr-conversion' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdBlitImage-srcImage-01561)~^~
 VALIDATION_ERROR_18400c34~^~N~^~None~^~vkCmdBlitImage~^~VUID-vkCmdBlitImage-dstImage-01562~^~(VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion)~^~The spec valid usage text states 'dstImage must not use a format listed in features-formats-requiring-sampler-ycbcr-conversion' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdBlitImage-dstImage-01562)~^~
-VALIDATION_ERROR_18400d52~^~N~^~None~^~vkCmdBlitImage~^~VUID-vkCmdBlitImage-srcSubresource-01705~^~core~^~The spec valid usage text states 'The srcSubresource.mipLevel member of each element of pRegions must be less than the mipLevels specified in VkImageCreateInfo when srcImage was created' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdBlitImage-srcSubresource-01705)~^~
-VALIDATION_ERROR_18400d54~^~N~^~None~^~vkCmdBlitImage~^~VUID-vkCmdBlitImage-dstSubresource-01706~^~core~^~The spec valid usage text states 'The dstSubresource.mipLevel member of each element of pRegions must be less than the mipLevels specified in VkImageCreateInfo when dstImage was created' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdBlitImage-dstSubresource-01706)~^~
-VALIDATION_ERROR_18400d56~^~N~^~None~^~vkCmdBlitImage~^~VUID-vkCmdBlitImage-srcSubresource-01707~^~core~^~The spec valid usage text states 'The srcSubresource.baseArrayLayer + srcSubresource.layerCount of each element of pRegions must be less than or equal to the arrayLayers specified in VkImageCreateInfo when srcImage was created' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdBlitImage-srcSubresource-01707)~^~
-VALIDATION_ERROR_18400d58~^~N~^~None~^~vkCmdBlitImage~^~VUID-vkCmdBlitImage-dstSubresource-01708~^~core~^~The spec valid usage text states 'The dstSubresource.baseArrayLayer + dstSubresource.layerCount of each element of pRegions must be less than or equal to the arrayLayers specified in VkImageCreateInfo when dstImage was created' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdBlitImage-dstSubresource-01708)~^~
+VALIDATION_ERROR_18400d52~^~Y~^~None~^~vkCmdBlitImage~^~VUID-vkCmdBlitImage-srcSubresource-01705~^~core~^~The spec valid usage text states 'The srcSubresource.mipLevel member of each element of pRegions must be less than the mipLevels specified in VkImageCreateInfo when srcImage was created' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdBlitImage-srcSubresource-01705)~^~
+VALIDATION_ERROR_18400d54~^~Y~^~None~^~vkCmdBlitImage~^~VUID-vkCmdBlitImage-dstSubresource-01706~^~core~^~The spec valid usage text states 'The dstSubresource.mipLevel member of each element of pRegions must be less than the mipLevels specified in VkImageCreateInfo when dstImage was created' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdBlitImage-dstSubresource-01706)~^~
+VALIDATION_ERROR_18400d56~^~Y~^~None~^~vkCmdBlitImage~^~VUID-vkCmdBlitImage-srcSubresource-01707~^~core~^~The spec valid usage text states 'The srcSubresource.baseArrayLayer + srcSubresource.layerCount of each element of pRegions must be less than or equal to the arrayLayers specified in VkImageCreateInfo when srcImage was created' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdBlitImage-srcSubresource-01707)~^~
+VALIDATION_ERROR_18400d58~^~Y~^~None~^~vkCmdBlitImage~^~VUID-vkCmdBlitImage-dstSubresource-01708~^~core~^~The spec valid usage text states 'The dstSubresource.baseArrayLayer + dstSubresource.layerCount of each element of pRegions must be less than or equal to the arrayLayers specified in VkImageCreateInfo when dstImage was created' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdBlitImage-dstSubresource-01708)~^~
 VALIDATION_ERROR_18400e54~^~N~^~None~^~vkCmdBlitImage~^~VUID-vkCmdBlitImage-commandBuffer-01834~^~(VK_VERSION_1_1)~^~The spec valid usage text states 'If commandBuffer is an unprotected command buffer, then srcImage must not be a protected image' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdBlitImage-commandBuffer-01834)~^~
 VALIDATION_ERROR_18400e56~^~N~^~None~^~vkCmdBlitImage~^~VUID-vkCmdBlitImage-commandBuffer-01835~^~(VK_VERSION_1_1)~^~The spec valid usage text states 'If commandBuffer is an unprotected command buffer, then dstImage must not be a protected image' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdBlitImage-commandBuffer-01835)~^~
 VALIDATION_ERROR_18400e58~^~N~^~None~^~vkCmdBlitImage~^~VUID-vkCmdBlitImage-commandBuffer-01836~^~(VK_VERSION_1_1)~^~The spec valid usage text states 'If commandBuffer is a protected command buffer, then dstImage must not be an unprotected image' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdBlitImage-commandBuffer-01836)~^~
@@ -1888,8 +1888,8 @@
 VALIDATION_ERROR_18e00168~^~Y~^~Unknown~^~vkCmdCopyBufferToImage~^~VUID-vkCmdCopyBufferToImage-dstImageLayout-00180~^~core~^~The spec valid usage text states 'dstImageLayout must specify the layout of the image subresources of dstImage specified in pRegions at the time this command is executed on a VkDevice' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdCopyBufferToImage-dstImageLayout-00180)~^~
 VALIDATION_ERROR_18e0016a~^~Y~^~Unknown~^~vkCmdCopyBufferToImage~^~VUID-vkCmdCopyBufferToImage-dstImageLayout-00181~^~!(VK_KHR_shared_presentable_image)~^~The spec valid usage text states 'dstImageLayout must be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdCopyBufferToImage-dstImageLayout-00181)~^~
 VALIDATION_ERROR_18e00ae8~^~Y~^~InvalidImageLayoutSharedPresentableImage~^~vkCmdCopyBufferToImage~^~VUID-vkCmdCopyBufferToImage-dstImageLayout-01396~^~(VK_KHR_shared_presentable_image)~^~The spec valid usage text states 'dstImageLayout must be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL, or VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdCopyBufferToImage-dstImageLayout-01396)~^~
-VALIDATION_ERROR_18e00d4a~^~N~^~None~^~vkCmdCopyBufferToImage~^~VUID-vkCmdCopyBufferToImage-imageSubresource-01701~^~core~^~The spec valid usage text states 'The imageSubresource.mipLevel member of each element of pRegions must be less than the mipLevels specified in VkImageCreateInfo when dstImage was created' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdCopyBufferToImage-imageSubresource-01701)~^~
-VALIDATION_ERROR_18e00d4c~^~N~^~None~^~vkCmdCopyBufferToImage~^~VUID-vkCmdCopyBufferToImage-imageSubresource-01702~^~core~^~The spec valid usage text states 'The imageSubresource.baseArrayLayer + imageSubresource.layerCount of each element of pRegions must be less than or equal to the arrayLayers specified in VkImageCreateInfo when dstImage was created' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdCopyBufferToImage-imageSubresource-01702)~^~
+VALIDATION_ERROR_18e00d4a~^~Y~^~ImageBufferCopyTests~^~vkCmdCopyBufferToImage~^~VUID-vkCmdCopyBufferToImage-imageSubresource-01701~^~core~^~The spec valid usage text states 'The imageSubresource.mipLevel member of each element of pRegions must be less than the mipLevels specified in VkImageCreateInfo when dstImage was created' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdCopyBufferToImage-imageSubresource-01701)~^~
+VALIDATION_ERROR_18e00d4c~^~Y~^~ImageBufferCopyTests~^~vkCmdCopyBufferToImage~^~VUID-vkCmdCopyBufferToImage-imageSubresource-01702~^~core~^~The spec valid usage text states 'The imageSubresource.baseArrayLayer + imageSubresource.layerCount of each element of pRegions must be less than or equal to the arrayLayers specified in VkImageCreateInfo when dstImage was created' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdCopyBufferToImage-imageSubresource-01702)~^~
 VALIDATION_ERROR_18e00e02~^~Y~^~CompressedImageMipCopyTests~^~vkCmdCopyBufferToImage~^~VUID-vkCmdCopyBufferToImage-imageOffset-01793~^~core~^~The spec valid usage text states 'The imageOffset and and imageExtent members of each element of pRegions must respect the image transfer granularity requirements of commandBuffer's command pool's queue family, as described in VkQueueFamilyProperties' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdCopyBufferToImage-imageOffset-01793)~^~
 VALIDATION_ERROR_18e00e48~^~N~^~None~^~vkCmdCopyBufferToImage~^~VUID-vkCmdCopyBufferToImage-commandBuffer-01828~^~(VK_VERSION_1_1)~^~The spec valid usage text states 'If commandBuffer is an unprotected command buffer, then srcBuffer must not be a protected buffer' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdCopyBufferToImage-commandBuffer-01828)~^~
 VALIDATION_ERROR_18e00e4a~^~N~^~None~^~vkCmdCopyBufferToImage~^~VUID-vkCmdCopyBufferToImage-commandBuffer-01829~^~(VK_VERSION_1_1)~^~The spec valid usage text states 'If commandBuffer is an unprotected command buffer, then dstImage must not be a protected image' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdCopyBufferToImage-commandBuffer-01829)~^~
@@ -1958,8 +1958,8 @@
 VALIDATION_ERROR_1920017e~^~Y~^~None~^~vkCmdCopyImageToBuffer~^~VUID-vkCmdCopyImageToBuffer-dstBuffer-00191~^~core~^~The spec valid usage text states 'dstBuffer must have been created with VK_BUFFER_USAGE_TRANSFER_DST_BIT usage flag' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdCopyImageToBuffer-dstBuffer-00191)~^~
 VALIDATION_ERROR_19200180~^~Y~^~Unknown~^~vkCmdCopyImageToBuffer~^~VUID-vkCmdCopyImageToBuffer-dstBuffer-00192~^~core~^~The spec valid usage text states 'If dstBuffer is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdCopyImageToBuffer-dstBuffer-00192)~^~
 VALIDATION_ERROR_19200aea~^~Y~^~InvalidImageLayoutSharedPresentableImage~^~vkCmdCopyImageToBuffer~^~VUID-vkCmdCopyImageToBuffer-srcImageLayout-01397~^~(VK_KHR_shared_presentable_image)~^~The spec valid usage text states 'srcImageLayout must be VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdCopyImageToBuffer-srcImageLayout-01397)~^~
-VALIDATION_ERROR_19200d4e~^~N~^~None~^~vkCmdCopyImageToBuffer~^~VUID-vkCmdCopyImageToBuffer-imageSubresource-01703~^~core~^~The spec valid usage text states 'The imageSubresource.mipLevel member of each element of pRegions must be less than the mipLevels specified in VkImageCreateInfo when srcImage was created' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdCopyImageToBuffer-imageSubresource-01703)~^~
-VALIDATION_ERROR_19200d50~^~N~^~None~^~vkCmdCopyImageToBuffer~^~VUID-vkCmdCopyImageToBuffer-imageSubresource-01704~^~core~^~The spec valid usage text states 'The imageSubresource.baseArrayLayer + imageSubresource.layerCount of each element of pRegions must be less than or equal to the arrayLayers specified in VkImageCreateInfo when srcImage was created' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdCopyImageToBuffer-imageSubresource-01704)~^~
+VALIDATION_ERROR_19200d4e~^~Y~^~ImageBufferCopyTests~^~vkCmdCopyImageToBuffer~^~VUID-vkCmdCopyImageToBuffer-imageSubresource-01703~^~core~^~The spec valid usage text states 'The imageSubresource.mipLevel member of each element of pRegions must be less than the mipLevels specified in VkImageCreateInfo when srcImage was created' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdCopyImageToBuffer-imageSubresource-01703)~^~
+VALIDATION_ERROR_19200d50~^~Y~^~ImageBufferCopyTests~^~vkCmdCopyImageToBuffer~^~VUID-vkCmdCopyImageToBuffer-imageSubresource-01704~^~core~^~The spec valid usage text states 'The imageSubresource.baseArrayLayer + imageSubresource.layerCount of each element of pRegions must be less than or equal to the arrayLayers specified in VkImageCreateInfo when srcImage was created' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdCopyImageToBuffer-imageSubresource-01704)~^~
 VALIDATION_ERROR_19200e04~^~Y~^~CompressedImageMipCopyTests~^~vkCmdCopyImageToBuffer~^~VUID-vkCmdCopyImageToBuffer-imageOffset-01794~^~core~^~The spec valid usage text states 'The imageOffset and and imageExtent members of each element of pRegions must respect the image transfer granularity requirements of commandBuffer's command pool's queue family, as described in VkQueueFamilyProperties' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdCopyImageToBuffer-imageOffset-01794)~^~
 VALIDATION_ERROR_19200e4e~^~N~^~None~^~vkCmdCopyImageToBuffer~^~VUID-vkCmdCopyImageToBuffer-commandBuffer-01831~^~(VK_VERSION_1_1)~^~The spec valid usage text states 'If commandBuffer is an unprotected command buffer, then srcImage must not be a protected image' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdCopyImageToBuffer-commandBuffer-01831)~^~
 VALIDATION_ERROR_19200e50~^~N~^~None~^~vkCmdCopyImageToBuffer~^~VUID-vkCmdCopyImageToBuffer-commandBuffer-01832~^~(VK_VERSION_1_1)~^~The spec valid usage text states 'If commandBuffer is an unprotected command buffer, then dstBuffer must not be a protected buffer' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdCopyImageToBuffer-commandBuffer-01832)~^~
@@ -2456,10 +2456,10 @@
 VALIDATION_ERROR_1c800ad4~^~N~^~None~^~vkCmdResolveImage~^~VUID-vkCmdResolveImage-srcImage-01386~^~core~^~The spec valid usage text states 'srcImage and dstImage must have been created with the same image format' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdResolveImage-srcImage-01386)~^~
 VALIDATION_ERROR_1c800af0~^~Y~^~InvalidImageLayoutSharedPresentableImage~^~vkCmdResolveImage~^~VUID-vkCmdResolveImage-srcImageLayout-01400~^~(VK_KHR_shared_presentable_image)~^~The spec valid usage text states 'srcImageLayout must be VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdResolveImage-srcImageLayout-01400)~^~
 VALIDATION_ERROR_1c800af2~^~Y~^~InvalidImageLayoutSharedPresentableImage~^~vkCmdResolveImage~^~VUID-vkCmdResolveImage-dstImageLayout-01401~^~(VK_KHR_shared_presentable_image)~^~The spec valid usage text states 'dstImageLayout must be VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdResolveImage-dstImageLayout-01401)~^~
-VALIDATION_ERROR_1c800d5a~^~N~^~None~^~vkCmdResolveImage~^~VUID-vkCmdResolveImage-srcSubresource-01709~^~core~^~The spec valid usage text states 'The srcSubresource.mipLevel member of each element of pRegions must be less than the mipLevels specified in VkImageCreateInfo when srcImage was created' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdResolveImage-srcSubresource-01709)~^~
-VALIDATION_ERROR_1c800d5c~^~N~^~None~^~vkCmdResolveImage~^~VUID-vkCmdResolveImage-dstSubresource-01710~^~core~^~The spec valid usage text states 'The dstSubresource.mipLevel member of each element of pRegions must be less than the mipLevels specified in VkImageCreateInfo when dstImage was created' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdResolveImage-dstSubresource-01710)~^~
-VALIDATION_ERROR_1c800d5e~^~N~^~None~^~vkCmdResolveImage~^~VUID-vkCmdResolveImage-srcSubresource-01711~^~core~^~The spec valid usage text states 'The srcSubresource.baseArrayLayer + srcSubresource.layerCount of each element of pRegions must be less than or equal to the arrayLayers specified in VkImageCreateInfo when srcImage was created' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdResolveImage-srcSubresource-01711)~^~
-VALIDATION_ERROR_1c800d60~^~N~^~None~^~vkCmdResolveImage~^~VUID-vkCmdResolveImage-dstSubresource-01712~^~core~^~The spec valid usage text states 'The dstSubresource.baseArrayLayer + dstSubresource.layerCount of each element of pRegions must be less than or equal to the arrayLayers specified in VkImageCreateInfo when dstImage was created' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdResolveImage-dstSubresource-01712)~^~
+VALIDATION_ERROR_1c800d5a~^~Y~^~None~^~vkCmdResolveImage~^~VUID-vkCmdResolveImage-srcSubresource-01709~^~core~^~The spec valid usage text states 'The srcSubresource.mipLevel member of each element of pRegions must be less than the mipLevels specified in VkImageCreateInfo when srcImage was created' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdResolveImage-srcSubresource-01709)~^~
+VALIDATION_ERROR_1c800d5c~^~Y~^~None~^~vkCmdResolveImage~^~VUID-vkCmdResolveImage-dstSubresource-01710~^~core~^~The spec valid usage text states 'The dstSubresource.mipLevel member of each element of pRegions must be less than the mipLevels specified in VkImageCreateInfo when dstImage was created' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdResolveImage-dstSubresource-01710)~^~
+VALIDATION_ERROR_1c800d5e~^~Y~^~None~^~vkCmdResolveImage~^~VUID-vkCmdResolveImage-srcSubresource-01711~^~core~^~The spec valid usage text states 'The srcSubresource.baseArrayLayer + srcSubresource.layerCount of each element of pRegions must be less than or equal to the arrayLayers specified in VkImageCreateInfo when srcImage was created' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdResolveImage-srcSubresource-01711)~^~
+VALIDATION_ERROR_1c800d60~^~Y~^~None~^~vkCmdResolveImage~^~VUID-vkCmdResolveImage-dstSubresource-01712~^~core~^~The spec valid usage text states 'The dstSubresource.baseArrayLayer + dstSubresource.layerCount of each element of pRegions must be less than or equal to the arrayLayers specified in VkImageCreateInfo when dstImage was created' (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdResolveImage-dstSubresource-01712)~^~
 VALIDATION_ERROR_1c800e5a~^~N~^~None~^~vkCmdResolveImage~^~VUID-vkCmdResolveImage-commandBuffer-01837~^~(VK_VERSION_1_1)~^~The spec valid usage text states 'If commandBuffer is an unprotected command buffer, then srcImage must not be a protected image' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdResolveImage-commandBuffer-01837)~^~
 VALIDATION_ERROR_1c800e5c~^~N~^~None~^~vkCmdResolveImage~^~VUID-vkCmdResolveImage-commandBuffer-01838~^~(VK_VERSION_1_1)~^~The spec valid usage text states 'If commandBuffer is an unprotected command buffer, then dstImage must not be a protected image' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdResolveImage-commandBuffer-01838)~^~
 VALIDATION_ERROR_1c800e5e~^~N~^~None~^~vkCmdResolveImage~^~VUID-vkCmdResolveImage-commandBuffer-01839~^~(VK_VERSION_1_1)~^~The spec valid usage text states 'If commandBuffer is a protected command buffer, then dstImage must not be an unprotected image' (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-vkCmdResolveImage-commandBuffer-01839)~^~
diff --git a/tests/layer_validation_tests.cpp b/tests/layer_validation_tests.cpp
index 096b756..aa58077 100644
--- a/tests/layer_validation_tests.cpp
+++ b/tests/layer_validation_tests.cpp
@@ -4017,13 +4017,16 @@
     blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
     blitRegion.srcSubresource.baseArrayLayer = 1;
     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_09a001e0);
+    m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
+                                         VALIDATION_ERROR_18400d56);  // base+count > total layer count
     vkCmdBlitImage(m_commandBuffer->handle(), color_3D_img.image(), color_3D_img.Layout(), color_3D_img.image(),
                    color_3D_img.Layout(), 1, &blitRegion, VK_FILTER_NEAREST);
     m_errorMonitor->VerifyFound();
     blitRegion.srcSubresource.baseArrayLayer = 0;
     blitRegion.srcSubresource.layerCount = 0;
-    blitRegion.dstSubresource.layerCount = 0;
     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_09a001e0);
+    m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_0a600d48);  // layer count == 0 (src)
+    m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_09a001de);  // src/dst layer count mismatch
     vkCmdBlitImage(m_commandBuffer->handle(), color_3D_img.image(), color_3D_img.Layout(), color_3D_img.image(),
                    color_3D_img.Layout(), 1, &blitRegion, VK_FILTER_NEAREST);
     m_errorMonitor->VerifyFound();
@@ -19176,7 +19179,6 @@
 
 TEST_F(VkLayerTest, ImageBufferCopyTests) {
     TEST_DESCRIPTION("Image to buffer and buffer to image tests");
-
     ASSERT_NO_FATAL_FAILURE(Init());
     VkFormatProperties format_props = m_device->format_properties(VK_FORMAT_D24_UNORM_S8_UINT);
     if (!(format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT)) {
@@ -19364,6 +19366,33 @@
                            &region);
     m_errorMonitor->VerifyFound();
 
+    // Out-of-range mip levels should fail
+    region.imageSubresource.mipLevel = image_16k.create_info().mipLevels + 1;
+    m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_19200d4e);
+    m_errorMonitor->SetDesiredFailureMsg(
+        VK_DEBUG_REPORT_ERROR_BIT_EXT,
+        VALIDATION_ERROR_1920016c);  // unavoidable "region exceeds image bounds" for non-existent mip
+    vkCmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1, &region);
+    m_errorMonitor->VerifyFound();
+    m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_18e00d4a);
+    m_errorMonitor->SetDesiredFailureMsg(
+        VK_DEBUG_REPORT_ERROR_BIT_EXT,
+        VALIDATION_ERROR_18e00158);  // unavoidable "region exceeds image bounds" for non-existent mip
+    vkCmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
+    m_errorMonitor->VerifyFound();
+    region.imageSubresource.mipLevel = 0;
+
+    // Out-of-range array layers should fail
+    region.imageSubresource.baseArrayLayer = image_16k.create_info().arrayLayers;
+    region.imageSubresource.layerCount = 1;
+    m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_19200d50);
+    vkCmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1, &region);
+    m_errorMonitor->VerifyFound();
+    m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_18e00d4c);
+    vkCmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
+    m_errorMonitor->VerifyFound();
+    region.imageSubresource.baseArrayLayer = 0;
+
     // Test Depth/Stencil copies
     if (missing_ds_support) {
         printf("             Depth / Stencil formats unsupported - skipping D/S tests.\n");
@@ -19563,6 +19592,54 @@
                                1, &region);
         m_errorMonitor->VerifyFound();
     }
+
+#if 0
+    // Find a format that doesn't support transfering
+    VkFormat nontransferable_format = VK_FORMAT_UNDEFINED;
+    if (nontransferable_format == VK_FORMAT_UNDEFINED) {
+      vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_R8_USCALED, &props);
+      if (!(props.linearTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) &&
+          !(props.linearTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) &&
+          !(props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) &&
+          !(props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT)) {
+        nontransferable_format = VK_FORMAT_R8_USCALED;
+      }
+    }
+    if (nontransferable_format == VK_FORMAT_UNDEFINED) {
+      printf("             could not find non-transferable format; skipping part of test.\n");
+    } else {
+      const uint32_t image_dim = 128;
+      VkImageObj src_image_linear(m_device);
+      VkImageObj dst_image_linear(m_device);
+      VkImageObj src_image_optimal(m_device);
+      VkImageObj dst_image_optimal(m_device);
+      src_image_linear.Init(image_dim, image_dim, 1, nontransferable_format, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_LINEAR);
+      dst_image_linear.Init(image_dim, image_dim, 1, nontransferable_format, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR);
+      src_image_optimal.Init(image_dim, image_dim, 1, nontransferable_format, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL);
+      dst_image_optimal.Init(image_dim, image_dim, 1, nontransferable_format, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL);
+      ASSERT_TRUE(src_image_linear.initialized());
+      ASSERT_TRUE(dst_image_linear.initialized());
+      ASSERT_TRUE(src_image_optimal.initialized());
+      ASSERT_TRUE(dst_image_optimal.initialized());
+
+      vk_testing::Buffer buffer;
+      reqs = 0;
+      buffer.init_as_src_and_dst(*m_device, image_dim*image_dim*4, reqs);
+
+      region = {};
+      region.bufferRowLength = image_dim;
+      region.bufferImageHeight = image_dim;
+      region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
+      region.imageSubresource.layerCount = 1;
+      region.imageOffset = {0,0,0};
+      region.imageExtent = {image_dim, image_dim, 1};
+      region.bufferOffset = 0;
+
+      m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_18e02413);
+      vkCmdCopyBufferToImage(m_commandBuffer->handle(), buffer.handle(), dst_image_linear.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
+      m_errorMonitor->VerifyFound();
+    }
+#endif
 }
 
 TEST_F(VkLayerTest, MiscImageLayerTests) {
@@ -21409,14 +21486,14 @@
     copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
     copyRegion.srcSubresource.mipLevel = 0;
     copyRegion.srcSubresource.baseArrayLayer = 0;
-    copyRegion.srcSubresource.layerCount = 0;
+    copyRegion.srcSubresource.layerCount = 1;
     copyRegion.srcOffset.x = 0;
     copyRegion.srcOffset.y = 0;
     copyRegion.srcOffset.z = 0;
     copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
     copyRegion.dstSubresource.mipLevel = 0;
     copyRegion.dstSubresource.baseArrayLayer = 0;
-    copyRegion.dstSubresource.layerCount = 0;
+    copyRegion.dstSubresource.layerCount = 1;
     copyRegion.dstOffset.x = 0;
     copyRegion.dstOffset.y = 0;
     copyRegion.dstOffset.z = 0;
@@ -21462,14 +21539,14 @@
     copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
     copyRegion.srcSubresource.mipLevel = 0;
     copyRegion.srcSubresource.baseArrayLayer = 0;
-    copyRegion.srcSubresource.layerCount = 0;
+    copyRegion.srcSubresource.layerCount = 1;
     copyRegion.srcOffset.x = 0;
     copyRegion.srcOffset.y = 0;
     copyRegion.srcOffset.z = 0;
     copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
     copyRegion.dstSubresource.mipLevel = 0;
     copyRegion.dstSubresource.baseArrayLayer = 0;
-    copyRegion.dstSubresource.layerCount = 0;
+    copyRegion.dstSubresource.layerCount = 1;
     copyRegion.dstOffset.x = 0;
     copyRegion.dstOffset.y = 0;
     copyRegion.dstOffset.z = 0;
@@ -21632,19 +21709,40 @@
 
     // Illegal combinations of aspect bits - VU 01221
     copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;  // color must be alone
-    copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
+    copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_0a60014e);
     // These aspect/format mismatches are redundant but unavoidable here
     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_09c0011c);
-    m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_09c0011e);
+    m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_09c00c1e);
     vkCmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
                    VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
     m_errorMonitor->VerifyFound();
+    // same test for dstSubresource
+    copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
+    copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;  // color must be alone
+    m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_0a60014e);
+    // These aspect/format mismatches are redundant but unavoidable here
+    m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_09c0011e);
+    m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_09c00c1e);
+    vkCmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
+                   VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
+    m_errorMonitor->VerifyFound();
+
     // Metadata aspect is illegal - VU 01222
     copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
+    copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
+    m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_0a600150);
+    // These aspect/format mismatches are redundant but unavoidable here
+    m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_09c00c1e);
+    vkCmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
+                   VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
+    m_errorMonitor->VerifyFound();
+    // same test for dstSubresource
+    copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
     copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_0a600150);
     // These aspect/format mismatches are redundant but unavoidable here
+    m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_09c00c1e);
     vkCmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
                    VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
     m_errorMonitor->VerifyFound();