layers: Add initialization of instance dispatch table

Make the layer init  separate from either device or instance dispatch
table init, since these are done at different times.
diff --git a/layers/multi.cpp b/layers/multi.cpp
index 78ee302..9732654 100644
--- a/layers/multi.cpp
+++ b/layers/multi.cpp
@@ -35,9 +35,11 @@
 #include "loader_platform.h"
 
 static void initLayerTable(const VkBaseLayerObject *gpuw, VkLayerDispatchTable *pTable, const unsigned int layerNum);
+static void initLayerInstanceTable(const VkBaseLayerObject *instw, VkLayerInstanceDispatchTable *pTable, const unsigned int layerNum);
 
 /******************************** Layer multi1 functions **************************/
 static std::unordered_map<void *, VkLayerDispatchTable *> tableMap1;
+static std::unordered_map<void *, VkLayerInstanceDispatchTable *> tableInstanceMap1;
 static bool layer1_first_activated = false;
 
 static VkLayerDispatchTable * getLayer1Table(const VkBaseLayerObject *gpuw)
@@ -57,6 +59,23 @@
         return it->second;
     }
 }
+static VkLayerInstanceDispatchTable * getLayer1InstanceTable(const VkBaseLayerObject *instw)
+{
+    VkLayerInstanceDispatchTable *pTable;
+
+    assert(instw);
+    std::unordered_map<void *, VkLayerInstanceDispatchTable *>::const_iterator it = tableInstanceMap1.find((void *) instw->baseObject);
+    if (it == tableInstanceMap1.end())
+    {
+        pTable =  new VkLayerInstanceDispatchTable;
+        tableInstanceMap1[(void *) instw->baseObject] = pTable;
+        initLayerInstanceTable(instw, pTable, 1);
+        return pTable;
+    } else
+    {
+        return it->second;
+    }
+}
 #ifdef __cplusplus
 extern "C" {
 #endif
@@ -137,14 +156,14 @@
     }
 }
 
-VK_LAYER_EXPORT void * VKAPI multi1InstanceGetProcAddr(VkInstance inst, const char* pName)
+VK_LAYER_EXPORT void * VKAPI multi1GetInstanceProcAddr(VkInstance inst, const char* pName)
 {
     VkBaseLayerObject* instw = (VkBaseLayerObject *) inst;
 
     if (inst == NULL)
         return NULL;
 
-    //TODO getLayer1InstanceTable(instw);
+    getLayer1InstanceTable(instw);
 
     if (!strcmp("vkCreateDevice", pName))
         return (void *) multi1CreateDevice;
@@ -161,8 +180,27 @@
 
 /******************************** Layer multi2 functions **************************/
 static std::unordered_map<void *, VkLayerDispatchTable *> tableMap2;
+static std::unordered_map<void *, VkLayerInstanceDispatchTable *> tableInstanceMap2;
 static bool layer2_first_activated = false;
 
+static VkLayerInstanceDispatchTable * getLayer2InstanceTable(const VkBaseLayerObject *instw)
+{
+    VkLayerInstanceDispatchTable *pTable;
+
+    assert(instw);
+    std::unordered_map<void *, VkLayerInstanceDispatchTable *>::const_iterator it = tableInstanceMap2.find((void *) instw->baseObject);
+    if (it == tableInstanceMap2.end())
+    {
+        pTable =  new VkLayerInstanceDispatchTable;
+        tableInstanceMap2[(void *) instw->baseObject] = pTable;
+        initLayerInstanceTable(instw, pTable, 2);
+        return pTable;
+    } else
+    {
+        return it->second;
+    }
+}
+
 static VkLayerDispatchTable * getLayer2Table(const VkBaseLayerObject *gpuw)
 {
     VkLayerDispatchTable *pTable;
@@ -259,14 +297,14 @@
     }
 }
 
-VK_LAYER_EXPORT void * VKAPI multi2InstanceGetProcAddr(VkInstance inst, const char* pName)
+VK_LAYER_EXPORT void * VKAPI multi2GetInstanceProcAddr(VkInstance inst, const char* pName)
 {
     VkBaseLayerObject* instw = (VkBaseLayerObject *) inst;
 
     if (inst == NULL)
         return NULL;
 
-    //TODO getLayer2InstanceTable(instw);
+    getLayer2InstanceTable(instw);
 
     if (!strcmp("vkCreateDevice", pName))
         return (void *) multi2CreateDevice;
@@ -379,17 +417,17 @@
     else if (!strcmp("vkGetProcAddr", pName))
         return (void *) vkGetProcAddr;
     else if (!strcmp("multi1GetInstanceProcAddr", pName))
-        return (void *) multi1GetProcAddr;
+        return (void *) multi1GetInstanceProcAddr;
     else if (!strcmp("multi2GetInstanceProcAddr", pName))
-        return (void *) multi2GetProcAddr;
+        return (void *) multi2GetInstanceProcAddr;
     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);
+        return multi1GetInstanceProcAddr(inst, pName);
     else if (layer2_first_activated)
-        return multi2InstanceGetProcAddr(inst, pName);
+        return multi2GetInstanceProcAddr(inst, pName);
     else
         return NULL;
 
@@ -407,3 +445,13 @@
 
     layer_initialize_dispatch_table(pTable, (PFN_vkGetProcAddr) gpuw->pGPA, (VkPhysicalDevice) gpuw->nextObject);
 }
+
+static void initLayerInstanceTable(const VkBaseLayerObject *instw, VkLayerInstanceDispatchTable *pTable, const unsigned int layerNum)
+{
+    if (layerNum == 2 && layer1_first_activated == false)
+        layer2_first_activated = true;
+    if (layerNum == 1 && layer2_first_activated == false)
+        layer1_first_activated = true;
+
+    layer_init_instance_dispatch_table(pTable, (PFN_vkGetInstanceProcAddr) instw->pGPA, (VkInstance) instw->nextObject);
+}