mem_tracker: Process config file debug actions

Now that debug report functionality is in place can use
that mechanism to handle logging enabled by vk_layer_settings.txt
diff --git a/layers/mem_tracker.cpp b/layers/mem_tracker.cpp
index 618f7aa..a0f45bc 100644
--- a/layers/mem_tracker.cpp
+++ b/layers/mem_tracker.cpp
@@ -48,6 +48,7 @@
 typedef struct _layer_data {
     debug_report_data *report_data;
     // TODO: put instance data here
+    VkDbgMsgCallback logging_callback;
 } layer_data;
 
 static std::unordered_map<void *, layer_data *> layer_data_map;
@@ -787,24 +788,28 @@
     }
 }
 
-static void initMemTracker(
-    void)
+static void init_mem_tracker(
+    layer_data *my_data)
 {
-    const char *strOpt;
-#if 0
+    uint32_t report_flags = 0;
+    uint32_t debug_action = 0;
+    FILE *log_output = NULL;
+    const char *option_str;
     // initialize MemTracker options
-    getLayerOptionEnum("MemTrackerReportLevel", (uint32_t *) &g_reportFlags);
-    g_actionIsDefault = getLayerOptionEnum("MemTrackerDebugAction", (uint32_t *) &g_debugAction);
+    report_flags = getLayerOptionFlags("MemTrackerReportFlags", 0);
+    getLayerOptionEnum("MemTrackerDebugAction", (uint32_t *) &debug_action);
 
-    if (g_debugAction & VK_DBG_LAYER_ACTION_LOG_MSG)
+    if (debug_action & VK_DBG_LAYER_ACTION_LOG_MSG)
     {
-        strOpt = getLayerOption("MemTrackerLogFilename");
-        if (strOpt) {
-            g_logFile = fopen(strOpt, "w");
+        option_str = getLayerOption("MemTrackerLogFilename");
+        if (option_str) {
+            log_output = fopen(option_str, "w");
         }
-        if (g_logFile == NULL) {
-            g_logFile = stdout;
+        if (log_output == NULL) {
+            log_output = stdout;
         }
+
+        layer_create_msg_callback(my_data->report_data, report_flags, log_callback, (void *) log_output, &my_data->logging_callback);
     }
 
     if (!globalLockInitialized)
@@ -817,7 +822,6 @@
         loader_platform_thread_create_mutex(&globalLock);
         globalLockInitialized = 1;
     }
-#endif
 }
 
 // hook DestroyInstance to remove tableInstanceMap entry
@@ -826,6 +830,13 @@
     dispatch_key key = get_dispatch_key(instance);
     VkLayerInstanceDispatchTable *pTable = get_dispatch_table(mem_tracker_instance_table_map, instance);
     VkResult res = pTable->DestroyInstance(instance);
+
+    // Clean up logging callback, if any
+    layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
+    if (my_data->logging_callback) {
+        layer_destroy_msg_callback(my_data->report_data, my_data->logging_callback);
+    }
+
     layer_debug_report_destroy_instance(mid(instance));
     layer_data_map.erase(pTable);
 
@@ -838,8 +849,6 @@
     const VkInstanceCreateInfo*                 pCreateInfo,
     VkInstance*                                 pInstance)
 {
-    loader_platform_thread_once(&g_initOnce, initMemTracker);
-
     VkLayerInstanceDispatchTable *pTable = get_dispatch_table(mem_tracker_instance_table_map, *pInstance);
     VkResult result = pTable->CreateInstance(pCreateInfo, pInstance);
 
@@ -850,6 +859,8 @@
                                    *pInstance,
                                    pCreateInfo->extensionCount,
                                    pCreateInfo->pEnabledExtensions);
+
+        init_mem_tracker(my_data);
     }
     return result;
 }
@@ -2184,8 +2195,6 @@
         return NULL;
     }
 
-    loader_platform_thread_once(&g_initOnce, initMemTracker);
-
     /* loader uses this to force layer initialization; device object is wrapped */
     if (!strcmp(funcName, "vkGetDeviceProcAddr")) {
         initDeviceTable(mem_tracker_device_table_map, (const VkBaseLayerObject *) dev);
@@ -2340,8 +2349,6 @@
         return NULL;
     }
 
-    loader_platform_thread_once(&g_initOnce, initMemTracker);
-
     /* loader uses this to force layer initialization; instance object is wrapped */
     if (!strcmp(funcName, "vkGetInstanceProcAddr")) {
         initInstanceTable(mem_tracker_instance_table_map, (const VkBaseLayerObject *) instance);