vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
}
+TEST_F(VkPositiveLayerTest, DestroyPipelineRenderPass) {
+ TEST_DESCRIPTION("Draw using a pipeline whose create renderPass has been destroyed.");
+ m_errorMonitor->ExpectSuccess();
+ ASSERT_NO_FATAL_FAILURE(Init());
+ ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
+
+ VkResult err;
+
+ // Create a renderPass that's compatible with Draw-time renderPass
+ VkAttachmentDescription att = {};
+ att.format = m_render_target_fmt;
+ att.samples = VK_SAMPLE_COUNT_1_BIT;
+ att.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
+ att.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
+ att.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
+ att.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
+ att.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
+ att.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
+
+ VkAttachmentReference ref = {};
+ ref.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
+ ref.attachment = 0;
+
+ m_renderPassClearValues.clear();
+ VkClearValue clear = {};
+ clear.color = m_clear_color;
+
+ VkSubpassDescription subpass = {};
+ subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
+ subpass.flags = 0;
+ subpass.inputAttachmentCount = 0;
+ subpass.pInputAttachments = NULL;
+ subpass.colorAttachmentCount = 1;
+ subpass.pColorAttachments = &ref;
+ subpass.pResolveAttachments = NULL;
+
+ subpass.pDepthStencilAttachment = NULL;
+ subpass.preserveAttachmentCount = 0;
+ subpass.pPreserveAttachments = NULL;
+
+ VkRenderPassCreateInfo rp_info = {};
+ rp_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
+ rp_info.attachmentCount = 1;
+ rp_info.pAttachments = &att;
+ rp_info.subpassCount = 1;
+ rp_info.pSubpasses = &subpass;
+
+ VkRenderPass rp;
+ err = vkCreateRenderPass(device(), &rp_info, NULL, &rp);
+ ASSERT_VK_SUCCESS(err);
+
+ VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
+ VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
+
+ VkPipelineObj pipe(m_device);
+ pipe.AddColorAttachment();
+ pipe.AddShader(&vs);
+ pipe.AddShader(&fs);
+ VkViewport view_port = {};
+ m_viewports.push_back(view_port);
+ pipe.SetViewport(m_viewports);
+ VkRect2D rect = {};
+ m_scissors.push_back(rect);
+ pipe.SetScissor(m_scissors);
+
+ VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 0, nullptr, 0, nullptr};
+ VkPipelineLayout pl;
+ err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
+ ASSERT_VK_SUCCESS(err);
+ pipe.CreateVKPipeline(pl, rp);
+ // Destroy renderPass before pipeline is used
+ vkDestroyRenderPass(m_device->device(), rp, nullptr);
+
+ m_commandBuffer->begin();
+ m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
+ vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
+ vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
+ vkCmdEndRenderPass(m_commandBuffer->handle());
+ m_commandBuffer->end();
+
+ VkSubmitInfo submit_info = {};
+ submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
+ submit_info.commandBufferCount = 1;
+ submit_info.pCommandBuffers = &m_commandBuffer->handle();
+ vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
+ m_errorMonitor->VerifyNotFound();
+ vkQueueWaitIdle(m_device->m_queue);
+
+ vkDestroyPipelineLayout(m_device->device(), pl, NULL);
+}
+
TEST_F(VkLayerTest, InvalidCmdBufferDescriptorSetBufferDestroyed) {
TEST_DESCRIPTION(
"Attempt to draw with a command buffer that is invalid "