Core validation: add an errror message when wrong layout is used for clearing
diff --git a/tests/layer_validation_tests.cpp b/tests/layer_validation_tests.cpp
index 90509ab..7b70b3e 100644
--- a/tests/layer_validation_tests.cpp
+++ b/tests/layer_validation_tests.cpp
@@ -10473,6 +10473,26 @@
"Layout for output image is VK_IMAGE_LAYOUT_UNDEFINED but can only be TRANSFER_DST_OPTIMAL or GENERAL.");
m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_UNDEFINED, 1, ©Region);
m_errorMonitor->VerifyFound();
+
+ VkClearColorValue clearValue = {};
+ VkImageSubresourceRange clearRange;
+ clearRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
+ clearRange.baseMipLevel = 0;
+ clearRange.baseArrayLayer = 0;
+ clearRange.layerCount = 1;
+ clearRange.levelCount = 1;
+
+ m_errorMonitor->SetDesiredFailureMsg(
+ VK_DEBUG_REPORT_ERROR_BIT_EXT,
+ "Layout for cleared image is VK_IMAGE_LAYOUT_UNDEFINED but can only be TRANSFER_DST_OPTIMAL or GENERAL.");
+ m_commandBuffer->ClearColorImage(dst_image, VK_IMAGE_LAYOUT_UNDEFINED, &clearValue, 1, &clearRange);
+ m_errorMonitor->VerifyFound();
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot clear an image whose layout is "
+ "VK_IMAGE_LAYOUT_UNDEFINED and doesn't match the current "
+ "layout VK_IMAGE_LAYOUT_GENERAL.");
+ m_commandBuffer->ClearColorImage(dst_image, VK_IMAGE_LAYOUT_UNDEFINED, &clearValue, 1, &clearRange);
+ m_errorMonitor->VerifyFound();
+
// Now cause error due to bad image layout transition in PipelineBarrier
VkImageMemoryBarrier image_barrier[1] = {};
image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
diff --git a/tests/vkrenderframework.cpp b/tests/vkrenderframework.cpp
index 78df418..2f764a2 100644
--- a/tests/vkrenderframework.cpp
+++ b/tests/vkrenderframework.cpp
@@ -1410,6 +1410,16 @@
vkCmdResolveImage(handle(), srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
}
+void VkCommandBufferObj::ClearColorImage(VkImage image, VkImageLayout imageLayout, const VkClearColorValue *pColor,
+ uint32_t rangeCount, const VkImageSubresourceRange *pRanges) {
+ vkCmdClearColorImage(handle(), image, imageLayout, pColor, rangeCount, pRanges);
+}
+
+void VkCommandBufferObj::ClearDepthStencilImage(VkImage image, VkImageLayout imageLayout, const VkClearDepthStencilValue *pColor,
+ uint32_t rangeCount, const VkImageSubresourceRange *pRanges) {
+ vkCmdClearDepthStencilImage(handle(), image, imageLayout, pColor, rangeCount, pRanges);
+}
+
void VkCommandBufferObj::PrepareAttachments() {
uint32_t i;
const VkFlags output_mask = VK_ACCESS_HOST_WRITE_BIT | VK_ACCESS_SHADER_WRITE_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT |
diff --git a/tests/vkrenderframework.h b/tests/vkrenderframework.h
index 8bfbf12..6c8c014 100644
--- a/tests/vkrenderframework.h
+++ b/tests/vkrenderframework.h
@@ -186,6 +186,10 @@
uint32_t regionCount, const VkImageCopy *pRegions);
void ResolveImage(VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage, VkImageLayout dstImageLayout,
uint32_t regionCount, const VkImageResolve *pRegions);
+ void ClearColorImage(VkImage image, VkImageLayout imageLayout, const VkClearColorValue *pColor, uint32_t rangeCount,
+ const VkImageSubresourceRange *pRanges);
+ void ClearDepthStencilImage(VkImage image, VkImageLayout imageLayout, const VkClearDepthStencilValue *pColor,
+ uint32_t rangeCount, const VkImageSubresourceRange *pRanges);
protected:
VkDeviceObj *m_device;