aboutsummaryrefslogtreecommitdiff
path: root/layers
diff options
context:
space:
mode:
authorMichael Lentine <mlentine@google.com>2016-02-11 22:10:08 -0600
committerJon Ashburn <jon@lunarg.com>2016-02-26 10:21:28 -0700
commit0d6e3a8e9374aedeaed8b7d6cf83c3c46fec7f01 (patch)
tree42e0af3f351fbdabd0c291f5b7b6fa550c98ee61 /layers
parente94ace8db9f48d872109d0d30fcbd1f85866a6ce (diff)
downloadusermoji-0d6e3a8e9374aedeaed8b7d6cf83c3c46fec7f01.tar.xz
layers: Validate image barrier in draw_state
Diffstat (limited to 'layers')
-rw-r--r--layers/draw_state.cpp80
1 files changed, 79 insertions, 1 deletions
diff --git a/layers/draw_state.cpp b/layers/draw_state.cpp
index 0a5ea990..5b0d0dbc 100644
--- a/layers/draw_state.cpp
+++ b/layers/draw_state.cpp
@@ -82,6 +82,7 @@ struct devExts {
VkBool32 debug_marker_enabled;
VkBool32 wsi_enabled;
unordered_map<VkSwapchainKHR, SWAPCHAIN_NODE*> swapchainMap;
+ unordered_map<VkImage, VkSwapchainKHR> imageToSwapchainMap;
};
// fwd decls
@@ -6345,9 +6346,84 @@ VkBool32 ValidateBarriers(VkCommandBuffer cmdBuffer, uint32_t memBarrierCount,
DRAWSTATE_INVALID_BARRIER, "DS",
"Image Barriers cannot be used during a render pass.");
}
- if (mem_barrier && mem_barrier->sType == VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER) {
+ if (mem_barrier) {
skip_call |= ValidateMaskBitsFromLayouts(dev_data, cmdBuffer, mem_barrier->srcAccessMask, mem_barrier->oldLayout, "Source");
skip_call |= ValidateMaskBitsFromLayouts(dev_data, cmdBuffer, mem_barrier->dstAccessMask, mem_barrier->newLayout, "Dest");
+ if (mem_barrier->newLayout == VK_IMAGE_LAYOUT_UNDEFINED ||
+ mem_barrier->newLayout == VK_IMAGE_LAYOUT_PREINITIALIZED) {
+ log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT,
+ (VkDebugReportObjectTypeEXT)0, 0, __LINE__,
+ DRAWSTATE_INVALID_BARRIER, "DS",
+ "Image Layout cannot be transitioned to UNDEFINED or "
+ "PREINITIALIZED.");
+ }
+ auto image_data = dev_data->imageMap.find(mem_barrier->image);
+ VkFormat format;
+ uint32_t arrayLayers, mipLevels;
+ bool imageFound = false;
+ if (image_data != dev_data->imageMap.end()) {
+ format = image_data->second->format;
+ arrayLayers = image_data->second->arrayLayers;
+ mipLevels = image_data->second->mipLevels;
+ imageFound = true;
+ } else if (dev_data->device_extensions.wsi_enabled) {
+ auto imageswap_data =
+ dev_data->device_extensions.imageToSwapchainMap.find(
+ mem_barrier->image);
+ if (imageswap_data !=
+ dev_data->device_extensions.imageToSwapchainMap.end()) {
+ auto swapchain_data =
+ dev_data->device_extensions.swapchainMap.find(
+ imageswap_data->second);
+ if (swapchain_data !=
+ dev_data->device_extensions.swapchainMap.end()) {
+ format = swapchain_data->second->createInfo.imageFormat;
+ arrayLayers =
+ swapchain_data->second->createInfo.imageArrayLayers;
+ mipLevels = 1;
+ imageFound = true;
+ }
+ }
+ }
+ if (imageFound) {
+ if (vk_format_is_depth_and_stencil(format) &&
+ (!(mem_barrier->subresourceRange.aspectMask &
+ VK_IMAGE_ASPECT_DEPTH_BIT) ||
+ !(mem_barrier->subresourceRange.aspectMask &
+ VK_IMAGE_ASPECT_STENCIL_BIT))) {
+ log_msg(dev_data->report_data,
+ VK_DEBUG_REPORT_ERROR_BIT_EXT,
+ (VkDebugReportObjectTypeEXT)0, 0, __LINE__,
+ DRAWSTATE_INVALID_BARRIER, "DS",
+ "Image is a depth and stencil format and thus must "
+ "have both VK_IMAGE_ASPECT_DEPTH_BIT and "
+ "VK_IMAGE_ASPECT_STENCIL_BIT set.");
+ }
+ if ((mem_barrier->subresourceRange.baseArrayLayer +
+ mem_barrier->subresourceRange.layerCount) > arrayLayers) {
+ log_msg(
+ dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT,
+ (VkDebugReportObjectTypeEXT)0, 0, __LINE__,
+ DRAWSTATE_INVALID_BARRIER, "DS",
+ "Subresource must have the sum of the "
+ "baseArrayLayer (%d) and layerCount (%d) be less "
+ "than or equal to the total number of layers (%d).",
+ mem_barrier->subresourceRange.baseArrayLayer,
+ mem_barrier->subresourceRange.layerCount, arrayLayers);
+ }
+ if ((mem_barrier->subresourceRange.baseMipLevel +
+ mem_barrier->subresourceRange.levelCount) > mipLevels) {
+ log_msg(
+ dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT,
+ (VkDebugReportObjectTypeEXT)0, 0, __LINE__,
+ DRAWSTATE_INVALID_BARRIER, "DS",
+ "Subresource must have the sum of the baseMipLevel "
+ "(%d) and levelCount (%d) be less than or equal to "
+ "the total number of levels (%d).",
+ mem_barrier->subresourceRange.baseMipLevel,
+ mem_barrier->subresourceRange.levelCount, mipLevels);
+ }
+ }
}
}
for (uint32_t i = 0; i < bufferBarrierCount; ++i) {
@@ -7634,6 +7710,8 @@ VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetSwapchainImagesKHR(
dev_data->imageSubresourceMap[pSwapchainImages[i]].push_back(
subpair);
dev_data->imageLayoutMap[subpair] = image_node;
+ dev_data->device_extensions
+ .imageToSwapchainMap[pSwapchainImages[i]] = swapchain;
}
loader_platform_thread_unlock_mutex(&globalLock);
}