diff options
| author | Tobin Ehlis <tobine@google.com> | 2016-06-22 08:29:24 -0600 |
|---|---|---|
| committer | Tobin Ehlis <tobine@google.com> | 2016-06-23 13:49:43 -0600 |
| commit | be2ddfb5349fcea5f9f0844eeade313037e08c35 (patch) | |
| tree | aa16789470f2881f2cea29b375437a560b5d1227 | |
| parent | 08e6392ffd1cae8a58911ba04a4fd940c0a9fe2e (diff) | |
| download | usermoji-be2ddfb5349fcea5f9f0844eeade313037e08c35.tar.xz | |
layers: Clean up frameBuffer map
Update frameBufferMap to store unique ptrs and kill a new/delete.
Add safe_ structs to FRAMEBUFFER_NODE for frameBuffer and renderPass
create info structs in order to correctly shadow the whole struct.
| -rw-r--r-- | layers/core_validation.cpp | 30 | ||||
| -rw-r--r-- | layers/core_validation.h | 5 |
2 files changed, 16 insertions, 19 deletions
diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index d5d46aad..bb793196 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -142,7 +142,7 @@ struct layer_data { unordered_map<VkQueryPool, QUERY_POOL_NODE> queryPoolMap; unordered_map<VkSemaphore, SEMAPHORE_NODE> semaphoreMap; unordered_map<VkCommandBuffer, GLOBAL_CB_NODE *> commandBufferMap; - unordered_map<VkFramebuffer, FRAMEBUFFER_NODE> frameBufferMap; + unordered_map<VkFramebuffer, unique_ptr<FRAMEBUFFER_NODE>> frameBufferMap; unordered_map<VkImage, vector<ImageSubresourcePair>> imageSubresourceMap; unordered_map<ImageSubresourcePair, IMAGE_LAYOUT_NODE> imageLayoutMap; unordered_map<VkRenderPass, RENDER_PASS_NODE *> renderPassMap; @@ -2053,12 +2053,12 @@ static RENDER_PASS_NODE *getRenderPass(layer_data const *my_data, VkRenderPass r return it->second; } -static FRAMEBUFFER_NODE *getFramebuffer(layer_data *my_data, VkFramebuffer framebuffer) { +static FRAMEBUFFER_NODE *getFramebuffer(const layer_data *my_data, VkFramebuffer framebuffer) { auto it = my_data->frameBufferMap.find(framebuffer); if (it == my_data->frameBufferMap.end()) { return nullptr; } - return &it->second; + return it->second.get(); } cvdescriptorset::DescriptorSetLayout const *getDescriptorSetLayout(layer_data const *my_data, VkDescriptorSetLayout dsLayout) { @@ -5496,7 +5496,7 @@ DestroyFramebuffer(VkDevice device, VkFramebuffer framebuffer, const VkAllocatio std::unique_lock<std::mutex> lock(global_lock); auto fbNode = dev_data->frameBufferMap.find(framebuffer); if (fbNode != dev_data->frameBufferMap.end()) { - for (auto cb : fbNode->second.referencingCmdBuffers) { + for (auto cb : fbNode->second->referencingCmdBuffers) { auto cbNode = dev_data->commandBufferMap.find(cb); if (cbNode != dev_data->commandBufferMap.end()) { // Set CB as invalid and record destroyed framebuffer @@ -5504,7 +5504,6 @@ DestroyFramebuffer(VkDevice device, VkFramebuffer framebuffer, const VkAllocatio cbNode->second->destroyedFramebuffers.insert(framebuffer); } } - delete [] fbNode->second.createInfo.pAttachments; dev_data->frameBufferMap.erase(fbNode); } lock.unlock(); @@ -8267,15 +8266,10 @@ VKAPI_ATTR VkResult VKAPI_CALL CreateFramebuffer(VkDevice device, const VkFrameb // Shadow create info and store in map std::lock_guard<std::mutex> lock(global_lock); + dev_data->frameBufferMap.insert( + std::make_pair(*pFramebuffer, unique_ptr<FRAMEBUFFER_NODE>(new FRAMEBUFFER_NODE( + pCreateInfo, dev_data->renderPassMap[pCreateInfo->renderPass]->pCreateInfo)))); auto & fbNode = dev_data->frameBufferMap[*pFramebuffer]; - fbNode.createInfo = *pCreateInfo; - if (pCreateInfo->pAttachments) { - auto attachments = new VkImageView[pCreateInfo->attachmentCount]; - memcpy(attachments, - pCreateInfo->pAttachments, - pCreateInfo->attachmentCount * sizeof(VkImageView)); - fbNode.createInfo.pAttachments = attachments; - } for (uint32_t i = 0; i < pCreateInfo->attachmentCount; ++i) { VkImageView view = pCreateInfo->pAttachments[i]; auto view_data = getImageViewData(dev_data, view); @@ -8286,7 +8280,7 @@ VKAPI_ATTR VkResult VKAPI_CALL CreateFramebuffer(VkDevice device, const VkFrameb get_mem_binding_from_object(dev_data, (uint64_t)(view_data->image), VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, &fb_info.mem); fb_info.image = view_data->image; - fbNode.attachments.push_back(fb_info); + fbNode->attachments.push_back(fb_info); } } return result; @@ -8389,7 +8383,7 @@ bool isRegionOverlapping(VkImageSubresourceRange range1, VkImageSubresourceRange static bool ValidateDependencies(const layer_data *my_data, FRAMEBUFFER_NODE const * framebuffer, RENDER_PASS_NODE const * renderPass) { bool skip_call = false; - const VkFramebufferCreateInfo *pFramebufferInfo = &framebuffer->createInfo; + const safe_VkFramebufferCreateInfo *pFramebufferInfo = &framebuffer->createInfo; const VkRenderPassCreateInfo *pCreateInfo = renderPass->pCreateInfo; auto const & subpass_to_node = renderPass->subpassToNode; std::vector<std::vector<uint32_t>> output_attachment_to_subpass(pCreateInfo->attachmentCount); @@ -8875,7 +8869,7 @@ static void deleteRenderPasses(layer_data *my_data) { static bool VerifyFramebufferAndRenderPassLayouts(layer_data *dev_data, GLOBAL_CB_NODE *pCB, const VkRenderPassBeginInfo *pRenderPassBegin) { bool skip_call = false; const VkRenderPassCreateInfo *pRenderPassInfo = dev_data->renderPassMap[pRenderPassBegin->renderPass]->pCreateInfo; - const VkFramebufferCreateInfo framebufferInfo = dev_data->frameBufferMap[pRenderPassBegin->framebuffer].createInfo; + const safe_VkFramebufferCreateInfo framebufferInfo = dev_data->frameBufferMap[pRenderPassBegin->framebuffer]->createInfo; if (pRenderPassInfo->attachmentCount != framebufferInfo.attachmentCount) { skip_call |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, DRAWSTATE_INVALID_RENDERPASS, "DS", "You cannot start a render pass using a framebuffer " @@ -8925,7 +8919,7 @@ static void TransitionSubpassLayouts(layer_data *dev_data, GLOBAL_CB_NODE *pCB, if (!framebuffer) return; - const VkFramebufferCreateInfo &framebufferInfo = framebuffer->createInfo; + const safe_VkFramebufferCreateInfo &framebufferInfo = framebuffer->createInfo; const VkSubpassDescription &subpass = renderPass->pCreateInfo->pSubpasses[subpass_index]; for (uint32_t j = 0; j < subpass.inputAttachmentCount; ++j) { const VkImageView &image_view = framebufferInfo.pAttachments[subpass.pInputAttachments[j].attachment]; @@ -8969,7 +8963,7 @@ static void TransitionFinalSubpassLayouts(layer_data *dev_data, GLOBAL_CB_NODE * static bool VerifyRenderAreaBounds(const layer_data *my_data, const VkRenderPassBeginInfo *pRenderPassBegin) { bool skip_call = false; - const VkFramebufferCreateInfo *pFramebufferInfo = &my_data->frameBufferMap.at(pRenderPassBegin->framebuffer).createInfo; + const safe_VkFramebufferCreateInfo *pFramebufferInfo = &getFramebuffer(my_data, pRenderPassBegin->framebuffer)->createInfo; if (pRenderPassBegin->renderArea.offset.x < 0 || (pRenderPassBegin->renderArea.offset.x + pRenderPassBegin->renderArea.extent.width) > pFramebufferInfo->width || pRenderPassBegin->renderArea.offset.y < 0 || diff --git a/layers/core_validation.h b/layers/core_validation.h index 451d6b65..fe5a3d57 100644 --- a/layers/core_validation.h +++ b/layers/core_validation.h @@ -255,9 +255,12 @@ class QUERY_POOL_NODE : public BASE_NODE { class FRAMEBUFFER_NODE { public: - VkFramebufferCreateInfo createInfo; + safe_VkFramebufferCreateInfo createInfo; + safe_VkRenderPassCreateInfo renderPassCreateInfo; std::unordered_set<VkCommandBuffer> referencingCmdBuffers; std::vector<MT_FB_ATTACHMENT_INFO> attachments; + FRAMEBUFFER_NODE(const VkFramebufferCreateInfo *pCreateInfo, const VkRenderPassCreateInfo *pRPCI) + : createInfo(pCreateInfo), renderPassCreateInfo(pRPCI){}; }; typedef struct stencil_data { |
