loader: Support layers that don't have an extension entrypoint

Change all layers and loader interface to init dispatch tables on
GPA("GetXXXProcAddr").  After that initialization rest of dispatch
tables are inited via unwrapped object using the GPA in the dispatch
table.  This also allows App generated GPA calls that the loader can't resolve
to function correctly.
diff --git a/layers/basic.cpp b/layers/basic.cpp
index 0742cb2..1ba3188 100644
--- a/layers/basic.cpp
+++ b/layers/basic.cpp
@@ -58,7 +58,7 @@
         return it->second;
     }
 
-    layer_init_instance_dispatch_table(pTable, (PFN_vkGetInstanceProcAddr) instancew->pGPA, (VkInstance) instancew->nextObject);
+    layer_init_instance_dispatch_table(pTable, instancew);
 
     return pTable;
 }
@@ -79,7 +79,7 @@
         return it->second;
     }
 
-    layer_initialize_dispatch_table(pTable, (PFN_vkGetDeviceProcAddr) devw->pGPA, (VkDevice) devw->nextObject);
+    layer_initialize_dispatch_table(pTable, devw);
 
     return pTable;
 }
@@ -207,21 +207,25 @@
     if (device == NULL)
         return NULL;
 
-    initLayerTable((const VkBaseLayerObject *) device);
-
-    if (!strcmp("vkGetDeviceProcAddr", pName))
+    /* loader uses this to force layer initialization; device object is wrapped */
+    if (!strcmp("vkGetDeviceProcAddr", pName)) {
+        initLayerTable((const VkBaseLayerObject *) device);
         return (void *) vkGetDeviceProcAddr;
+    }
+
     if (!strcmp("vkGetFormatInfo", pName))
         return (void *) vkGetFormatInfo;
     if (!strcmp("vkDestroyDevice", pName))
         return (void *) vkDestroyDevice;
     if (!strcmp("vkLayerExtension1", pName))
         return (void *) vkLayerExtension1;
-    else {
-        VkBaseLayerObject* devw = (VkBaseLayerObject *) device;
-        if (devw->pGPA == NULL)
+    else
+    {
+        VkLayerDispatchTable **ppDisp = (VkLayerDispatchTable **) device;
+        VkLayerDispatchTable* pTable = tableMap[*ppDisp];
+        if (pTable->GetDeviceProcAddr == NULL)
             return NULL;
-        return devw->pGPA((VkObject) devw->nextObject, pName);
+        return pTable->GetDeviceProcAddr(device, pName);
     }
 }
 
@@ -230,10 +234,12 @@
     if (instance == NULL)
         return NULL;
 
-    initLayerInstanceTable((const VkBaseLayerObject *) instance);
-
-    if (!strcmp("vkGetInstanceProcAddr", pName))
+    /* loader uses this to force layer initialization; instance object is wrapped */
+    if (!strcmp("vkGetInstanceProcAddr", pName)) {
+        initLayerInstanceTable((const VkBaseLayerObject *) instance);
         return (void *) vkGetInstanceProcAddr;
+    }
+
     if (!strcmp("vkDestroyInstance", pName))
         return (void *) vkDestroyInstance;
     if (!strcmp("vkEnumeratePhysicalDevices", pName))
@@ -242,10 +248,13 @@
         return (void*) vkGetGlobalExtensionInfo;
     if (!strcmp("vkCreateDevice", pName))
         return (void *) vkCreateDevice;
-    else {
-        VkBaseLayerObject* instancew = (VkBaseLayerObject *) instance;
-        if (instancew->pGPA == NULL)
+    else
+    {
+        VkLayerInstanceDispatchTable **ppDisp = (VkLayerInstanceDispatchTable **) instance;
+        VkLayerInstanceDispatchTable* pTable = tableInstanceMap[*ppDisp];
+        if (pTable->GetInstanceProcAddr == NULL)
             return NULL;
-        return instancew->pGPA((VkObject) instancew->nextObject, pName);
+        return pTable->GetInstanceProcAddr(instance, pName);
     }
+
 }