aboutsummaryrefslogtreecommitdiff
path: root/layers/image.cpp
diff options
context:
space:
mode:
authorJeremy Hayes <jeremy@lunarg.com>2015-11-17 18:19:55 -0700
committerJeremy Hayes <jeremy@lunarg.com>2015-11-18 10:04:39 -0700
commit105ca5005b1d60af268e0a6a3f70dd93bd55a9ab (patch)
tree35a77a6425509767df350c5e48c6f80c31a0f125 /layers/image.cpp
parenta66043a59144151ec7bf2354f9a36736f66623e4 (diff)
downloadusermoji-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.cpp36
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"))