layers: Further refine relaxed layout matching
Added additional tests to layout checks, such that inexact (relaxed)
initial uses of resources don't cause false positives for later exact
uses.
Change-Id: I4a33fb352b60c6113631c91176b15cec3a8ab182
diff --git a/layers/buffer_validation.cpp b/layers/buffer_validation.cpp
index 870aa45..0952a21 100644
--- a/layers/buffer_validation.cpp
+++ b/layers/buffer_validation.cpp
@@ -493,11 +493,11 @@
(attachment_initial_layout != VK_IMAGE_LAYOUT_UNDEFINED) ? GetImageSubresourceLayoutMap(const_pCB, image) : nullptr;
if (subresource_map) { // If no layout information for image yet, will be checked at QueueSubmit time
+ LayoutUseCheckAndMessage layout_check(subresource_map);
bool subres_skip = false;
- auto subresource_cb = [this, i, attachment_initial_layout, &subres_skip](
+ auto subresource_cb = [this, i, attachment_initial_layout, &layout_check, &subres_skip](
const VkImageSubresource &subres, VkImageLayout layout, VkImageLayout initial_layout) {
- LayoutUseCheckAndMessage layout_check(attachment_initial_layout, layout, initial_layout);
- if (layout_check.CheckFailed()) {
+ if (!layout_check.Check(subres, attachment_initial_layout, layout, initial_layout)) {
subres_skip |=
log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
kVUID_Core_DrawState_InvalidRenderpass,
@@ -793,11 +793,11 @@
// subresource.
} else if (subresource_map) {
bool subres_skip = false;
+ LayoutUseCheckAndMessage layout_check(subresource_map);
VkImageSubresourceRange normalized_isr = NormalizeSubresourceRange(*image_state, img_barrier->subresourceRange);
- auto subres_callback = [this, img_barrier, cb_state, &subres_skip](
+ auto subres_callback = [this, img_barrier, cb_state, &layout_check, &subres_skip](
const VkImageSubresource &subres, VkImageLayout layout, VkImageLayout initial_layout) {
- LayoutUseCheckAndMessage layout_check(img_barrier->oldLayout, layout, initial_layout);
- if (layout_check.CheckFailed()) {
+ if (!layout_check.Check(subres, img_barrier->oldLayout, layout, initial_layout)) {
subres_skip =
log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
HandleToUint64(cb_state->commandBuffer), "VUID-VkImageMemoryBarrier-oldLayout-01197",
@@ -1058,10 +1058,10 @@
const auto *subresource_map = GetImageSubresourceLayoutMap(cb_node, image);
if (subresource_map) {
bool subres_skip = false;
- auto subresource_cb = [this, explicit_layout, cb_node, layout_mismatch_msg_code, caller, image, aspect_mask, &error,
+ LayoutUseCheckAndMessage layout_check(subresource_map, aspect_mask);
+ auto subresource_cb = [this, explicit_layout, cb_node, layout_mismatch_msg_code, caller, image, &layout_check, &error,
&subres_skip](const VkImageSubresource &subres, VkImageLayout layout, VkImageLayout initial_layout) {
- LayoutUseCheckAndMessage layout_check(explicit_layout, layout, initial_layout, aspect_mask);
- if (layout_check.CheckFailed()) {
+ if (!layout_check.Check(subres, explicit_layout, layout, initial_layout)) {
*error = true;
subres_skip |=
log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
@@ -1579,11 +1579,11 @@
const auto *subresource_map = GetImageSubresourceLayoutMap(static_cast<const GLOBAL_CB_NODE *>(cb_node), image_state->image);
if (subresource_map) {
bool subres_skip = false;
+ LayoutUseCheckAndMessage layout_check(subresource_map);
VkImageSubresourceRange normalized_isr = NormalizeSubresourceRange(*image_state, range);
- auto subres_callback = [this, cb_node, dest_image_layout, func_name, &subres_skip](
+ auto subres_callback = [this, cb_node, dest_image_layout, func_name, &layout_check, &subres_skip](
const VkImageSubresource &subres, VkImageLayout layout, VkImageLayout initial_layout) {
- LayoutUseCheckAndMessage layout_check(dest_image_layout, layout, initial_layout);
- if (layout_check.CheckFailed()) {
+ if (!layout_check.Check(subres, dest_image_layout, layout, initial_layout)) {
const char *error_code = "VUID-vkCmdClearColorImage-imageLayout-00004";
if (strcmp(func_name, "vkCmdClearDepthStencilImage()") == 0) {
error_code = "VUID-vkCmdClearDepthStencilImage-imageLayout-00011";