tests: Update InvalidBarriers for new aspect bit checks
Update existing depth/stencil check in InvalidBarriers test.
Add new test cases for depth-only, stencil-only and color cases.
diff --git a/tests/layer_validation_tests.cpp b/tests/layer_validation_tests.cpp
index 97bb054..95e664a 100644
--- a/tests/layer_validation_tests.cpp
+++ b/tests/layer_validation_tests.cpp
@@ -9802,12 +9802,12 @@
VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
&buf_barrier, 0, nullptr);
m_errorMonitor->VerifyFound();
- buf_barrier.size = VK_WHOLE_SIZE;
+ // Now exercise barrier aspect bit errors, first DS
m_errorMonitor->SetDesiredFailureMsg(
VK_DEBUG_REPORT_ERROR_BIT_EXT,
"Image is a depth and stencil format and thus must "
- "have both VK_IMAGE_ASPECT_DEPTH_BIT and "
+ "have either one or both of VK_IMAGE_ASPECT_DEPTH_BIT and "
"VK_IMAGE_ASPECT_STENCIL_BIT set.");
VkDepthStencilObj ds_image(m_device);
ds_image.Init(m_device, 128, 128, VK_FORMAT_D24_UNORM_S8_UINT);
@@ -9821,6 +9821,73 @@
VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
nullptr, 1, &img_barrier);
m_errorMonitor->VerifyFound();
+ // Now test depth-only
+ VkFormatProperties format_props;
+
+ vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(),
+ VK_FORMAT_D16_UNORM, &format_props);
+ if (format_props.optimalTilingFeatures &
+ VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
+ m_errorMonitor->SetDesiredFailureMsg(
+ VK_DEBUG_REPORT_ERROR_BIT_EXT,
+ "Image is a depth-only format and thus must "
+ "have VK_IMAGE_ASPECT_DEPTH_BIT set.");
+ VkDepthStencilObj d_image(m_device);
+ d_image.Init(m_device, 128, 128, VK_FORMAT_D16_UNORM);
+ ASSERT_TRUE(d_image.initialized());
+ img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
+ img_barrier.newLayout =
+ VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
+ img_barrier.image = d_image.handle();
+ // Leave aspectMask at COLOR on purpose
+ vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
+ VK_PIPELINE_STAGE_HOST_BIT,
+ VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr,
+ 0, nullptr, 1, &img_barrier);
+ m_errorMonitor->VerifyFound();
+ }
+ vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(),
+ VK_FORMAT_S8_UINT, &format_props);
+ if (format_props.optimalTilingFeatures &
+ VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
+ // Now test stencil-only
+ m_errorMonitor->SetDesiredFailureMsg(
+ VK_DEBUG_REPORT_ERROR_BIT_EXT,
+ "Image is a stencil-only format and thus must "
+ "have VK_IMAGE_ASPECT_STENCIL_BIT set.");
+ VkDepthStencilObj s_image(m_device);
+ s_image.Init(m_device, 128, 128, VK_FORMAT_S8_UINT);
+ ASSERT_TRUE(s_image.initialized());
+ img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
+ img_barrier.newLayout =
+ VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
+ img_barrier.image = s_image.handle();
+ // Leave aspectMask at COLOR on purpose
+ vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
+ VK_PIPELINE_STAGE_HOST_BIT,
+ VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr,
+ 0, nullptr, 1, &img_barrier);
+ m_errorMonitor->VerifyFound();
+ }
+ // Finally test color
+ m_errorMonitor->SetDesiredFailureMsg(
+ VK_DEBUG_REPORT_ERROR_BIT_EXT, "Image is a color format and thus must "
+ "have VK_IMAGE_ASPECT_COLOR_BIT set.");
+ VkImageObj c_image(m_device);
+ c_image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
+ VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL,
+ 0);
+ ASSERT_TRUE(c_image.initialized());
+ img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
+ img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
+ img_barrier.image = c_image.handle();
+ // Set aspect to depth (non-color)
+ img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
+ vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(),
+ VK_PIPELINE_STAGE_HOST_BIT,
+ VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
+ nullptr, 1, &img_barrier);
+ m_errorMonitor->VerifyFound();
}
TEST_F(VkLayerTest, IdxBufferAlignmentError) {