layers: Add GetInstanceProcAddr() to all layers

Loader will use this for constructing instance layer instance chains.
Layer instance dispatch table is not yet added.
diff --git a/layers/multi.cpp b/layers/multi.cpp
index b26e67d..78ee302 100644
--- a/layers/multi.cpp
+++ b/layers/multi.cpp
@@ -120,18 +120,42 @@
 
     getLayer1Table(gpuw);
 
-    if (!strncmp("vkCreateDevice", pName, sizeof ("vkCreateDevice")))
+    if (!strcmp("vkCreateDevice", pName))
         return (void *) multi1CreateDevice;
-    else if (!strncmp("vkEnumerateLayers", pName, sizeof ("vkEnumerateLayers")))
+    else if (!strcmp("vkEnumerateLayers", pName))
         return (void *) multi1EnumerateLayers;
-    else if (!strncmp("vkCreateGraphicsPipeline", pName, sizeof ("vkCreateGraphicsPipeline")))
+    else if (!strcmp("GetGlobalExtensionInfo", pName))
+        return (void*) vkGetGlobalExtensionInfo;
+    else if (!strcmp("vkCreateGraphicsPipeline", pName))
         return (void *) multi1CreateGraphicsPipeline;
-    else if (!strncmp("vkStorePipeline", pName, sizeof ("vkStorePipeline")))
+    else if (!strcmp("vkStorePipeline", pName))
         return (void *) multi1StorePipeline;
     else {
         if (gpuw->pGPA == NULL)
             return NULL;
-        return gpuw->pGPA((VkPhysicalDevice) gpuw->nextObject, pName);
+        return gpuw->pGPA((VkObject) gpuw->nextObject, pName);
+    }
+}
+
+VK_LAYER_EXPORT void * VKAPI multi1InstanceGetProcAddr(VkInstance inst, const char* pName)
+{
+    VkBaseLayerObject* instw = (VkBaseLayerObject *) inst;
+
+    if (inst == NULL)
+        return NULL;
+
+    //TODO getLayer1InstanceTable(instw);
+
+    if (!strcmp("vkCreateDevice", pName))
+        return (void *) multi1CreateDevice;
+    else if (!strcmp("vkEnumerateLayers", pName))
+        return (void *) multi1EnumerateLayers;
+    else if (!strcmp("GetGlobalExtensionInfo", pName))
+        return (void*) vkGetGlobalExtensionInfo;
+    else {
+        if (instw->pGPA == NULL)
+            return NULL;
+        return instw->pGPA((VkObject) instw->nextObject, pName);
     }
 }
 
@@ -218,18 +242,42 @@
 
     getLayer2Table(gpuw);
 
-    if (!strncmp("vkCreateDevice", pName, sizeof ("vkCreateDevice")))
+    if (!strcmp("vkCreateDevice", pName))
         return (void *) multi2CreateDevice;
-    else if (!strncmp("vkEnumerateLayers", pName, sizeof ("vkEnumerateLayers")))
+    else if (!strcmp("vkEnumerateLayers", pName))
         return (void *) multi2EnumerateLayers;
-    else if (!strncmp("vkCreateCommandBuffer", pName, sizeof ("vkCreateCommandBuffer")))
+    else if (!strcmp("GetGlobalExtensionInfo", pName))
+        return (void*) vkGetGlobalExtensionInfo;
+    else if (!strcmp("vkCreateCommandBuffer", pName))
         return (void *) multi2CreateCommandBuffer;
-    else if (!strncmp("vkBeginCommandBuffer", pName, sizeof ("vkBeginCommandBuffer")))
+    else if (!strcmp("vkBeginCommandBuffer", pName))
         return (void *) multi2BeginCommandBuffer;
     else {
         if (gpuw->pGPA == NULL)
             return NULL;
-        return gpuw->pGPA((VkPhysicalDevice) gpuw->nextObject, pName);
+        return gpuw->pGPA((VkObject) gpuw->nextObject, pName);
+    }
+}
+
+VK_LAYER_EXPORT void * VKAPI multi2InstanceGetProcAddr(VkInstance inst, const char* pName)
+{
+    VkBaseLayerObject* instw = (VkBaseLayerObject *) inst;
+
+    if (inst == NULL)
+        return NULL;
+
+    //TODO getLayer2InstanceTable(instw);
+
+    if (!strcmp("vkCreateDevice", pName))
+        return (void *) multi2CreateDevice;
+    else if (!strcmp("vkEnumerateLayers", pName))
+        return (void *) multi2EnumerateLayers;
+    else if (!strcmp("GetGlobalExtensionInfo", pName))
+        return (void*) vkGetGlobalExtensionInfo;
+    else {
+        if (instw->pGPA == NULL)
+            return NULL;
+        return instw->pGPA((VkObject) instw->nextObject, pName);
     }
 }
 
@@ -304,11 +352,11 @@
 VK_LAYER_EXPORT void * VKAPI vkGetProcAddr(VkPhysicalDevice gpu, const char* pName)
 {
     // to find each layers GPA routine Loader will search via "<layerName>GetProcAddr"
-    if (!strncmp("multi1GetProcAddr", pName, sizeof("multi1GetProcAddr")))
+    if (!strcmp("multi1GetProcAddr", pName))
         return (void *) multi1GetProcAddr;
-    else if (!strncmp("multi2GetProcAddr", pName, sizeof("multi2GetProcAddr")))
+    else if (!strcmp("multi2GetProcAddr", pName))
         return (void *) multi2GetProcAddr;
-    else if (!strncmp("vkGetProcAddr", pName, sizeof("vkGetProcAddr")))
+    else if (!strcmp("vkGetProcAddr", pName))
         return (void *) vkGetProcAddr;
 
     // use first layer activated as GPA dispatch table activation happens in order
@@ -321,6 +369,31 @@
 
 }
 
+VK_LAYER_EXPORT void * VKAPI vkGetInstanceProcAddr(VkInstance inst, const char* pName)
+{
+    // to find each layers GPA routine Loader will search via "<layerName>GetProcAddr"
+    if (!strcmp("multi1GetProcAddr", pName))
+        return (void *) multi1GetProcAddr;
+    else if (!strcmp("multi2GetProcAddr", pName))
+        return (void *) multi2GetProcAddr;
+    else if (!strcmp("vkGetProcAddr", pName))
+        return (void *) vkGetProcAddr;
+    else if (!strcmp("multi1GetInstanceProcAddr", pName))
+        return (void *) multi1GetProcAddr;
+    else if (!strcmp("multi2GetInstanceProcAddr", pName))
+        return (void *) multi2GetProcAddr;
+    else if (!strcmp("vkGetInstanceProcAddr", pName))
+        return (void *) vkGetProcAddr;
+
+    // use first layer activated as GPA dispatch table activation happens in order
+    else if (layer1_first_activated)
+        return multi1InstanceGetProcAddr(inst, pName);
+    else if (layer2_first_activated)
+        return multi2InstanceGetProcAddr(inst, pName);
+    else
+        return NULL;
+
+}
 #ifdef __cplusplus
 }    //extern "C"
 #endif
@@ -332,5 +405,5 @@
     if (layerNum == 1 && layer2_first_activated == false)
         layer1_first_activated = true;
 
-    layer_initialize_dispatch_table(pTable, gpuw->pGPA, (VkPhysicalDevice) gpuw->nextObject);
+    layer_initialize_dispatch_table(pTable, (PFN_vkGetProcAddr) gpuw->pGPA, (VkPhysicalDevice) gpuw->nextObject);
 }