loader: Add LOADER_DEBUG environment flags

The loader_log function now uses a global flag to
determine which log messages to echo to stderr.
The flags can be set by setting the LOADER_DEBUG
environment variable to colon separate list of
tokens.
diff --git a/loader/loader.c b/loader/loader.c
index fad8f24..eb8619f 100644
--- a/loader/loader.c
+++ b/loader/loader.c
@@ -67,6 +67,17 @@
 /* TODO: do we need to lock around access to linked lists and such? */
 struct loader_struct loader = {0};
 
+enum loader_debug {
+    LOADER_INFO_BIT       = VK_BIT(0),
+    LOADER_WARN_BIT       = VK_BIT(1),
+    LOADER_PERF_BIT       = VK_BIT(2),
+    LOADER_ERROR_BIT      = VK_BIT(3),
+    LOADER_DEBUG_BIT      = VK_BIT(4),
+};
+
+uint32_t g_loader_debug = 0;
+uint32_t g_loader_log_msgs = 0;
+
 VkLayerInstanceDispatchTable instance_disp = {
     .GetInstanceProcAddr = vkGetInstanceProcAddr,
     .CreateInstance = loader_CreateInstance,
@@ -195,6 +206,10 @@
     va_list ap;
     int ret;
 
+    if (!(msg_code & g_loader_log_msgs)) {
+        return;
+    }
+
     va_start(ap, format);
     ret = vsnprintf(msg, sizeof(msg), format, ap);
     if ((ret >= (int) sizeof(msg)) || ret < 0) {
@@ -203,11 +218,10 @@
     va_end(ap);
 
 #if defined(WIN32)
-	OutputDebugString(msg);
+        OutputDebugString(msg);
 #endif
     fputs(msg, stderr);
     fputc('\n', stderr);
-
 }
 
 bool compare_vk_extension_properties(const VkExtensionProperties *op1, const VkExtensionProperties *op2)
@@ -625,6 +639,52 @@
     return;
 }
 
+static void loader_debug_init(void)
+{
+    const char *env;
+
+    if (g_loader_debug > 0)
+        return;
+
+    g_loader_debug = 0;
+
+    /* parse comma-separated debug options */
+    env = getenv("LOADER_DEBUG");
+    while (env) {
+        const char *p = strchr(env, ',');
+        size_t len;
+
+        if (p)
+            len = p - env;
+        else
+            len = strlen(env);
+
+        if (len > 0) {
+            if (strncmp(env, "warn", len) == 0) {
+                g_loader_debug |= LOADER_WARN_BIT;
+                g_loader_log_msgs |= VK_DBG_REPORT_WARN_BIT;
+            } else if (strncmp(env, "info", len) == 0) {
+                g_loader_debug |= LOADER_INFO_BIT;
+                g_loader_log_msgs |= VK_DBG_REPORT_INFO_BIT;
+            } else if (strncmp(env, "perf", len) == 0) {
+                g_loader_debug |= LOADER_PERF_BIT;
+                g_loader_log_msgs |= VK_DBG_REPORT_PERF_WARN_BIT;
+            } else if (strncmp(env, "error", len) == 0) {
+                g_loader_debug |= LOADER_ERROR_BIT;
+                g_loader_log_msgs |= VK_DBG_REPORT_ERROR_BIT;
+            } else if (strncmp(env, "debug", len) == 0) {
+                g_loader_debug |= LOADER_DEBUG_BIT;
+                g_loader_log_msgs |= VK_DBG_REPORT_DEBUG_BIT;
+            }
+        }
+
+        if (!p)
+            break;
+
+        env = p + 1;
+    }
+}
+
 /**
  * Try to \c loader_icd_scan VK driver(s).
  *
@@ -664,6 +724,8 @@
     }
 #endif // WIN32
 
+    loader_debug_init();
+
     for (p = libPaths; *p; p = next) {
        next = strchr(p, PATH_SEPERATOR);
        if (next == NULL) {
@@ -848,7 +910,7 @@
 
                         strcpy(loader.scanned_layers[count].lib_name, temp_str);
 
-                        fprintf(stderr, "Collecting global extensions for %s\n", temp_str);
+                        loader_log(VK_DBG_REPORT_DEBUG_BIT, 0, "Collecting global extensions for %s\n", temp_str);
                         get_global_extensions(
                                     fp_get_ext,
                                     "vkGetGlobalExtensionInfo",