From 258c8c1566e8fb13084cb482429ebb1c87b62675 Mon Sep 17 00:00:00 2001 From: Tobin Ehlis Date: Wed, 19 Jul 2017 11:11:52 -0600 Subject: layers:Add image mem barrier access mask checks Complete remaining work for VALIDATION_ERROR_1b80092e and VALIDATION_ERROR_1b800930. Make sure the image memory barriers src/dst access masks are a subset of corresponding subpass self-dependency access masks. --- layers/core_validation.cpp | 32 +++++++++++++++++++++++++++----- 1 file changed, 27 insertions(+), 5 deletions(-) (limited to 'layers/core_validation.cpp') diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index 7c812082..1f7ff3b0 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -6161,8 +6161,8 @@ static bool ValidateRenderPassPipelineBarriers(layer_data *device_data, const ch VkPipelineStageFlags src_stage_mask, VkPipelineStageFlags dst_stage_mask, VkDependencyFlags dependency_flags, uint32_t mem_barrier_count, const VkMemoryBarrier *mem_barriers, uint32_t buffer_mem_barrier_count, - const VkBufferMemoryBarrier *pBufferMemBarriers, uint32_t image_mem_barrier_count, - const VkImageMemoryBarrier *pImageMemBarriers) { + const VkBufferMemoryBarrier *buffer_mem_barriers, uint32_t image_mem_barrier_count, + const VkImageMemoryBarrier *image_barriers) { bool skip = false; auto rp_state = cb_state->activeRenderPass; auto rp_handle = HandleToUint64(rp_state->renderPass); @@ -6195,8 +6195,6 @@ static bool ValidateRenderPassPipelineBarriers(layer_data *device_data, const ch funcName, dst_stage_mask, sub_dst_stage_mask, cb_state->activeSubpass, rp_handle, validation_error_map[VALIDATION_ERROR_1b80092c]); } - const auto &sub_src_access_mask = sub_dep.srcAccessMask; - const auto &sub_dst_access_mask = sub_dep.dstAccessMask; if (0 != buffer_mem_barrier_count) { skip |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, rp_handle, __LINE__, VALIDATION_ERROR_1b800934, "CORE", @@ -6205,6 +6203,8 @@ static bool ValidateRenderPassPipelineBarriers(layer_data *device_data, const ch funcName, buffer_mem_barrier_count, cb_state->activeSubpass, rp_handle, validation_error_map[VALIDATION_ERROR_1b800934]); } + const auto &sub_src_access_mask = sub_dep.srcAccessMask; + const auto &sub_dst_access_mask = sub_dep.dstAccessMask; for (uint32_t i = 0; i < mem_barrier_count; ++i) { const auto &mb_src_access_mask = mem_barriers[i].srcAccessMask; if (mb_src_access_mask != (sub_src_access_mask & mb_src_access_mask)) { @@ -6223,7 +6223,29 @@ static bool ValidateRenderPassPipelineBarriers(layer_data *device_data, const ch "%s: Barrier pMemoryBarriers[%d].dstAccessMask(0x%X) is not a subset of VkSubpassDependency " "dstAccessMask(0x%X) of " "subpass %d of renderPass 0x%" PRIx64 ". %s", - funcName, i, mb_src_access_mask, sub_src_access_mask, cb_state->activeSubpass, rp_handle, + funcName, i, mb_dst_access_mask, sub_dst_access_mask, cb_state->activeSubpass, rp_handle, + validation_error_map[VALIDATION_ERROR_1b800930]); + } + } + for (uint32_t i = 0; i < image_mem_barrier_count; ++i) { + const auto &img_src_access_mask = image_barriers[i].srcAccessMask; + if (img_src_access_mask != (sub_src_access_mask & img_src_access_mask)) { + skip |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, + VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, rp_handle, __LINE__, VALIDATION_ERROR_1b80092e, "CORE", + "%s: Barrier pImageMemoryBarriers[%d].srcAccessMask(0x%X) is not a subset of VkSubpassDependency " + "srcAccessMask(0x%X) of " + "subpass %d of renderPass 0x%" PRIx64 ". %s", + funcName, i, img_src_access_mask, sub_src_access_mask, cb_state->activeSubpass, rp_handle, + validation_error_map[VALIDATION_ERROR_1b80092e]); + } + const auto &img_dst_access_mask = image_barriers[i].dstAccessMask; + if (img_dst_access_mask != (sub_dst_access_mask & img_dst_access_mask)) { + skip |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, + VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, rp_handle, __LINE__, VALIDATION_ERROR_1b800930, "CORE", + "%s: Barrier pImageMemoryBarriers[%d].dstAccessMask(0x%X) is not a subset of VkSubpassDependency " + "dstAccessMask(0x%X) of " + "subpass %d of renderPass 0x%" PRIx64 ". %s", + funcName, i, img_dst_access_mask, sub_dst_access_mask, cb_state->activeSubpass, rp_handle, validation_error_map[VALIDATION_ERROR_1b800930]); } } -- cgit v1.2.3