layers: Create desc_update_template map for new objs

Store unique_objects DescriptorUpdateTemplate data in a map
for parsing UpdateTempate buffers.

Change-Id: Iab0d95a1aa2f309a3d33c8859b16543f98ca549c
diff --git a/layers/unique_objects.cpp b/layers/unique_objects.cpp
index cf7891a..eb5680c 100644
--- a/layers/unique_objects.cpp
+++ b/layers/unique_objects.cpp
@@ -628,12 +628,15 @@
     }
     VkResult result = dev_data->device_dispatch_table->CreateDescriptorUpdateTemplateKHR(
         device, (const VkDescriptorUpdateTemplateCreateInfoKHR *)local_pCreateInfo, pAllocator, pDescriptorUpdateTemplate);
-    if (local_pCreateInfo) delete local_pCreateInfo;
     if (VK_SUCCESS == result) {
         std::lock_guard<std::mutex> lock(global_lock);
         uint64_t unique_id = global_unique_id++;
         dev_data->unique_id_mapping[unique_id] = reinterpret_cast<uint64_t &>(*pDescriptorUpdateTemplate);
         *pDescriptorUpdateTemplate = reinterpret_cast<VkDescriptorUpdateTemplateKHR &>(unique_id);
+
+        // Shadow template createInfo for later updates
+        std::unique_ptr<TEMPLATE_STATE> template_state(new TEMPLATE_STATE(*pDescriptorUpdateTemplate, local_pCreateInfo));
+        dev_data->desc_template_map[unique_id] = std::move(template_state);
     }
     return result;
 }
@@ -644,6 +647,7 @@
     layer_data *dev_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
     std::unique_lock<std::mutex> lock(global_lock);
     uint64_t descriptorUpdateTemplate_id = reinterpret_cast<uint64_t &>(descriptorUpdateTemplate);
+    dev_data->desc_template_map.erase(descriptorUpdateTemplate_id);
     descriptorUpdateTemplate = (VkDescriptorUpdateTemplateKHR)dev_data->unique_id_mapping[descriptorUpdateTemplate_id];
     dev_data->unique_id_mapping.erase(descriptorUpdateTemplate_id);
     lock.unlock();