diff options
| author | Jeremy Hayes <jeremy@lunarg.com> | 2015-11-17 18:19:55 -0700 |
|---|---|---|
| committer | Jeremy Hayes <jeremy@lunarg.com> | 2015-11-18 10:04:39 -0700 |
| commit | 105ca5005b1d60af268e0a6a3f70dd93bd55a9ab (patch) | |
| tree | 35a77a6425509767df350c5e48c6f80c31a0f125 /layers/image.cpp | |
| parent | a66043a59144151ec7bf2354f9a36736f66623e4 (diff) | |
| download | usermoji-105ca5005b1d60af268e0a6a3f70dd93bd55a9ab.tar.xz | |
layers: Validate barrier subresource range.
Check subresource range for image memory barriers.
Diffstat (limited to 'layers/image.cpp')
| -rw-r--r-- | layers/image.cpp | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/layers/image.cpp b/layers/image.cpp index 64deef4e..b937dfc6 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")) |
