diff options
| author | Michael Lentine <mlentine@google.com> | 2015-12-22 11:36:14 -0600 |
|---|---|---|
| committer | Mark Lobodzinski <mark@lunarg.com> | 2015-12-28 17:10:43 -0700 |
| commit | 8be41a860c251b6fccc44552088b70ac919e00df (patch) | |
| tree | 90a70570e07cfd7360d28ad861c14749f2dd0247 | |
| parent | 9722858f4a219f930ed4d2d744454a31d69d5c1a (diff) | |
| download | usermoji-8be41a860c251b6fccc44552088b70ac919e00df.tar.xz | |
layers: MR103, Improve image dependency validation
Remove duplicate dag creation and make sure image is valid if read first
in a subpass dag.
| -rw-r--r-- | layers/draw_state.cpp | 20 | ||||
| -rw-r--r-- | layers/mem_tracker.cpp | 29 | ||||
| -rw-r--r-- | layers/mem_tracker.h | 5 |
3 files changed, 35 insertions, 19 deletions
diff --git a/layers/draw_state.cpp b/layers/draw_state.cpp index 01c9a563..a4385ed2 100644 --- a/layers/draw_state.cpp +++ b/layers/draw_state.cpp @@ -4846,26 +4846,10 @@ VkBool32 CheckPreserved(const layer_data* my_data, VkDevice device, const VkRend return result; } -VkBool32 ValidateDependencies(const layer_data* my_data, VkDevice device, const VkRenderPassCreateInfo* pCreateInfo, std::vector<DAGNode>& subpass_to_node) { - VkBool32 skip_call = false; +VkBool32 ValidateDependencies(const layer_data* my_data, VkDevice device, const VkRenderPassCreateInfo* pCreateInfo, const std::vector<DAGNode>& subpass_to_node) { + VkBool32 skip_call = false; std::vector<std::vector<uint32_t>> output_attachment_to_subpass(pCreateInfo->attachmentCount); std::vector<std::vector<uint32_t>> input_attachment_to_subpass(pCreateInfo->attachmentCount); - - // Create DAG - for (uint32_t i = 0; i < pCreateInfo->subpassCount; ++i) { - DAGNode& subpass_node = subpass_to_node[i]; - subpass_node.pass = i; - } - for (uint32_t i = 0; i < pCreateInfo->dependencyCount; ++i) { - const VkSubpassDependency& dependency = pCreateInfo->pDependencies[i]; - if (dependency.srcSubpass > dependency.dstSubpass) { - skip_call |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, 0, DRAWSTATE_INVALID_RENDERPASS, "DS", - "Dependency graph must be specified such that an earlier pass cannot depend on a later pass."); - } - subpass_to_node[dependency.dstSubpass].prev.push_back(dependency.srcSubpass); - subpass_to_node[dependency.srcSubpass].next.push_back(dependency.dstSubpass); - } - // Find for each attachment the subpasses that use them. for (uint32_t i = 0; i < pCreateInfo->subpassCount; ++i) { const VkSubpassDescription& subpass = pCreateInfo->pSubpasses[i]; diff --git a/layers/mem_tracker.cpp b/layers/mem_tracker.cpp index 8fa12234..538d89aa 100644 --- a/layers/mem_tracker.cpp +++ b/layers/mem_tracker.cpp @@ -2917,10 +2917,34 @@ VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateRenderPass( MT_PASS_ATTACHMENT_INFO pass_info; pass_info.load_op = desc.loadOp; pass_info.store_op = desc.storeOp; + pass_info.attachment = i; loader_platform_thread_lock_mutex(&globalLock); my_data->passMap[*pRenderPass].attachments.push_back(pass_info); loader_platform_thread_unlock_mutex(&globalLock); } + //TODO: Maybe fill list and then copy instead of locking + loader_platform_thread_lock_mutex(&globalLock); + std::unordered_map<uint32_t, bool>& attachment_first_read = my_data->passMap[*pRenderPass].attachment_first_read; + 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)); + } + 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)); + } + 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)); + } + } + loader_platform_thread_unlock_mutex(&globalLock); + return result; } @@ -2941,9 +2965,14 @@ VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdBeginRenderPass( MT_FB_ATTACHMENT_INFO& fb_info = my_data->fbMap[pass_info.fb].attachments[i]; if (pass_info.attachments[i].load_op == VK_ATTACHMENT_LOAD_OP_CLEAR) { set_memory_valid(my_data, fb_info.mem, true, fb_info.image); + } else if (pass_info.attachments[i].load_op == VK_ATTACHMENT_LOAD_OP_DONT_CARE) { + set_memory_valid(my_data, fb_info.mem, false, fb_info.image); } else if (pass_info.attachments[i].load_op == VK_ATTACHMENT_LOAD_OP_LOAD) { skip_call |= validate_memory_is_valid(my_data, fb_info.mem, fb_info.image); } + if (pass_info.attachment_first_read[pass_info.attachments[i].attachment]) { + skip_call |= validate_memory_is_valid(my_data, fb_info.mem, fb_info.image); + } } auto cb_data = my_data->cbMap.find(cmdBuffer); if (cb_data != my_data->cbMap.end()) { diff --git a/layers/mem_tracker.h b/layers/mem_tracker.h index 1bf6ce51..d153115f 100644 --- a/layers/mem_tracker.h +++ b/layers/mem_tracker.h @@ -25,6 +25,7 @@ */ #pragma once #include <vector> +#include <unordered_map> #include "vulkan/vk_layer.h" #include "vulkan/vk_ext_debug_report.h" @@ -161,13 +162,15 @@ struct MT_FB_INFO { }; struct MT_PASS_ATTACHMENT_INFO { + uint32_t attachment; VkAttachmentLoadOp load_op; - VkAttachmentStoreOp store_op; + 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; }; // Associate fenceId with a fence object |
