tests: Add test for Resolve with invalid subresource
diff --git a/layers/vk_validation_error_database.txt b/layers/vk_validation_error_database.txt
index ded8a5c..63e5da8 100644
--- a/layers/vk_validation_error_database.txt
+++ b/layers/vk_validation_error_database.txt
@@ -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~^~None~^~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~^~None~^~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~^~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_1c800d5a~^~Y~^~ResolveInvalidSubresource~^~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~^~ResolveInvalidSubresource~^~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~^~ResolveInvalidSubresource~^~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~^~ResolveInvalidSubresource~^~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 e359cf9..3f6638b 100644
--- a/tests/layer_validation_tests.cpp
+++ b/tests/layer_validation_tests.cpp
@@ -22510,6 +22510,101 @@
     m_commandBuffer->end();
 }
 
+TEST_F(VkLayerTest, ResolveInvalidSubresource) {
+    ASSERT_NO_FATAL_FAILURE(Init());
+
+    // Create two images of different types and try to copy between them
+    VkImageObj srcImage(m_device);
+    VkImageObj dstImage(m_device);
+
+    VkImageCreateInfo image_create_info = {};
+    image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
+    image_create_info.pNext = NULL;
+    image_create_info.imageType = VK_IMAGE_TYPE_2D;
+    image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
+    image_create_info.extent.width = 32;
+    image_create_info.extent.height = 32;
+    image_create_info.extent.depth = 1;
+    image_create_info.mipLevels = 1;
+    image_create_info.arrayLayers = 1;
+    image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
+    image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
+    image_create_info.usage =
+        VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
+    // Note: Some implementations expect color attachment usage for any
+    // multisample surface
+    image_create_info.flags = 0;
+    srcImage.init(&image_create_info);
+    ASSERT_TRUE(srcImage.initialized());
+
+    // Note: Some implementations expect color attachment usage for any
+    // multisample surface
+    image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
+    dstImage.init(&image_create_info);
+    ASSERT_TRUE(dstImage.initialized());
+
+    m_commandBuffer->begin();
+    // source image must have valid contents before resolve
+    VkClearColorValue clear_color = {{0, 0, 0, 0}};
+    VkImageSubresourceRange subresource = {};
+    subresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
+    subresource.layerCount = 1;
+    subresource.levelCount = 1;
+    srcImage.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
+    m_commandBuffer->ClearColorImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &clear_color, 1, &subresource);
+    srcImage.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
+    dstImage.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
+
+    VkImageResolve resolveRegion;
+    resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
+    resolveRegion.srcSubresource.mipLevel = 0;
+    resolveRegion.srcSubresource.baseArrayLayer = 0;
+    resolveRegion.srcSubresource.layerCount = 1;
+    resolveRegion.srcOffset.x = 0;
+    resolveRegion.srcOffset.y = 0;
+    resolveRegion.srcOffset.z = 0;
+    resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
+    resolveRegion.dstSubresource.mipLevel = 0;
+    resolveRegion.dstSubresource.baseArrayLayer = 0;
+    resolveRegion.dstSubresource.layerCount = 1;
+    resolveRegion.dstOffset.x = 0;
+    resolveRegion.dstOffset.y = 0;
+    resolveRegion.dstOffset.z = 0;
+    resolveRegion.extent.width = 1;
+    resolveRegion.extent.height = 1;
+    resolveRegion.extent.depth = 1;
+    // invalid source mip level
+    resolveRegion.srcSubresource.mipLevel = image_create_info.mipLevels;
+    m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdResolveImage-srcSubresource-01709");
+    m_commandBuffer->ResolveImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dstImage.image(),
+                                  VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &resolveRegion);
+    m_errorMonitor->VerifyFound();
+    resolveRegion.srcSubresource.mipLevel = 0;
+    // invalid dest mip level
+    resolveRegion.dstSubresource.mipLevel = image_create_info.mipLevels;
+    m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdResolveImage-dstSubresource-01710");
+    m_commandBuffer->ResolveImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dstImage.image(),
+                                  VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &resolveRegion);
+    m_errorMonitor->VerifyFound();
+    resolveRegion.dstSubresource.mipLevel = 0;
+    // invalid source array layer range
+    resolveRegion.srcSubresource.baseArrayLayer = image_create_info.arrayLayers;
+    m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdResolveImage-srcSubresource-01711");
+    m_commandBuffer->ResolveImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dstImage.image(),
+                                  VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &resolveRegion);
+    m_errorMonitor->VerifyFound();
+    resolveRegion.srcSubresource.baseArrayLayer = 0;
+    // invalid dest array layer range
+    resolveRegion.dstSubresource.baseArrayLayer = image_create_info.arrayLayers;
+    m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdResolveImage-dstSubresource-01712");
+    m_commandBuffer->ResolveImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dstImage.image(),
+                                  VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &resolveRegion);
+    m_errorMonitor->VerifyFound();
+    resolveRegion.dstSubresource.baseArrayLayer = 0;
+
+    m_commandBuffer->end();
+}
+
 TEST_F(VkLayerTest, DepthStencilImageViewWithColorAspectBitError) {
     // Create a single Image descriptor and cause it to first hit an error due
     //  to using a DS format, then cause it to hit error due to COLOR_BIT not