swapchain: add intercept_khr_swapchain_command

It returns the function pointers for all intercepted VK_KHR_swapchain
commands.  Call intercept_khr_swapchain_command from GetDeviceProcAddr.
diff --git a/layers/swapchain.cpp b/layers/swapchain.cpp
index 6cad92e..0f49cac 100644
--- a/layers/swapchain.cpp
+++ b/layers/swapchain.cpp
@@ -2136,6 +2136,9 @@
 static PFN_vkVoidFunction
 intercept_core_device_command(const char *name);
 
+static PFN_vkVoidFunction
+intercept_khr_swapchain_command(const char *name, VkDevice dev);
+
 VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetDeviceProcAddr(VkDevice device, const char *funcName) {
     PFN_vkVoidFunction proc = intercept_core_device_command(funcName);
     if (proc)
@@ -2147,16 +2150,10 @@
 
     my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
     VkLayerDispatchTable *pDisp =  my_data->device_dispatch_table;
-    if (!strcmp("vkCreateSwapchainKHR", funcName))
-        return reinterpret_cast<PFN_vkVoidFunction>(CreateSwapchainKHR);
-    if (!strcmp("vkDestroySwapchainKHR", funcName))
-        return reinterpret_cast<PFN_vkVoidFunction>(DestroySwapchainKHR);
-    if (!strcmp("vkGetSwapchainImagesKHR", funcName))
-        return reinterpret_cast<PFN_vkVoidFunction>(GetSwapchainImagesKHR);
-    if (!strcmp("vkAcquireNextImageKHR", funcName))
-        return reinterpret_cast<PFN_vkVoidFunction>(AcquireNextImageKHR);
-    if (!strcmp("vkQueuePresentKHR", funcName))
-        return reinterpret_cast<PFN_vkVoidFunction>(QueuePresentKHR);
+
+    proc = intercept_khr_swapchain_command(funcName, device);
+    if (proc)
+        return proc;
 
     if (pDisp->GetDeviceProcAddr == NULL)
         return NULL;
@@ -2268,6 +2265,29 @@
     return nullptr;
 }
 
+static PFN_vkVoidFunction
+intercept_khr_swapchain_command(const char *name, VkDevice dev) {
+    static const struct {
+        const char *name;
+        PFN_vkVoidFunction proc;
+    } khr_swapchain_commands[] = {
+        { "vkCreateSwapchainKHR", reinterpret_cast<PFN_vkVoidFunction>(CreateSwapchainKHR) },
+        { "vkDestroySwapchainKHR", reinterpret_cast<PFN_vkVoidFunction>(DestroySwapchainKHR) },
+        { "vkGetSwapchainImagesKHR", reinterpret_cast<PFN_vkVoidFunction>(GetSwapchainImagesKHR) },
+        { "vkAcquireNextImageKHR", reinterpret_cast<PFN_vkVoidFunction>(AcquireNextImageKHR) },
+        { "vkQueuePresentKHR", reinterpret_cast<PFN_vkVoidFunction>(QueuePresentKHR) },
+    };
+
+    // do not check if VK_KHR_swapchain is enabled (why?)
+
+    for (size_t i = 0; i < ARRAY_SIZE(khr_swapchain_commands); i++) {
+        if (!strcmp(khr_swapchain_commands[i].name, name))
+            return khr_swapchain_commands[i].proc;
+    }
+
+    return nullptr;
+}
+
 } // namespace swapchain
 
 // vk_layer_logging.h expects these to be defined