layers: MR103, Improve image dependency validation

Remove duplicate dag creation and make sure image is valid if read first
in a subpass dag.
diff --git a/layers/draw_state.cpp b/layers/draw_state.cpp
index 01c9a56..a4385ed 100644
--- a/layers/draw_state.cpp
+++ b/layers/draw_state.cpp
@@ -4846,26 +4846,10 @@
     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 8fa1223..538d89a 100644
--- a/layers/mem_tracker.cpp
+++ b/layers/mem_tracker.cpp
@@ -2917,10 +2917,34 @@
         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 @@
                 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 1bf6ce5..d153115 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_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