loader: Started porting loader to new WSI (GIPA missing).
diff --git a/loader/CMakeLists.txt b/loader/CMakeLists.txt
index c523d3d..85d635e 100644
--- a/loader/CMakeLists.txt
+++ b/loader/CMakeLists.txt
@@ -18,8 +18,8 @@
     loader.h
     vk_loader_platform.h
     trampoline.c
-    wsi_swapchain.c
-    wsi_swapchain.h
+    wsi.c
+    wsi.h
     debug_report.c
     debug_report.h
     table_ops.h
diff --git a/loader/gpa_helper.h b/loader/gpa_helper.h
index 1c0c84e..53c408e 100644
--- a/loader/gpa_helper.h
+++ b/loader/gpa_helper.h
@@ -27,7 +27,7 @@
 
 #include <string.h>
 #include "debug_report.h"
-#include "wsi_swapchain.h"
+#include "wsi.h"
 
 static inline void* trampolineGetProcAddr(struct loader_instance *inst,
                                           const char *funcName)
diff --git a/loader/loader.c b/loader/loader.c
index 45de0e7..aef74e7 100644
--- a/loader/loader.c
+++ b/loader/loader.c
@@ -44,7 +44,7 @@
 #include "gpa_helper.h"
 #include "table_ops.h"
 #include "debug_report.h"
-#include "wsi_swapchain.h"
+#include "wsi.h"
 #include "vulkan/vk_icd.h"
 #include "cJSON.h"
 #include "murmurhash.h"
@@ -971,7 +971,7 @@
     };
 
     // Traverse loader's extensions, adding non-duplicate extensions to the list
-    wsi_swapchain_add_instance_extensions(inst, inst_exts);
+    wsi_add_instance_extensions(inst, inst_exts);
     debug_report_add_instance_extensions(inst, inst_exts);
 }
 
diff --git a/loader/loader.h b/loader/loader.h
index 2887806..f170f4d 100644
--- a/loader/loader.h
+++ b/loader/loader.h
@@ -206,6 +206,15 @@
 
     VkAllocationCallbacks alloc_callbacks;
 
+    bool wsi_surface_enabled;
+#ifdef _WIN32
+    bool wsi_win32_surface_enabled;
+#else // _WIN32
+    bool wsi_mir_surface_enabled;
+    bool wsi_wayland_surface_enabled;
+    bool wsi_xcb_surface_enabled;
+    bool wsi_xlib_surface_enabled;
+#endif // _WIN32
     bool wsi_swapchain_enabled;
 };
 
diff --git a/loader/trampoline.c b/loader/trampoline.c
index 64d69f1..b4eca0f 100644
--- a/loader/trampoline.c
+++ b/loader/trampoline.c
@@ -32,7 +32,7 @@
 #include "vk_loader_platform.h"
 #include "loader.h"
 #include "debug_report.h"
-#include "wsi_swapchain.h"
+#include "wsi.h"
 
 
 /* Trampoline entrypoints */
@@ -154,7 +154,7 @@
     }
     loader_activate_instance_layers(ptr_instance);
 
-    wsi_swapchain_create_instance(ptr_instance, pCreateInfo);
+    wsi_create_instance(ptr_instance, pCreateInfo);
     debug_report_create_instance(ptr_instance, pCreateInfo);
 
 
diff --git a/loader/wsi.c b/loader/wsi.c
new file mode 100644
index 0000000..09a5247
--- /dev/null
+++ b/loader/wsi.c
@@ -0,0 +1,176 @@
+/*
+ *
+ * Copyright (C) 2015 Valve Corporation
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Author: Ian Elliott <ian@lunarg.com>
+ *
+ */
+
+//#define _ISOC11_SOURCE /* for aligned_alloc() */
+#define _GNU_SOURCE
+#include <stdlib.h>
+#include <string.h>
+#include "vk_loader_platform.h"
+#include "loader.h"
+#include "wsi.h"
+
+static const VkExtensionProperties wsi_surface_extension_info = {
+        .extensionName = VK_KHR_SURFACE_EXTENSION_NAME,
+        .specVersion = VK_KHR_SURFACE_REVISION,
+};
+
+#ifdef _WIN32
+static const VkExtensionProperties wsi_win32_surface_extension_info = {
+        .extensionName = VK_KHR_WIN32_SURFACE_EXTENSION_NAME,
+        .specVersion = VK_KHR_WIN32_SURFACE_REVISION,
+};
+#else // _WIN32
+static const VkExtensionProperties wsi_mir_surface_extension_info = {
+        .extensionName = VK_KHR_MIR_SURFACE_EXTENSION_NAME,
+        .specVersion = VK_KHR_MIR_SURFACE_REVISION,
+};
+
+static const VkExtensionProperties wsi_wayland_surface_extension_info = {
+        .extensionName = VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME,
+        .specVersion = VK_KHR_WAYLAND_SURFACE_REVISION,
+};
+
+static const VkExtensionProperties wsi_xcb_surface_extension_info = {
+        .extensionName = VK_KHR_XCB_SURFACE_EXTENSION_NAME,
+        .specVersion = VK_KHR_XCB_SURFACE_REVISION,
+};
+
+static const VkExtensionProperties wsi_xlib_surface_extension_info = {
+        .extensionName = VK_KHR_XLIB_SURFACE_EXTENSION_NAME,
+        .specVersion = VK_KHR_XLIB_SURFACE_REVISION,
+};
+#endif // _WIN32
+
+void wsi_add_instance_extensions(
+        const struct loader_instance *inst,
+        struct loader_extension_list *ext_list)
+{
+    loader_add_to_ext_list(inst, ext_list, 1, &wsi_surface_extension_info);
+#ifdef _WIN32
+    loader_add_to_ext_list(inst, ext_list, 1, &wsi_win32_surface_extension_info);
+#else // _WIN32
+    loader_add_to_ext_list(inst, ext_list, 1, &wsi_mir_surface_extension_info);
+    loader_add_to_ext_list(inst, ext_list, 1, &wsi_wayland_surface_extension_info);
+    loader_add_to_ext_list(inst, ext_list, 1, &wsi_xcb_surface_extension_info);
+    loader_add_to_ext_list(inst, ext_list, 1, &wsi_xlib_surface_extension_info);
+#endif // _WIN32
+}
+
+void wsi_create_instance(
+        struct loader_instance *ptr_instance,
+        const VkInstanceCreateInfo *pCreateInfo)
+{
+    ptr_instance->wsi_enabled = false;
+#ifdef _WIN32
+    ptr_instance->wsi_surface_enabled = true;
+#else // _WIN32
+    ptr_instance->wsi_mir_surface_enabled = false;
+    ptr_instance->wsi_wayland_surface_enabled = false;
+    ptr_instance->wsi_xcb_surface_enabled = false;
+    ptr_instance->wsi_xlib_surface_enabled = false;
+#endif // _WIN32
+    ptr_instance->wsi_swapchain_enabled = false;
+
+    for (uint32_t i = 0; i < pCreateInfo->enabledExtensionNameCount; i++) {
+        if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_SURFACE_EXTENSION_NAME) == 0) {
+            ptr_instance->wsi_surface_enabled = true;
+        }
+#ifdef _WIN32
+        if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_WIN32_SURFACE_EXTENSION_NAME) == 0) {
+            ptr_instance->wsi_surface_enabled = true;
+        }
+#else // _WIN32
+        if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_MIR_SURFACE_EXTENSION_NAME) == 0) {
+            ptr_instance->wsi_mir_surface_enabled = true;
+        }
+        if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME) == 0) {
+            ptr_instance->wsi_wayland_surface_enabled = true;
+        }
+        if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_XCB_SURFACE_EXTENSION_NAME) == 0) {
+            ptr_instance->wsi_xcb_surface_enabled = true;
+        }
+        if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_XLIB_SURFACE_EXTENSION_NAME) == 0) {
+            ptr_instance->wsi_xlib_surface_enabled = true;
+        }
+#endif // _WIN32
+    }
+}
+
+/*
+ * This is the trampoline entrypoint
+ * for GetPhysicalDeviceSurfaceSupportKHR
+ */
+VKAPI_ATTR VkResult VKAPI_CALL wsi_swapchain_GetPhysicalDeviceSurfaceSupportKHR(
+    VkPhysicalDevice                            physicalDevice,
+    uint32_t                                    queueFamilyIndex,
+    VkSurfaceKHR                                surface,
+    VkBool32*                                   pSupported)
+{
+    const VkLayerInstanceDispatchTable *disp;
+    disp = loader_get_instance_dispatch(physicalDevice);
+    VkResult res = disp->GetPhysicalDeviceSurfaceSupportKHR(
+                                                      physicalDevice,
+                                                      queueFamilyIndex,
+                                                      surface,
+                                                      pSupported);
+    return res;
+}
+
+/*
+ * This is the instance chain terminator function
+ * for GetPhysicalDeviceSurfaceSupportKHR
+ */
+VKAPI_ATTR VkResult VKAPI_CALL loader_GetPhysicalDeviceSurfaceSupportKHR(
+    VkPhysicalDevice                            physicalDevice,
+    uint32_t                                    queueFamilyIndex,
+    VkSurfaceKHR                                surface,
+    VkBool32*                                   pSupported)
+{
+    struct loader_physical_device *phys_dev = (struct loader_physical_device *) physicalDevice;
+    struct loader_icd *icd = phys_dev->this_icd;
+
+    assert(pSupported && "GetPhysicalDeviceSurfaceSupportKHR: Error, null pSupported");
+    *pSupported = false;
+
+    assert(icd->GetPhysicalDeviceSurfaceSupportKHR && "loader: null GetPhysicalDeviceSurfaceSupportKHR ICD pointer");
+
+    return icd->GetPhysicalDeviceSurfaceSupportKHR(phys_dev->phys_dev,
+                                                   queueFamilyIndex,
+                                                   surface,
+                                                   pSupported);
+}
+
+bool wsi_swapchain_instance_gpa(struct loader_instance *ptr_instance,
+                                 const char* name, void **addr)
+{
+    *addr = NULL;
+
+    if (!strcmp("vkGetPhysicalDeviceSurfaceSupportKHR", name)) {
+        *addr = ptr_instance->wsi_swapchain_enabled ? (void *) wsi_swapchain_GetPhysicalDeviceSurfaceSupportKHR : NULL;
+        return true;
+    }
+    return false;
+}
diff --git a/loader/wsi_swapchain.h b/loader/wsi.h
similarity index 86%
rename from loader/wsi_swapchain.h
rename to loader/wsi.h
index e5885e2..958d69e 100644
--- a/loader/wsi_swapchain.h
+++ b/loader/wsi.h
@@ -29,13 +29,13 @@
 
 bool wsi_swapchain_instance_gpa(struct loader_instance *ptr_instance,
                                  const char* name, void **addr);
-void wsi_swapchain_add_instance_extensions(
-    const struct loader_instance *inst,
-    struct loader_extension_list *ext_list);
+void wsi_add_instance_extensions(
+        const struct loader_instance *inst,
+        struct loader_extension_list *ext_list);
 
-void wsi_swapchain_create_instance(
-    struct loader_instance *ptr_instance,
-    const VkInstanceCreateInfo *pCreateInfo);
+void wsi_create_instance(
+        struct loader_instance *ptr_instance,
+        const VkInstanceCreateInfo *pCreateInfo);
 
 
 VKAPI_ATTR VkResult VKAPI_CALL loader_GetPhysicalDeviceSurfaceSupportKHR(
diff --git a/loader/wsi_swapchain.c b/loader/wsi_swapchain.c
deleted file mode 100644
index fa1d995..0000000
--- a/loader/wsi_swapchain.c
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- *
- * Copyright (C) 2015 Valve Corporation
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included
- * in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Author: Ian Elliott <ian@lunarg.com>
- *
- */
-
-//#define _ISOC11_SOURCE /* for aligned_alloc() */
-#define _GNU_SOURCE
-#include <stdlib.h>
-#include <string.h>
-#include "vk_loader_platform.h"
-#include "loader.h"
-#include "wsi_swapchain.h"
-
-static const VkExtensionProperties wsi_swapchain_extension_info = {
-        .extensionName = VK_KHR_SURFACE_EXTENSION_NAME,
-        .specVersion = VK_KHR_SURFACE_REVISION,
-};
-
-void wsi_swapchain_add_instance_extensions(
-        const struct loader_instance *inst,
-        struct loader_extension_list *ext_list)
-{
-    loader_add_to_ext_list(inst, ext_list, 1, &wsi_swapchain_extension_info);
-}
-
-void wsi_swapchain_create_instance(
-        struct loader_instance *ptr_instance,
-        const VkInstanceCreateInfo *pCreateInfo)
-{
-    ptr_instance->wsi_swapchain_enabled = false;
-
-    for (uint32_t i = 0; i < pCreateInfo->enabledExtensionNameCount; i++) {
-        if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_SURFACE_EXTENSION_NAME) == 0) {
-            ptr_instance->wsi_swapchain_enabled = true;
-            return;
-        }
-    }
-}
-
-/*
- * This is the trampoline entrypoint
- * for GetPhysicalDeviceSurfaceSupportKHR
- */
-VKAPI_ATTR VkResult VKAPI_CALL wsi_swapchain_GetPhysicalDeviceSurfaceSupportKHR(
-    VkPhysicalDevice                            physicalDevice,
-    uint32_t                                    queueFamilyIndex,
-    VkSurfaceKHR                                surface,
-    VkBool32*                                   pSupported)
-{
-    const VkLayerInstanceDispatchTable *disp;
-    disp = loader_get_instance_dispatch(physicalDevice);
-    VkResult res = disp->GetPhysicalDeviceSurfaceSupportKHR(
-                                                      physicalDevice,
-                                                      queueFamilyIndex,
-                                                      surface,
-                                                      pSupported);
-    return res;
-}
-
-/*
- * This is the instance chain terminator function
- * for GetPhysicalDeviceSurfaceSupportKHR
- */
-VKAPI_ATTR VkResult VKAPI_CALL loader_GetPhysicalDeviceSurfaceSupportKHR(
-    VkPhysicalDevice                            physicalDevice,
-    uint32_t                                    queueFamilyIndex,
-    VkSurfaceKHR                                surface,
-    VkBool32*                                   pSupported)
-{
-    struct loader_physical_device *phys_dev = (struct loader_physical_device *) physicalDevice;
-    struct loader_icd *icd = phys_dev->this_icd;
-
-    assert(pSupported && "GetPhysicalDeviceSurfaceSupportKHR: Error, null pSupported");
-    *pSupported = false;
-
-    assert(icd->GetPhysicalDeviceSurfaceSupportKHR && "loader: null GetPhysicalDeviceSurfaceSupportKHR ICD pointer");
-
-    return icd->GetPhysicalDeviceSurfaceSupportKHR(phys_dev->phys_dev,
-                                                   queueFamilyIndex,
-                                                   surface,
-                                                   pSupported);
-}
-
-bool wsi_swapchain_instance_gpa(struct loader_instance *ptr_instance,
-                                 const char* name, void **addr)
-{
-    *addr = NULL;
-
-    if (!strcmp("vkGetPhysicalDeviceSurfaceSupportKHR", name)) {
-        *addr = ptr_instance->wsi_swapchain_enabled ? (void *) wsi_swapchain_GetPhysicalDeviceSurfaceSupportKHR : NULL;
-        return true;
-    }
-    return false;
-}