aboutsummaryrefslogtreecommitdiff
path: root/layers/core_validation.cpp
diff options
context:
space:
mode:
authorTobin Ehlis <tobine@google.com>2017-09-07 09:16:49 -0600
committerTobin Ehlis <tobine@google.com>2017-09-07 14:32:12 -0600
commit70c56005e0c7606831081cb28e776452cfe3920d (patch)
tree475e0d4d7a722837e17e857e1dc7c0e3ead26b85 /layers/core_validation.cpp
parent1641cf3632fea91b64336c27bca8481e54cca866 (diff)
downloadusermoji-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.cpp19
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);