layers: Make WSI_LUNARG a device extension  and check if enabled before use

Return NULL GetProcAddr if not enabled. Also fix DEBUG_MARKER bugs
in DrawState and ParamChecker

Also advertise WSI_LUNARG as a device extension in layers where it is used.
diff --git a/layers/param_checker.cpp b/layers/param_checker.cpp
index 670b31f..a64435f 100644
--- a/layers/param_checker.cpp
+++ b/layers/param_checker.cpp
@@ -47,6 +47,7 @@
 static LOADER_PLATFORM_THREAD_ONCE_DECLARATION(initOnce);
 struct devExts {
     bool debug_marker_enabled;
+    bool wsi_lunarg_enabled;
 };
 static std::unordered_map<void *, struct devExts>     deviceExtMap;
 
@@ -222,16 +223,19 @@
 static void createDeviceRegisterExtensions(const VkDeviceCreateInfo* pCreateInfo, VkDevice device)
 {
     uint32_t i, ext_idx;
-    VkLayerDispatchTable *pDisp  = *(VkLayerDispatchTable **) device;
+    VkLayerDispatchTable *pDisp  = device_dispatch_table(device);
     deviceExtMap[pDisp].debug_marker_enabled = false;
+    deviceExtMap[pDisp].wsi_lunarg_enabled = false;
     for (i = 0; i < pCreateInfo->extensionCount; i++) {
         if (strcmp(pCreateInfo->pEnabledExtensions[i].name, DEBUG_MARKER_EXTENSION_NAME) == 0) {
             /* Found a matching extension name, mark it enabled and init dispatch table*/
             initDebugMarkerTable(device);
             deviceExtMap[pDisp].debug_marker_enabled = true;
 
-        }
 
+        }
+        if (strcmp(pCreateInfo->pEnabledExtensions[i].name, VK_WSI_LUNARG_EXTENSION_NAME) == 0)
+            deviceExtMap[pDisp].wsi_lunarg_enabled = true;
     }
 }
 
@@ -266,12 +270,12 @@
 
 VK_LAYER_EXPORT VkResult VKAPI vkDestroyDevice(VkDevice device)
 {
-    VkLayerDispatchTable *pDisp  =  *(VkLayerDispatchTable **) device;
+    VkLayerDispatchTable *pDisp  = device_dispatch_table(device);
     dispatch_key key = get_dispatch_key(device);
-    VkResult result = device_dispatch_table(device)->DestroyDevice(device);
+    VkResult result = pDisp->DestroyDevice(device);
+    deviceExtMap.erase(pDisp);
     destroy_device_dispatch_table(key);
     tableDebugMarkerMap.erase(pDisp);
-    deviceExtMap.erase(pDisp);
     return result;
 }
 
@@ -326,7 +330,7 @@
     return VK_SUCCESS;
 }
 
-#define PARAM_CHECKER_LAYER_DEV_EXT_ARRAY_SIZE 3
+#define PARAM_CHECKER_LAYER_DEV_EXT_ARRAY_SIZE 4
 static const VkExtensionProperties pcDevExts[PARAM_CHECKER_LAYER_DEV_EXT_ARRAY_SIZE] = {
     {
         VK_STRUCTURE_TYPE_EXTENSION_PROPERTIES,
@@ -345,6 +349,12 @@
         DEBUG_MARKER_EXTENSION_NAME,
         0x10,
         "Sample layer: ParamChecker",
+    },
+    {
+        VK_STRUCTURE_TYPE_EXTENSION_PROPERTIES,
+        VK_WSI_LUNARG_EXTENSION_NAME,
+        0x10,
+        "Sample layer: ParamChecker",
     }
 };
 VK_LAYER_EXPORT VkResult VKAPI vkGetPhysicalDeviceExtensionInfo(
@@ -2145,14 +2155,6 @@
         return (void*) vkCmdBeginRenderPass;
     if (!strcmp(name, "CmdEndRenderPass"))
         return (void*) vkCmdEndRenderPass;
-    if (!strcmp(name, "CreateSwapChainWSI"))
-        return (void*) vkCreateSwapChainWSI;
-    if (!strcmp(name, "DestroySwapChainWSI"))
-        return (void*) vkDestroySwapChainWSI;
-    if (!strcmp(name, "GetSwapChainInfoWSI"))
-        return (void*) vkGetSwapChainInfoWSI;
-    if (!strcmp(name, "QueuePresentWSI"))
-        return (void*) vkQueuePresentWSI;
 
     return NULL;
 }
@@ -2201,23 +2203,33 @@
         return addr;
     }
 
-    VkLayerDispatchTable *pDisp =  *(VkLayerDispatchTable **) device;
-    if (!deviceExtMap[pDisp].debug_marker_enabled)
+    VkLayerDispatchTable *pDisp =  device_dispatch_table(device);
+    if (deviceExtMap.size() == 0 || deviceExtMap[pDisp].wsi_lunarg_enabled)
     {
-        if (!strcmp(funcName, "CmdDbgMarkerBegin"))
+        if (!strcmp(funcName, "vkCreateSwapChainWSI"))
+            return (void*) vkCreateSwapChainWSI;
+        if (!strcmp(funcName, "vkDestroySwapChainWSI"))
+            return (void*) vkDestroySwapChainWSI;
+        if (!strcmp(funcName, "vkGetSwapChainInfoWSI"))
+            return (void*) vkGetSwapChainInfoWSI;
+        if (!strcmp(funcName, "vkQueuePresentWSI"))
+            return (void*) vkQueuePresentWSI;
+    }
+    if (deviceExtMap.size() == 0 || deviceExtMap[pDisp].debug_marker_enabled)
+    {
+        if (!strcmp(funcName, "vkCmdDbgMarkerBegin"))
             return (void*) vkCmdDbgMarkerBegin;
-        if (!strcmp(funcName, "CmdDbgMarkerEnd"))
+        if (!strcmp(funcName, "vkCmdDbgMarkerEnd"))
             return (void*) vkCmdDbgMarkerEnd;
-        if (!strcmp(funcName, "DbgSetObjectTag"))
+        if (!strcmp(funcName, "vkDbgSetObjectTag"))
             return (void*) vkDbgSetObjectTag;
-        if (!strcmp(funcName, "DbgSetObjectName"))
+        if (!strcmp(funcName, "vkDbgSetObjectName"))
             return (void*) vkDbgSetObjectName;
     }
     {
-        VkLayerDispatchTable* pTable = device_dispatch_table(device);
-        if (pTable->GetDeviceProcAddr == NULL)
+        if (pDisp->GetDeviceProcAddr == NULL)
             return NULL;
-        return pTable->GetDeviceProcAddr(device, funcName);
+        return pDisp->GetDeviceProcAddr(device, funcName);
     }
 }