layers: Fix layers check in CmdClearAttachments
Fix the layer count check in PreCallValidateCmdClearAttachments()
to compare against the view's layers, rather than against the
underlying image's layers. Update test CmdClearAttachmentTests
to provoke both clauses of the test condition.
Change-Id: I96d9440cbed3a290554410bb0574e6c443190a64
diff --git a/layers/buffer_validation.cpp b/layers/buffer_validation.cpp
index a6903df..308079c 100644
--- a/layers/buffer_validation.cpp
+++ b/layers/buffer_validation.cpp
@@ -2080,9 +2080,9 @@
}
// The layers specified by a given element of pRects must be contained within every attachment that
// pAttachments refers to
- auto attachment_base_array_layer = image_view_state->create_info.subresourceRange.baseArrayLayer;
auto attachment_layer_count = image_view_state->create_info.subresourceRange.layerCount;
- if ((pRects[j].baseArrayLayer < attachment_base_array_layer) || pRects[j].layerCount > attachment_layer_count) {
+ if ((pRects[j].baseArrayLayer >= attachment_layer_count) ||
+ (pRects[j].baseArrayLayer + pRects[j].layerCount > attachment_layer_count)) {
skip |=
log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
HandleToUint64(commandBuffer), __LINE__, VALIDATION_ERROR_01116, "DS",
diff --git a/tests/layer_validation_tests.cpp b/tests/layer_validation_tests.cpp
index e2a0413..fa7f73d 100644
--- a/tests/layer_validation_tests.cpp
+++ b/tests/layer_validation_tests.cpp
@@ -12161,7 +12161,7 @@
color_attachment.clearValue.color.float32[2] = 1.0;
color_attachment.clearValue.color.float32[3] = 1.0;
color_attachment.colorAttachment = 0;
- VkClearRect clear_rect = {{{0, 0}, {(uint32_t)m_width, (uint32_t)m_height}}};
+ VkClearRect clear_rect = {{{0, 0}, {(uint32_t)m_width, (uint32_t)m_height}}, 0, 1};
// Call for full-sized FB Color attachment prior to issuing a Draw
m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
@@ -12175,7 +12175,17 @@
vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
m_errorMonitor->VerifyFound();
- clear_rect.rect.extent.width = (uint32_t)m_width / 2;
+ // baseLayer >= view layers
+ clear_rect.rect.extent.width = (uint32_t)m_width;
+ clear_rect.baseArrayLayer = 1;
+ clear_rect.layerCount = 0;
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01116);
+ vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
+ m_errorMonitor->VerifyFound();
+
+ // baseLayer + layerCount > view layers
+ clear_rect.rect.extent.width = (uint32_t)m_width;
+ clear_rect.baseArrayLayer = 0;
clear_rect.layerCount = 2;
m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01116);
vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);