layers: Validate barrier subresource range.

Check subresource range for image memory barriers.
diff --git a/layers/image.cpp b/layers/image.cpp
index 64deef4..b937dfc 100644
--- a/layers/image.cpp
+++ b/layers/image.cpp
@@ -846,6 +846,40 @@
         srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions, filter);
 }
 
+VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdPipelineBarrier(
+    VkCommandBuffer                             commandBuffer,
+    VkPipelineStageFlags                        srcStageMask,
+    VkPipelineStageFlags                        dstStageMask,
+    VkDependencyFlags                           dependencyFlags,
+    uint32_t                                    memoryBarrierCount,
+    const void* const*                          ppMemoryBarriers)
+{
+    VkBool32 skipCall = VK_FALSE;
+    layer_data *device_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map);
+
+    for (uint32_t i = 0; i < memoryBarrierCount; ++i)
+    {
+        VkImageMemoryBarrier const*const barrier = (VkImageMemoryBarrier const*const)ppMemoryBarriers[i];
+        if (barrier->sType == VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER)
+        {
+            if (barrier->subresourceRange.layerCount == 0)
+            {
+                std::stringstream ss;
+                ss << "vkCmdPipelineBarrier called with 0 in ppMemoryBarriers[" << i << "]->subresourceRange.layerCount.";
+                skipCall |= log_msg(device_data->report_data, VK_DBG_REPORT_ERROR_BIT, (VkDbgObjectType)0, 0, 0, 0, "IMAGE", "%s", ss.str().c_str());
+            }
+        }
+    }
+
+    if (skipCall)
+    {
+        return;
+    }
+
+    device_data->device_dispatch_table->CmdPipelineBarrier(commandBuffer, srcStageMask, dstStageMask, dependencyFlags,
+        memoryBarrierCount, ppMemoryBarriers);
+}
+
 VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdResolveImage(
     VkCommandBuffer       commandBuffer,
     VkImage               srcImage,
@@ -997,6 +1031,8 @@
         return (PFN_vkVoidFunction) vkCmdCopyBufferToImage;
     if (!strcmp(funcName, "vkCmdBlitImage"))
         return (PFN_vkVoidFunction) vkCmdBlitImage;
+    if (!strcmp(funcName, "vkCmdPipelineBarrier"))
+        return (PFN_vkVoidFunction) vkCmdPipelineBarrier;
     if (!strcmp(funcName, "vkCmdResolveImage"))
         return (PFN_vkVoidFunction) vkCmdResolveImage;
     if (!strcmp(funcName, "vkGetImageSubresourceLayout"))