| 23 | class NegativeSyncObject : public SyncObjectTest {}; |
| 24 | |
| 25 | TEST_F(NegativeSyncObject, ImageBarrierSubpassConflicts) { |
| 26 | TEST_DESCRIPTION("Add a pipeline barrier within a subpass that has conflicting state"); |
| 27 | RETURN_IF_SKIP(Init()); |
| 28 | |
| 29 | // A renderpass with a single subpass that declared a self-dependency |
| 30 | VkAttachmentDescription attach[] = { |
| 31 | {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, |
| 32 | VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED, |
| 33 | VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL}, |
| 34 | }; |
| 35 | VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL}; |
| 36 | VkSubpassDescription subpasses[] = { |
| 37 | {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr}, |
| 38 | }; |
| 39 | VkSubpassDependency dep = {0, |
| 40 | 0, |
| 41 | VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, |
| 42 | VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, |
| 43 | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, |
| 44 | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, |
| 45 | VK_DEPENDENCY_BY_REGION_BIT}; |
| 46 | VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, attach, 1, subpasses, 1, &dep}; |
| 47 | vkt::RenderPass rp(*m_device, rpci); |
| 48 | |
| 49 | rpci.dependencyCount = 0; |
| 50 | rpci.pDependencies = nullptr; |
| 51 | |
| 52 | vkt::RenderPass rp_noselfdep(*m_device, rpci); |
| 53 | vkt::Image image(*m_device, 32, 32, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT); |
| 54 | vkt::ImageView imageView = image.CreateView(); |
| 55 | vkt::Framebuffer fb(*m_device, rp, 1, &imageView.handle()); |
| 56 | vkt::Framebuffer fb_noselfdep(*m_device, rp_noselfdep, 1, &imageView.handle()); |
| 57 | |
| 58 | m_command_buffer.Begin(); |
| 59 | m_command_buffer.BeginRenderPass(rp_noselfdep, fb_noselfdep, 32, 32); |
| 60 | VkMemoryBarrier mem_barrier = vku::InitStructHelper(); |
| 61 | mem_barrier.srcAccessMask = VK_ACCESS_MEMORY_WRITE_BIT; |
| 62 | mem_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT; |
| 63 | m_errorMonitor->SetDesiredError("VUID-vkCmdPipelineBarrier-None-07889"); |
| 64 | vk::CmdPipelineBarrier(m_command_buffer, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 1, |
| 65 | &mem_barrier, 0, nullptr, 0, nullptr); |
| 66 | m_errorMonitor->VerifyFound(); |
| 67 | m_command_buffer.EndRenderPass(); |
| 68 | |
| 69 | m_command_buffer.FullMemoryBarrier(); |
| 70 | m_command_buffer.BeginRenderPass(rp, fb, 32, 32); |
| 71 | VkImageMemoryBarrier img_barrier = vku::InitStructHelper(); |
| 72 | img_barrier.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; |
| 73 | img_barrier.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; |
| 74 | img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; |
| 75 | img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; |
| 76 | img_barrier.image = image; |
| 77 | img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; |
| 78 | img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; |
| 79 | img_barrier.subresourceRange = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1}; |
| 80 | // Mis-match src stage mask |
| 81 | m_errorMonitor->SetDesiredError("VUID-vkCmdPipelineBarrier-None-07889"); |
| 82 | vk::CmdPipelineBarrier(m_command_buffer, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, |
nothing calls this directly
no test coverage detected