From 883ee3f865f9dbd83134d148b26e96cb6a926b3d Mon Sep 17 00:00:00 2001 From: Tobin Ehlis Date: Wed, 14 Sep 2016 15:26:09 -0600 Subject: [PATCH] layers: Add binding for framebuffer children When BeginCommandBuffer and CmdBeginRenderPass are called, need to bind not only the framebuffer, but all of the framebuffer's children objects to the command buffer. This includes the imageViews that are in the attachments as well as their children and the renderpass. Added this binding and included IMAGE_VIEW_STATE* in framebuffer attachment struct for simplicity when creating binding. --- layers/core_validation.cpp | 50 +++++++++++++++++++++++++++------------------- layers/core_validation.h | 1 + 2 files changed, 31 insertions(+), 20 deletions(-) diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index 42d36b9..ca03621 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -6749,6 +6749,31 @@ AllocateCommandBuffers(VkDevice device, const VkCommandBufferAllocateInfo *pCrea return result; } +// Add bindings between the given cmd buffer & framebuffer and the framebuffer's children +static void AddFramebufferBinding(layer_data *dev_data, GLOBAL_CB_NODE *cb_state, FRAMEBUFFER_NODE *fb_state) { + fb_state->cb_bindings.insert(cb_state); + for (auto attachment : fb_state->attachments) { + auto view_state = attachment.view_state; + if (view_state) { + addCommandBufferBinding( + &view_state->cb_bindings, + {reinterpret_cast(view_state->image_view), VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_VIEW_EXT}, cb_state); + } + auto img_node = getImageNode(dev_data, attachment.image); + if (img_node) { + addCommandBufferBinding(&img_node->cb_bindings, + {reinterpret_cast(img_node->image), VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT}, + cb_state); + } + auto rp_state = getRenderPass(dev_data, fb_state->createInfo.renderPass); + if (rp_state) { + addCommandBufferBinding( + &rp_state->cb_bindings, + {reinterpret_cast(rp_state->renderPass), VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT}, cb_state); + } + } +} + VKAPI_ATTR VkResult VKAPI_CALL BeginCommandBuffer(VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo *pBeginInfo) { bool skip_call = false; @@ -6812,16 +6837,8 @@ BeginCommandBuffer(VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo reinterpret_cast(pInfo->framebuffer), reinterpret_cast(framebuffer->createInfo.renderPass), errorString.c_str()); } - // Connect this framebuffer to this cmdBuffer - framebuffer->cb_bindings.insert(cb_node); - for (auto attach : framebuffer->attachments) { - auto img_node = getImageNode(dev_data, attach.image); - if (img_node) { - addCommandBufferBinding(&img_node->cb_bindings, {reinterpret_cast(attach.image), - VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT}, - cb_node); - } - } + // Connect this framebuffer and its children to this cmdBuffer + AddFramebufferBinding(dev_data, cb_node, framebuffer); } } } @@ -9294,6 +9311,7 @@ static void PostCallRecordCreateFramebuffer(layer_data *dev_data, const VkFrameb } MT_FB_ATTACHMENT_INFO fb_info; fb_info.mem = getImageNode(dev_data, view_state->create_info.image)->mem; + fb_info.view_state = view_state; fb_info.image = view_state->create_info.image; fb_node->attachments.push_back(fb_info); } @@ -10213,16 +10231,8 @@ CmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *p cb_node->activeSubpass = 0; cb_node->activeSubpassContents = contents; cb_node->framebuffers.insert(pRenderPassBegin->framebuffer); - // Connect this framebuffer to this cmdBuffer - framebuffer->cb_bindings.insert(cb_node); - for (auto attach : framebuffer->attachments) { - auto img_node = getImageNode(dev_data, attach.image); - if (img_node) { - addCommandBufferBinding(&img_node->cb_bindings, - {reinterpret_cast(attach.image), VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT}, - cb_node); - } - } + // Connect this framebuffer and its children to this cmdBuffer + AddFramebufferBinding(dev_data, cb_node, framebuffer); // transition attachments to the correct layouts for the first subpass TransitionSubpassLayouts(dev_data, cb_node, &cb_node->activeRenderPassBeginInfo, cb_node->activeSubpass); } else { diff --git a/layers/core_validation.h b/layers/core_validation.h index aa3058e..0164803 100644 --- a/layers/core_validation.h +++ b/layers/core_validation.h @@ -94,6 +94,7 @@ // TODO : Could potentially store a list of freed mem allocs to flag when they're incorrectly used struct MT_FB_ATTACHMENT_INFO { + IMAGE_VIEW_STATE *view_state; VkImage image; VkDeviceMemory mem; }; -- 2.7.4