From 70c56005e0c7606831081cb28e776452cfe3920d Mon Sep 17 00:00:00 2001 From: Tobin Ehlis Date: Thu, 7 Sep 2017 09:16:49 -0600 Subject: layers:Fix render pass lifetime hole A framebuffer can outlive the renderpass that it's created with so update FRAMEBUFFER_STATE object to have a shared_ptr to render pass state. --- layers/core_validation.cpp | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) (limited to 'layers/core_validation.cpp') diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index 5e69e276..d262ab8c 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -166,7 +166,7 @@ struct layer_data { unordered_map> frameBufferMap; unordered_map> imageSubresourceMap; unordered_map imageLayoutMap; - unordered_map> renderPassMap; + unordered_map> renderPassMap; unordered_map> shaderModuleMap; unordered_map> desc_template_map; unordered_map> swapchainMap; @@ -705,6 +705,14 @@ RENDER_PASS_STATE *GetRenderPassState(layer_data const *dev_data, VkRenderPass r return it->second.get(); } +std::shared_ptr const GetRenderPassStateSharedPtr(layer_data const *dev_data, VkRenderPass renderpass) { + auto it = dev_data->renderPassMap.find(renderpass); + if (it == dev_data->renderPassMap.end()) { + return nullptr; + } + return it->second; +} + FRAMEBUFFER_STATE *GetFramebufferState(const layer_data *dev_data, VkFramebuffer framebuffer) { auto it = dev_data->frameBufferMap.find(framebuffer); if (it == dev_data->frameBufferMap.end()) { @@ -5008,8 +5016,8 @@ VKAPI_ATTR VkResult VKAPI_CALL BeginCommandBuffer(VkCommandBuffer commandBuffer, if (framebuffer->createInfo.renderPass != pInfo->renderPass) { // renderPass that framebuffer was created with must be compatible with local renderPass skip |= - validateRenderPassCompatibility(dev_data, "framebuffer", framebuffer->rp_state, "command buffer", - GetRenderPassState(dev_data, pInfo->renderPass), + validateRenderPassCompatibility(dev_data, "framebuffer", framebuffer->rp_state.get(), + "command buffer", GetRenderPassState(dev_data, pInfo->renderPass), "vkBeginCommandBuffer()", VALIDATION_ERROR_0280006e); } // Connect this framebuffer and its children to this cmdBuffer @@ -7435,7 +7443,7 @@ static bool PreCallValidateCreateFramebuffer(layer_data *dev_data, const VkFrame static void PostCallRecordCreateFramebuffer(layer_data *dev_data, const VkFramebufferCreateInfo *pCreateInfo, VkFramebuffer fb) { // Shadow create info and store in map std::unique_ptr fb_state( - new FRAMEBUFFER_STATE(fb, pCreateInfo, GetRenderPassState(dev_data, pCreateInfo->renderPass))); + new FRAMEBUFFER_STATE(fb, pCreateInfo, GetRenderPassStateSharedPtr(dev_data, pCreateInfo->renderPass))); for (uint32_t i = 0; i < pCreateInfo->attachmentCount; ++i) { VkImageView view = pCreateInfo->pAttachments[i]; @@ -8069,7 +8077,8 @@ VKAPI_ATTR void VKAPI_CALL CmdBeginRenderPass(VkCommandBuffer commandBuffer, con GetFramebufferState(dev_data, pRenderPassBegin->framebuffer)); if (framebuffer->rp_state->renderPass != render_pass_state->renderPass) { skip |= validateRenderPassCompatibility(dev_data, "render pass", render_pass_state, "framebuffer", - framebuffer->rp_state, "vkCmdBeginRenderPass()", VALIDATION_ERROR_12000710); + framebuffer->rp_state.get(), "vkCmdBeginRenderPass()", + VALIDATION_ERROR_12000710); } skip |= insideRenderPass(dev_data, cb_node, "vkCmdBeginRenderPass()", VALIDATION_ERROR_17a00017); skip |= ValidateDependencies(dev_data, framebuffer, render_pass_state); -- cgit v1.2.3