From 105ca5005b1d60af268e0a6a3f70dd93bd55a9ab Mon Sep 17 00:00:00 2001 From: Jeremy Hayes Date: Tue, 17 Nov 2015 18:19:55 -0700 Subject: [PATCH] layers: Validate barrier subresource range. Check subresource range for image memory barriers. --- demos/cube.c | 2 +- demos/tri.c | 2 +- layers/image.cpp | 36 ++++++++++++++++++++++++++++++++++++ 3 files changed, 38 insertions(+), 2 deletions(-) diff --git a/demos/cube.c b/demos/cube.c index a4e9943..60be497 100644 --- a/demos/cube.c +++ b/demos/cube.c @@ -505,7 +505,7 @@ static void demo_set_image_layout( .oldLayout = old_image_layout, .newLayout = new_image_layout, .image = image, - .subresourceRange = { aspectMask, 0, 1, 0, 0 } + .subresourceRange = { aspectMask, 0, 1, 0, 1 } }; if (new_image_layout == VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL) { diff --git a/demos/tri.c b/demos/tri.c index bfad7a9..91d6821 100644 --- a/demos/tri.c +++ b/demos/tri.c @@ -349,7 +349,7 @@ static void demo_set_image_layout( .oldLayout = old_image_layout, .newLayout = new_image_layout, .image = image, - .subresourceRange = { aspectMask, 0, 1, 0, 0 } + .subresourceRange = { aspectMask, 0, 1, 0, 1 } }; if (new_image_layout == VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL) { 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 @@ VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdBlitImage( 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 @@ VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkD 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")) -- 2.7.4