From 50afc6e8d614b28b5dbb167111918fda6818a2a4 Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Fri, 13 May 2016 16:23:58 +1200 Subject: [PATCH] layers: Move `fb` from RENDER_PASS_NODE to GLOBAL_CB_NODE This is part of a renderpass instance, not of the renderpass itself. If stored where MT put it, things go horribly wrong when recording command buffers in parallel. Signed-off-by: Chris Forbes --- layers/core_validation.cpp | 10 ++++++---- layers/core_validation.h | 4 ++-- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index a670093..e0a5269 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -3763,6 +3763,7 @@ static void resetCB(layer_data *dev_data, const VkCommandBuffer cb) { } } pCB->framebuffers.clear(); + pCB->activeFramebuffer = nullptr; } } @@ -8941,10 +8942,10 @@ CmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *p auto pass_data = dev_data->renderPassMap.find(pRenderPassBegin->renderPass); if (pass_data != dev_data->renderPassMap.end()) { RENDER_PASS_NODE* pRPNode = pass_data->second; - pRPNode->fb = pRenderPassBegin->framebuffer; + pCB->activeFramebuffer = pRenderPassBegin->framebuffer; auto cb_data = dev_data->commandBufferMap.find(commandBuffer); for (size_t i = 0; i < pRPNode->attachments.size(); ++i) { - MT_FB_ATTACHMENT_INFO &fb_info = dev_data->frameBufferMap[pRPNode->fb].attachments[i]; + MT_FB_ATTACHMENT_INFO &fb_info = dev_data->frameBufferMap[pRenderPassBegin->framebuffer].attachments[i]; if (pRPNode->attachments[i].load_op == VK_ATTACHMENT_LOAD_OP_CLEAR) { if (cb_data != dev_data->commandBufferMap.end()) { std::function function = [=]() { @@ -9040,7 +9041,7 @@ VKAPI_ATTR void VKAPI_CALL CmdEndRenderPass(VkCommandBuffer commandBuffer) { RENDER_PASS_NODE* pRPNode = cb_data->second->activeRenderPass; if (pRPNode) { for (size_t i = 0; i < pRPNode->attachments.size(); ++i) { - MT_FB_ATTACHMENT_INFO &fb_info = dev_data->frameBufferMap[pRPNode->fb].attachments[i]; + MT_FB_ATTACHMENT_INFO &fb_info = dev_data->frameBufferMap[cb_data->second->activeFramebuffer].attachments[i]; if (pRPNode->attachments[i].store_op == VK_ATTACHMENT_STORE_OP_STORE) { if (cb_data != dev_data->commandBufferMap.end()) { std::function function = [=]() { @@ -9070,6 +9071,7 @@ VKAPI_ATTR void VKAPI_CALL CmdEndRenderPass(VkCommandBuffer commandBuffer) { TransitionFinalSubpassLayouts(commandBuffer, &pCB->activeRenderPassBeginInfo); pCB->activeRenderPass = nullptr; pCB->activeSubpass = 0; + pCB->activeFramebuffer = nullptr; } lock.unlock(); if (!skipCall) @@ -9228,7 +9230,7 @@ static bool validateFramebuffer(layer_data *dev_data, VkCommandBuffer primaryBuf if (!pSubCB->beginInfo.pInheritanceInfo) { return skip_call; } - VkFramebuffer primary_fb = pCB->activeRenderPass->fb; + VkFramebuffer primary_fb = pCB->activeFramebuffer; VkFramebuffer secondary_fb = pSubCB->beginInfo.pInheritanceInfo->framebuffer; if (secondary_fb != VK_NULL_HANDLE) { if (primary_fb != secondary_fb) { diff --git a/layers/core_validation.h b/layers/core_validation.h index 586534d..6d78833 100644 --- a/layers/core_validation.h +++ b/layers/core_validation.h @@ -160,7 +160,6 @@ struct DAGNode { struct RENDER_PASS_NODE { VkRenderPass renderPass; VkRenderPassCreateInfo const *pCreateInfo; - VkFramebuffer fb; std::vector hasSelfDependency; std::vector subpassToNode; std::vector> subpassColorFormats; @@ -168,7 +167,7 @@ struct RENDER_PASS_NODE { std::unordered_map attachment_first_read; std::unordered_map attachment_first_layout; - RENDER_PASS_NODE(VkRenderPassCreateInfo const *pCreateInfo) : pCreateInfo(pCreateInfo), fb(VK_NULL_HANDLE) { + RENDER_PASS_NODE(VkRenderPassCreateInfo const *pCreateInfo) : pCreateInfo(pCreateInfo) { uint32_t i; subpassColorFormats.reserve(pCreateInfo->subpassCount); @@ -557,6 +556,7 @@ struct GLOBAL_CB_NODE : public BASE_NODE { RENDER_PASS_NODE *activeRenderPass; VkSubpassContents activeSubpassContents; uint32_t activeSubpass; + VkFramebuffer activeFramebuffer; std::unordered_set framebuffers; // Track descriptor sets that are destroyed or updated while bound to CB // TODO : These data structures relate to tracking resources that invalidate -- 2.7.4