tests: Add test cases for broken subpass resolve setup
Two cases:
- Source of resolve must not have VK_SAMPLE_COUNT_1_BIT
- Dest of resolve must have VK_SAMPLE_COUNT_1_BIT
Signed-off-by: Chris Forbes <chrisforbes@google.com>
diff --git a/tests/layer_validation_tests.cpp b/tests/layer_validation_tests.cpp
index 0d21d4c..c6bbda4 100644
--- a/tests/layer_validation_tests.cpp
+++ b/tests/layer_validation_tests.cpp
@@ -3496,6 +3496,122 @@
}
}
+TEST_F(VkLayerTest, CreateRenderPassResolveRequiresColorMsaa) {
+ ASSERT_NO_FATAL_FAILURE(InitState());
+
+ m_errorMonitor->SetDesiredFailureMsg(
+ VK_DEBUG_REPORT_ERROR_BIT_EXT,
+ "Subpass 0 requests multisample resolve, but renders to "
+ "attachment 0 which has VK_SAMPLE_COUNT_1_BIT");
+
+ VkAttachmentDescription attachments[] = {
+ {
+ 0, VK_FORMAT_R8G8B8A8_UNORM,
+ VK_SAMPLE_COUNT_1_BIT,
+ VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
+ VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
+ VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
+ VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
+ },
+ {
+ 0, VK_FORMAT_R8G8B8A8_UNORM,
+ VK_SAMPLE_COUNT_1_BIT,
+ VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
+ VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
+ VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
+ VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
+ },
+ };
+
+ VkAttachmentReference color = {
+ 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
+ };
+
+ VkAttachmentReference resolve = {
+ 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
+ };
+
+ VkSubpassDescription subpass = {
+ 0, VK_PIPELINE_BIND_POINT_GRAPHICS,
+ 0, nullptr,
+ 1, &color,
+ &resolve,
+ nullptr,
+ 0, nullptr
+ };
+
+ VkRenderPassCreateInfo rpci = {
+ VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
+ 0, 2, attachments, 1, &subpass, 0, nullptr
+ };
+
+ VkRenderPass rp;
+ VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
+
+ m_errorMonitor->VerifyFound();
+
+ if (err == VK_SUCCESS)
+ vkDestroyRenderPass(m_device->device(), rp, nullptr);
+}
+
+TEST_F(VkLayerTest, CreateRenderPassResolveRequiresSingleSampleDest) {
+ ASSERT_NO_FATAL_FAILURE(InitState());
+
+ m_errorMonitor->SetDesiredFailureMsg(
+ VK_DEBUG_REPORT_ERROR_BIT_EXT,
+ "Subpass 0 requests multisample resolve into attachment 1, which "
+ "must have VK_SAMPLE_COUNT_1_BIT but has VK_SAMPLE_COUNT_4_BIT");
+
+ VkAttachmentDescription attachments[] = {
+ {
+ 0, VK_FORMAT_R8G8B8A8_UNORM,
+ VK_SAMPLE_COUNT_4_BIT,
+ VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
+ VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
+ VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
+ VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
+ },
+ {
+ 0, VK_FORMAT_R8G8B8A8_UNORM,
+ VK_SAMPLE_COUNT_4_BIT,
+ VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
+ VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
+ VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
+ VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
+ },
+ };
+
+ VkAttachmentReference color = {
+ 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
+ };
+
+ VkAttachmentReference resolve = {
+ 1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
+ };
+
+ VkSubpassDescription subpass = {
+ 0, VK_PIPELINE_BIND_POINT_GRAPHICS,
+ 0, nullptr,
+ 1, &color,
+ &resolve,
+ nullptr,
+ 0, nullptr
+ };
+
+ VkRenderPassCreateInfo rpci = {
+ VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr,
+ 0, 2, attachments, 1, &subpass, 0, nullptr
+ };
+
+ VkRenderPass rp;
+ VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
+
+ m_errorMonitor->VerifyFound();
+
+ if (err == VK_SUCCESS)
+ vkDestroyRenderPass(m_device->device(), rp, nullptr);
+}
+
TEST_F(VkLayerTest, FramebufferCreateErrors) {
TEST_DESCRIPTION("Hit errors when attempting to create a framebuffer :\n"
" 1. Mismatch between fb & renderPass attachmentCount\n"