diff options
author | Tobin Ehlis <tobine@google.com> | 2016-03-22 13:50:21 -0600 |
---|---|---|
committer | Tobin Ehlis <tobine@google.com> | 2016-03-24 07:07:39 -0600 |
commit | 87e0afcd98dcf3c1e5e2cbb3023fe89d9dd10cd2 (patch) | |
tree | a6cdd9904f528e4935c2083e59b68acbbdf9c363 | |
parent | 5b81366f6b6bf2b76529d233143bcd13bdbb8533 (diff) | |
download | vulkan-validation-layers-87e0afcd98dcf3c1e5e2cbb3023fe89d9dd10cd2.tar.gz |
layers: Merge renderpass maps in core_validation
Kill passMap, merge all renderpass data into RENDER_PASS_NODE and only use renderPassMap.
-rw-r--r-- | layers/core_validation.cpp | 121 | ||||
-rw-r--r-- | layers/core_validation.h | 21 |
2 files changed, 68 insertions, 74 deletions
diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index de1b2ffa7..4ea26ba5e 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -110,7 +110,6 @@ struct layer_data { // MTMERGESOURCE - stuff pulled directly from MT uint64_t currentFenceId; // Maps for tracking key structs related to mem_tracker state - unordered_map<VkRenderPass, MT_PASS_INFO> passMap; unordered_map<VkDescriptorSet, MT_DESCRIPTOR_SET_INFO> descriptorSetMap; // Images and Buffers are 2 objects that can have memory bound to them so they get special treatment unordered_map<uint64_t, MT_OBJ_BINDING_INFO> imageBindingMap; @@ -6291,9 +6290,6 @@ vkDestroyRenderPass(VkDevice device, VkRenderPass renderPass, const VkAllocation dev_data->device_dispatch_table->DestroyRenderPass(device, renderPass, pAllocator); loader_platform_thread_lock_mutex(&globalLock); dev_data->renderPassMap.erase(renderPass); -#if MTMERGESOURCE - dev_data->passMap.erase(renderPass); -#endif loader_platform_thread_unlock_mutex(&globalLock); } @@ -9362,44 +9358,6 @@ VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateRenderPass(VkDevice devic VkResult result = dev_data->device_dispatch_table->CreateRenderPass(device, pCreateInfo, pAllocator, pRenderPass); if (VK_SUCCESS == result) { loader_platform_thread_lock_mutex(&globalLock); -#if MTMERGESOURCE - // MTMTODO : Merge with code from below to eliminate duplication - for (uint32_t i = 0; i < pCreateInfo->attachmentCount; ++i) { - VkAttachmentDescription desc = pCreateInfo->pAttachments[i]; - MT_PASS_ATTACHMENT_INFO pass_info; - pass_info.load_op = desc.loadOp; - pass_info.store_op = desc.storeOp; - pass_info.attachment = i; - dev_data->passMap[*pRenderPass].attachments.push_back(pass_info); - } - // TODO: Maybe fill list and then copy instead of locking - std::unordered_map<uint32_t, bool> &attachment_first_read = dev_data->passMap[*pRenderPass].attachment_first_read; - std::unordered_map<uint32_t, VkImageLayout> &attachment_first_layout = dev_data->passMap[*pRenderPass].attachment_first_layout; - for (uint32_t i = 0; i < pCreateInfo->subpassCount; ++i) { - const VkSubpassDescription &subpass = pCreateInfo->pSubpasses[i]; - for (uint32_t j = 0; j < subpass.inputAttachmentCount; ++j) { - uint32_t attachment = subpass.pInputAttachments[j].attachment; - if (attachment_first_read.count(attachment)) - continue; - attachment_first_read.insert(std::make_pair(attachment, true)); - attachment_first_layout.insert(std::make_pair(attachment, subpass.pInputAttachments[j].layout)); - } - for (uint32_t j = 0; j < subpass.colorAttachmentCount; ++j) { - uint32_t attachment = subpass.pColorAttachments[j].attachment; - if (attachment_first_read.count(attachment)) - continue; - attachment_first_read.insert(std::make_pair(attachment, false)); - attachment_first_layout.insert(std::make_pair(attachment, subpass.pColorAttachments[j].layout)); - } - if (subpass.pDepthStencilAttachment && subpass.pDepthStencilAttachment->attachment != VK_ATTACHMENT_UNUSED) { - uint32_t attachment = subpass.pDepthStencilAttachment->attachment; - if (attachment_first_read.count(attachment)) - continue; - attachment_first_read.insert(std::make_pair(attachment, false)); - attachment_first_layout.insert(std::make_pair(attachment, subpass.pDepthStencilAttachment->layout)); - } - } -#endif // TODOSC : Merge in tracking of renderpass from shader_checker // Shadow create info and store in map VkRenderPassCreateInfo *localRPCI = new VkRenderPassCreateInfo(*pCreateInfo); @@ -9451,6 +9409,45 @@ VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateRenderPass(VkDevice devic dev_data->renderPassMap[*pRenderPass] = new RENDER_PASS_NODE(localRPCI); dev_data->renderPassMap[*pRenderPass]->hasSelfDependency = has_self_dependency; dev_data->renderPassMap[*pRenderPass]->subpassToNode = subpass_to_node; +#if MTMERGESOURCE + // MTMTODO : Merge with code from above to eliminate duplication + for (uint32_t i = 0; i < pCreateInfo->attachmentCount; ++i) { + VkAttachmentDescription desc = pCreateInfo->pAttachments[i]; + MT_PASS_ATTACHMENT_INFO pass_info; + pass_info.load_op = desc.loadOp; + pass_info.store_op = desc.storeOp; + pass_info.attachment = i; + dev_data->renderPassMap[*pRenderPass]->attachments.push_back(pass_info); + } + // TODO: Maybe fill list and then copy instead of locking + std::unordered_map<uint32_t, bool> &attachment_first_read = dev_data->renderPassMap[*pRenderPass]->attachment_first_read; + std::unordered_map<uint32_t, VkImageLayout> &attachment_first_layout = + dev_data->renderPassMap[*pRenderPass]->attachment_first_layout; + for (uint32_t i = 0; i < pCreateInfo->subpassCount; ++i) { + const VkSubpassDescription &subpass = pCreateInfo->pSubpasses[i]; + for (uint32_t j = 0; j < subpass.inputAttachmentCount; ++j) { + uint32_t attachment = subpass.pInputAttachments[j].attachment; + if (attachment_first_read.count(attachment)) + continue; + attachment_first_read.insert(std::make_pair(attachment, true)); + attachment_first_layout.insert(std::make_pair(attachment, subpass.pInputAttachments[j].layout)); + } + for (uint32_t j = 0; j < subpass.colorAttachmentCount; ++j) { + uint32_t attachment = subpass.pColorAttachments[j].attachment; + if (attachment_first_read.count(attachment)) + continue; + attachment_first_read.insert(std::make_pair(attachment, false)); + attachment_first_layout.insert(std::make_pair(attachment, subpass.pColorAttachments[j].layout)); + } + if (subpass.pDepthStencilAttachment && subpass.pDepthStencilAttachment->attachment != VK_ATTACHMENT_UNUSED) { + uint32_t attachment = subpass.pDepthStencilAttachment->attachment; + if (attachment_first_read.count(attachment)) + continue; + attachment_first_read.insert(std::make_pair(attachment, false)); + attachment_first_layout.insert(std::make_pair(attachment, subpass.pDepthStencilAttachment->layout)); + } + } +#endif loader_platform_thread_unlock_mutex(&globalLock); } return result; @@ -9594,15 +9591,15 @@ vkCmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo GLOBAL_CB_NODE *pCB = getCBNode(dev_data, commandBuffer); if (pCB) { if (pRenderPassBegin && pRenderPassBegin->renderPass) { -#if MTMERGESOURCE - auto pass_data = dev_data->passMap.find(pRenderPassBegin->renderPass); - if (pass_data != dev_data->passMap.end()) { - MT_PASS_INFO &pass_info = pass_data->second; - pass_info.fb = pRenderPassBegin->framebuffer; +#if MTMERGE + 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; auto cb_data = dev_data->commandBufferMap.find(commandBuffer); - for (size_t i = 0; i < pass_info.attachments.size(); ++i) { - MT_FB_ATTACHMENT_INFO &fb_info = dev_data->frameBufferMap[pass_info.fb].attachments[i]; - if (pass_info.attachments[i].load_op == VK_ATTACHMENT_LOAD_OP_CLEAR) { + for (size_t i = 0; i < pRPNode->attachments.size(); ++i) { + MT_FB_ATTACHMENT_INFO &fb_info = dev_data->frameBufferMap[pRPNode->fb].attachments[i]; + if (pRPNode->attachments[i].load_op == VK_ATTACHMENT_LOAD_OP_CLEAR) { if (cb_data != dev_data->commandBufferMap.end()) { std::function<VkBool32()> function = [=]() { set_memory_valid(dev_data, fb_info.mem, true, fb_info.image); @@ -9610,16 +9607,16 @@ vkCmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo }; cb_data->second->validate_functions.push_back(function); } - VkImageLayout &attachment_layout = pass_info.attachment_first_layout[pass_info.attachments[i].attachment]; + VkImageLayout &attachment_layout = pRPNode->attachment_first_layout[pRPNode->attachments[i].attachment]; if (attachment_layout == VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL || attachment_layout == VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL) { skipCall |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, (uint64_t)(pRenderPassBegin->renderPass), __LINE__, MEMTRACK_INVALID_LAYOUT, "MEM", "Cannot clear attachment %d with invalid first layout %d.", - pass_info.attachments[i].attachment, attachment_layout); + pRPNode->attachments[i].attachment, attachment_layout); } - } else if (pass_info.attachments[i].load_op == VK_ATTACHMENT_LOAD_OP_DONT_CARE) { + } else if (pRPNode->attachments[i].load_op == VK_ATTACHMENT_LOAD_OP_DONT_CARE) { if (cb_data != dev_data->commandBufferMap.end()) { std::function<VkBool32()> function = [=]() { set_memory_valid(dev_data, fb_info.mem, false, fb_info.image); @@ -9627,7 +9624,7 @@ vkCmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo }; cb_data->second->validate_functions.push_back(function); } - } else if (pass_info.attachments[i].load_op == VK_ATTACHMENT_LOAD_OP_LOAD) { + } else if (pRPNode->attachments[i].load_op == VK_ATTACHMENT_LOAD_OP_LOAD) { if (cb_data != dev_data->commandBufferMap.end()) { std::function<VkBool32()> function = [=]() { return validate_memory_is_valid(dev_data, fb_info.mem, "vkCmdBeginRenderPass()", fb_info.image); @@ -9635,7 +9632,7 @@ vkCmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo cb_data->second->validate_functions.push_back(function); } } - if (pass_info.attachment_first_read[pass_info.attachments[i].attachment]) { + if (pRPNode->attachment_first_read[pRPNode->attachments[i].attachment]) { if (cb_data != dev_data->commandBufferMap.end()) { std::function<VkBool32()> function = [=]() { return validate_memory_is_valid(dev_data, fb_info.mem, "vkCmdBeginRenderPass()", fb_info.image); @@ -9709,12 +9706,12 @@ VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdEndRenderPass(VkCommandBuffer co #if MTMERGESOURCE auto cb_data = dev_data->commandBufferMap.find(commandBuffer); if (cb_data != dev_data->commandBufferMap.end()) { - auto pass_data = dev_data->passMap.find(cb_data->second->activeRenderPass); - if (pass_data != dev_data->passMap.end()) { - MT_PASS_INFO &pass_info = pass_data->second; - for (size_t i = 0; i < pass_info.attachments.size(); ++i) { - MT_FB_ATTACHMENT_INFO &fb_info = dev_data->frameBufferMap[pass_info.fb].attachments[i]; - if (pass_info.attachments[i].store_op == VK_ATTACHMENT_STORE_OP_STORE) { + auto pass_data = dev_data->renderPassMap.find(cb_data->second->activeRenderPass); + if (pass_data != dev_data->renderPassMap.end()) { + RENDER_PASS_NODE* pRPNode = pass_data->second; + for (size_t i = 0; i < pRPNode->attachments.size(); ++i) { + MT_FB_ATTACHMENT_INFO &fb_info = dev_data->frameBufferMap[pRPNode->fb].attachments[i]; + if (pRPNode->attachments[i].store_op == VK_ATTACHMENT_STORE_OP_STORE) { if (cb_data != dev_data->commandBufferMap.end()) { std::function<VkBool32()> function = [=]() { set_memory_valid(dev_data, fb_info.mem, true, fb_info.image); @@ -9722,7 +9719,7 @@ VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdEndRenderPass(VkCommandBuffer co }; cb_data->second->validate_functions.push_back(function); } - } else if (pass_info.attachments[i].store_op == VK_ATTACHMENT_STORE_OP_DONT_CARE) { + } else if (pRPNode->attachments[i].store_op == VK_ATTACHMENT_STORE_OP_DONT_CARE) { if (cb_data != dev_data->commandBufferMap.end()) { std::function<VkBool32()> function = [=]() { set_memory_valid(dev_data, fb_info.mem, false, fb_info.image); diff --git a/layers/core_validation.h b/layers/core_validation.h index 8ee60004a..69b4f8ff8 100644 --- a/layers/core_validation.h +++ b/layers/core_validation.h @@ -161,13 +161,6 @@ struct MT_PASS_ATTACHMENT_INFO { VkAttachmentStoreOp store_op; }; -struct MT_PASS_INFO { - VkFramebuffer fb; - std::vector<MT_PASS_ATTACHMENT_INFO> attachments; - std::unordered_map<uint32_t, bool> attachment_first_read; - std::unordered_map<uint32_t, VkImageLayout> attachment_first_layout; -}; - // Associate fenceId with a fence object struct MT_FENCE_INFO { uint64_t fenceId; // Sequence number for fence at last submit @@ -486,11 +479,15 @@ struct DAGNode { struct RENDER_PASS_NODE { VkRenderPassCreateInfo const *pCreateInfo; - std::vector<bool> hasSelfDependency; - std::vector<DAGNode> subpassToNode; - vector<std::vector<VkFormat>> subpassColorFormats; - - RENDER_PASS_NODE(VkRenderPassCreateInfo const *pCreateInfo) : pCreateInfo(pCreateInfo) { + VkFramebuffer fb; + vector<bool> hasSelfDependency; + vector<DAGNode> subpassToNode; + vector<vector<VkFormat>> subpassColorFormats; + vector<MT_PASS_ATTACHMENT_INFO> attachments; + unordered_map<uint32_t, bool> attachment_first_read; + unordered_map<uint32_t, VkImageLayout> attachment_first_layout; + + RENDER_PASS_NODE(VkRenderPassCreateInfo const *pCreateInfo) : pCreateInfo(pCreateInfo), fb(VK_NULL_HANDLE) { uint32_t i; subpassColorFormats.reserve(pCreateInfo->subpassCount); |