diff options
| author | Tobin Ehlis <tobine@google.com> | 2017-09-07 09:16:49 -0600 |
|---|---|---|
| committer | Tobin Ehlis <tobine@google.com> | 2017-09-07 14:32:12 -0600 |
| commit | 70c56005e0c7606831081cb28e776452cfe3920d (patch) | |
| tree | 475e0d4d7a722837e17e857e1dc7c0e3ead26b85 /layers/core_validation.cpp | |
| parent | 1641cf3632fea91b64336c27bca8481e54cca866 (diff) | |
| download | usermoji-70c56005e0c7606831081cb28e776452cfe3920d.tar.xz | |
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.
Diffstat (limited to 'layers/core_validation.cpp')
| -rw-r--r-- | layers/core_validation.cpp | 19 |
1 files changed, 14 insertions, 5 deletions
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<VkFramebuffer, unique_ptr<FRAMEBUFFER_STATE>> frameBufferMap; unordered_map<VkImage, vector<ImageSubresourcePair>> imageSubresourceMap; unordered_map<ImageSubresourcePair, IMAGE_LAYOUT_NODE> imageLayoutMap; - unordered_map<VkRenderPass, unique_ptr<RENDER_PASS_STATE>> renderPassMap; + unordered_map<VkRenderPass, std::shared_ptr<RENDER_PASS_STATE>> renderPassMap; unordered_map<VkShaderModule, unique_ptr<shader_module>> shaderModuleMap; unordered_map<VkDescriptorUpdateTemplateKHR, unique_ptr<TEMPLATE_STATE>> desc_template_map; unordered_map<VkSwapchainKHR, std::unique_ptr<SWAPCHAIN_NODE>> swapchainMap; @@ -705,6 +705,14 @@ RENDER_PASS_STATE *GetRenderPassState(layer_data const *dev_data, VkRenderPass r return it->second.get(); } +std::shared_ptr<RENDER_PASS_STATE> 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<FRAMEBUFFER_STATE> 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); |
