misc: Change vkGetProcAddr to vkGetDeviceProcAddr

Also cleanup layer/loader GPA's to only return device level entrypoints.
diff --git a/include/vkLayer.h b/include/vkLayer.h
index 9edf326..f30ef25 100644
--- a/include/vkLayer.h
+++ b/include/vkLayer.h
@@ -26,7 +26,7 @@
 
 typedef struct VkLayerDispatchTable_
 {
-    PFN_vkGetProcAddr GetProcAddr;
+    PFN_vkGetDeviceProcAddr GetDeviceProcAddr;
     PFN_vkDestroyDevice DestroyDevice;
     PFN_vkGetDeviceQueue GetDeviceQueue;
     PFN_vkQueueSubmit QueueSubmit;
@@ -145,7 +145,6 @@
 typedef struct VkLayerInstanceDispatchTable_
 {
     PFN_vkGetInstanceProcAddr GetInstanceProcAddr;
-    PFN_vkGetProcAddr GetProcAddr;  // TODO remove once GPA takes device parameter
     PFN_vkCreateInstance CreateInstance;
     PFN_vkDestroyInstance DestroyInstance;
     PFN_vkEnumeratePhysicalDevices EnumeratePhysicalDevices;
diff --git a/include/vulkan.h b/include/vulkan.h
index b8bd81e..89431af 100644
--- a/include/vulkan.h
+++ b/include/vulkan.h
@@ -2088,7 +2088,7 @@
 typedef VkResult (VKAPI *PFN_vkEnumeratePhysicalDevices)(VkInstance instance, uint32_t* pPhysicalDeviceCount, VkPhysicalDevice* pPhysicalDevices);
 typedef VkResult (VKAPI *PFN_vkGetPhysicalDeviceInfo)(VkPhysicalDevice physicalDevice, VkPhysicalDeviceInfoType infoType, size_t* pDataSize, void* pData);
 typedef void *   (VKAPI *PFN_vkGetInstanceProcAddr)(VkInstance instance, const char * pName);
-typedef void *   (VKAPI *PFN_vkGetProcAddr)(VkPhysicalDevice physicalDevice, const char * pName);
+typedef void *   (VKAPI *PFN_vkGetDeviceProcAddr)(VkDevice device, const char * pName);
 typedef VkResult (VKAPI *PFN_vkCreateDevice)(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo* pCreateInfo, VkDevice* pDevice);
 typedef VkResult (VKAPI *PFN_vkDestroyDevice)(VkDevice device);
 typedef VkResult (VKAPI *PFN_vkGetGlobalExtensionInfo)(VkExtensionInfoType infoType, uint32_t extensionIndex, size_t* pDataSize, void* pData);
@@ -2224,8 +2224,8 @@
     VkInstance                                  instance,
     const char*                                 pName);
 
-void * VKAPI vkGetProcAddr(
-    VkPhysicalDevice                            physicalDevice,
+void * VKAPI vkGetDeviceProcAddr(
+    VkDevice                                    device,
     const char*                                 pName);
 // Device functions
 
diff --git a/layers/basic.cpp b/layers/basic.cpp
index 00adfa6..0d24876 100644
--- a/layers/basic.cpp
+++ b/layers/basic.cpp
@@ -79,7 +79,7 @@
         return it->second;
     }
 
-    layer_initialize_dispatch_table(pTable, (PFN_vkGetProcAddr) devw->pGPA, (VkPhysicalDevice) devw->nextObject);
+    layer_initialize_dispatch_table(pTable, (PFN_vkGetDeviceProcAddr) devw->pGPA, (VkDevice) devw->nextObject);
 
     return pTable;
 }
@@ -210,32 +210,24 @@
     }
 }
 
-VK_LAYER_EXPORT void * VKAPI vkGetProcAddr(VkPhysicalDevice gpu, const char* pName)
+VK_LAYER_EXPORT void * VKAPI vkGetDeviceProcAddr(VkDevice device, const char* pName)
 {
-    if (gpu == NULL)
+    if (device == NULL)
         return NULL;
 
-    initLayerTable((const VkBaseLayerObject *) gpu);
+    initLayerTable((const VkBaseLayerObject *) device);
 
-    if (!strcmp("vkGetProcAddr", pName))
-        return (void *) vkGetProcAddr;
-    if (!strcmp("vkCreateDevice", pName))
-        return (void *) vkCreateDevice;
-    if (!strcmp("vkEnumeratePhysicalDevices", pName))
-        return (void*) vkEnumeratePhysicalDevices;
-    if (!strcmp("vkGetGlobalExtensionInfo", pName))
-        return (void*) vkGetGlobalExtensionInfo;
-    if (!strcmp("vkEnumerateLayers", pName))
-        return (void *) vkEnumerateLayers;
+    if (!strcmp("vkGetDeviceProcAddr", pName))
+        return (void *) vkGetDeviceProcAddr;
     if (!strcmp("vkGetFormatInfo", pName))
         return (void *) vkGetFormatInfo;
     if (!strcmp("vkLayerExtension1", pName))
         return (void *) vkLayerExtension1;
     else {
-        VkBaseLayerObject* gpuw = (VkBaseLayerObject *) gpu;
-        if (gpuw->pGPA == NULL)
+        VkBaseLayerObject* devw = (VkBaseLayerObject *) device;
+        if (devw->pGPA == NULL)
             return NULL;
-        return gpuw->pGPA((VkObject) gpuw->nextObject, pName);
+        return devw->pGPA((VkObject) devw->nextObject, pName);
     }
 }
 
@@ -248,8 +240,6 @@
 
     if (!strcmp("vkGetInstanceProcAddr", pName))
         return (void *) vkGetInstanceProcAddr;
-    if (!strcmp("vkGetProcAddr", pName))
-        return (void *) vkGetProcAddr;
     if (!strcmp("vkEnumeratePhysicalDevices", pName))
         return (void*) vkEnumeratePhysicalDevices;
     if (!strcmp("vkGetGlobalExtensionInfo", pName))
diff --git a/layers/draw_state.cpp b/layers/draw_state.cpp
index e803940..781dbc3 100755
--- a/layers/draw_state.cpp
+++ b/layers/draw_state.cpp
@@ -1445,10 +1445,10 @@
 // TODO handle multiple GPUs/instances for both instance and device dispatch tables
 static void initDeviceTable(void)
 {
-    PFN_vkGetProcAddr fpNextGPA;
-    fpNextGPA = (PFN_vkGetProcAddr) pCurObj->pGPA;
+    PFN_vkGetDeviceProcAddr fpNextGPA;
+    fpNextGPA = (PFN_vkGetDeviceProcAddr) pCurObj->pGPA;
     assert(fpNextGPA);
-    layer_initialize_dispatch_table(&nextTable, fpNextGPA, (VkPhysicalDevice) pCurObj->nextObject);
+    layer_initialize_dispatch_table(&nextTable, fpNextGPA, (VkDevice) pCurObj->nextObject);
 }
 
 static void initInstanceTable(void)
@@ -2736,24 +2736,20 @@
 #endif // WIN32
 }
 
-VK_LAYER_EXPORT void* VKAPI vkGetProcAddr(VkPhysicalDevice gpu, const char* funcName)
+VK_LAYER_EXPORT void* VKAPI vkGetDeviceProcAddr(VkDevice dev, const char* funcName)
 {
-    VkBaseLayerObject* gpuw = (VkBaseLayerObject *) gpu;
+    VkBaseLayerObject* devw = (VkBaseLayerObject *) dev;
 
-    if (gpu == NULL)
+    if (dev == NULL)
         return NULL;
-    pCurObj = gpuw;
+    pCurObj = devw;
     loader_platform_thread_once(&g_initOnce, initDrawState);
     loader_platform_thread_once(&g_tabDeviceOnce, initDeviceTable);
 
-    if (!strcmp(funcName, "vkGetProcAddr"))
-        return (void *) vkGetProcAddr;
-    if (!strcmp(funcName, "vkCreateDevice"))
-        return (void*) vkCreateDevice;
+    if (!strcmp(funcName, "vkGetDeviceProcAddr"))
+        return (void *) vkGetDeviceProcAddr;
     if (!strcmp(funcName, "vkDestroyDevice"))
         return (void*) vkDestroyDevice;
-    if (!strcmp(funcName, "vkEnumerateLayers"))
-        return (void*) vkEnumerateLayers;
     if (!strcmp(funcName, "vkQueueSubmit"))
         return (void*) vkQueueSubmit;
     if (!strcmp(funcName, "vkDestroyObject"))
@@ -2868,10 +2864,6 @@
         return (void*) vkCmdBeginRenderPass;
     if (!strcmp(funcName, "vkCmdEndRenderPass"))
         return (void*) vkCmdEndRenderPass;
-    if (!strcmp(funcName, "vkDbgRegisterMsgCallback"))
-        return (void*) vkDbgRegisterMsgCallback;
-    if (!strcmp(funcName, "vkDbgUnregisterMsgCallback"))
-        return (void*) vkDbgUnregisterMsgCallback;
     if (!strcmp(funcName, "vkCmdDbgMarkerBegin"))
         return (void*) vkCmdDbgMarkerBegin;
     if (!strcmp(funcName, "vkCmdDbgMarkerEnd"))
@@ -2883,9 +2875,9 @@
     if (!strcmp("drawStateDumpPngFile", funcName))
         return (void*) drawStateDumpPngFile;
     else {
-        if (gpuw->pGPA == NULL)
+        if (devw->pGPA == NULL)
             return NULL;
-        return gpuw->pGPA((VkObject)gpuw->nextObject, funcName);
+        return devw->pGPA((VkObject)devw->nextObject, funcName);
     }
 }
 
@@ -2901,8 +2893,6 @@
 
     if (!strcmp(funcName, "vkGetInstanceProcAddr"))
         return (void *) vkGetInstanceProcAddr;
-    if (!strcmp(funcName, "vkGetProcAddr"))
-        return (void *) vkGetProcAddr;
     if (!strcmp(funcName, "vkCreateDevice"))
         return (void*) vkCreateDevice;
     if (!strcmp(funcName, "vkEnumerateLayers"))
diff --git a/layers/mem_tracker.cpp b/layers/mem_tracker.cpp
index 5ab3bca..f04ab63 100644
--- a/layers/mem_tracker.cpp
+++ b/layers/mem_tracker.cpp
@@ -778,10 +778,10 @@
 // TODO handle multiple GPUs/instances for both instance and device dispatch tables
 static void initDeviceTable(void)
 {
-    PFN_vkGetProcAddr fpNextGPA;
-    fpNextGPA = (PFN_vkGetProcAddr) pCurObj->pGPA;
+    PFN_vkGetDeviceProcAddr fpNextGPA;
+    fpNextGPA = (PFN_vkGetDeviceProcAddr) pCurObj->pGPA;
     assert(fpNextGPA);
-    layer_initialize_dispatch_table(&nextTable, fpNextGPA, (VkPhysicalDevice) pCurObj->nextObject);
+    layer_initialize_dispatch_table(&nextTable, fpNextGPA, (VkDevice) pCurObj->nextObject);
 }
 
 static void initInstanceTable(void)
@@ -2150,29 +2150,23 @@
     return result;
 }
 
-VK_LAYER_EXPORT void* VKAPI vkGetProcAddr(
-    VkPhysicalDevice  gpu,
+VK_LAYER_EXPORT void* VKAPI vkGetDeviceProcAddr(
+    VkDevice         dev,
     const char       *funcName)
 {
-    VkBaseLayerObject* gpuw = (VkBaseLayerObject *) gpu;
+    VkBaseLayerObject* devw = (VkBaseLayerObject *) dev;
 
-    if (gpu == NULL) {
+    if (dev == NULL) {
         return NULL;
     }
-    pCurObj = gpuw;
+    pCurObj = devw;
     loader_platform_thread_once(&g_initOnce, initMemTracker);
     loader_platform_thread_once(&g_tabDeviceOnce, initDeviceTable);
 
-    if (!strcmp(funcName, "vkGetProcAddr"))
-        return (void *) vkGetProcAddr;
-    if (!strcmp(funcName, "vkCreateDevice"))
-        return (void*) vkCreateDevice;
+    if (!strcmp(funcName, "vkGetDeviceProcAddr"))
+        return (void *) vkGetDeviceProcAddr;
     if (!strcmp(funcName, "vkDestroyDevice"))
         return (void*) vkDestroyDevice;
-    if (!strcmp(funcName, "GetGlobalExtensionInfo"))
-        return (void*) vkGetGlobalExtensionInfo;
-    if (!strcmp(funcName, "vkEnumerateLayers"))
-        return (void*) vkEnumerateLayers;
     if (!strcmp(funcName, "vkQueueSubmit"))
         return (void*) vkQueueSubmit;
     if (!strcmp(funcName, "vkAllocMemory"))
@@ -2295,10 +2289,6 @@
         return (void*) vkCmdEndQuery;
     if (!strcmp(funcName, "vkCmdResetQueryPool"))
         return (void*) vkCmdResetQueryPool;
-    if (!strcmp(funcName, "vkDbgRegisterMsgCallback"))
-        return (void*) vkDbgRegisterMsgCallback;
-    if (!strcmp(funcName, "vkDbgUnregisterMsgCallback"))
-        return (void*) vkDbgUnregisterMsgCallback;
     if (!strcmp(funcName, "vkGetDeviceQueue"))
         return (void*) vkGetDeviceQueue;
     if (!strcmp(funcName, "vkCreateSwapChainWSI"))
@@ -2308,10 +2298,10 @@
     if (!strcmp(funcName, "vkGetSwapChainInfoWSI"))
         return (void*) vkGetSwapChainInfoWSI;
     else {
-        if (gpuw->pGPA == NULL) {
+        if (devw->pGPA == NULL) {
             return NULL;
         }
-        return gpuw->pGPA((VkObject)gpuw->nextObject, funcName);
+        return devw->pGPA((VkObject)devw->nextObject, funcName);
     }
 }
 
@@ -2329,8 +2319,6 @@
     loader_platform_thread_once(&g_initOnce, initMemTracker);
     loader_platform_thread_once(&g_tabInstanceOnce, initInstanceTable);
 
-    if (!strcmp(funcName, "vkGetProcAddr"))
-        return (void *) vkGetProcAddr;
     if (!strcmp(funcName, "vkGetInstanceProcAddr"))
         return (void *) vkGetInstanceProcAddr;
     if (!strcmp(funcName, "vkCreateDevice"))
diff --git a/layers/multi.cpp b/layers/multi.cpp
index 90f7b90..1d6764b 100644
--- a/layers/multi.cpp
+++ b/layers/multi.cpp
@@ -34,7 +34,7 @@
 // being used:
 #include "loader_platform.h"
 
-static void initLayerTable(const VkBaseLayerObject *gpuw, VkLayerDispatchTable *pTable, const unsigned int layerNum);
+static void initLayerTable(const VkBaseLayerObject *devw, VkLayerDispatchTable *pTable, const unsigned int layerNum);
 static void initLayerInstanceTable(const VkBaseLayerObject *instw, VkLayerInstanceDispatchTable *pTable, const unsigned int layerNum);
 /* Various dispatchable objects will use the same underlying dispatch table if they
  * are created from that "parent" object. Thus use pointer to dispatch table
@@ -136,29 +136,25 @@
     return result;
 }
 
-VK_LAYER_EXPORT void * VKAPI multi1GetProcAddr(VkPhysicalDevice gpu, const char* pName)
+VK_LAYER_EXPORT void * VKAPI multi1GetDeviceProcAddr(VkDevice device, const char* pName)
 {
-    VkBaseLayerObject* gpuw = (VkBaseLayerObject *) gpu;
+    VkBaseLayerObject* devw = (VkBaseLayerObject *) device;
 
-    if (gpu == NULL)
+    if (device == NULL)
         return NULL;
 
-    getLayer1Table(gpuw);
+    getLayer1Table(devw);
 
     if (!strcmp("vkCreateSampler", pName))
         return (void *) multi1CreateSampler;
-    if (!strcmp("vkEnumerateLayers", pName))
-        return (void *) multi1EnumerateLayers;
-    else if (!strcmp("GetGlobalExtensionInfo", pName))
-        return (void*) vkGetGlobalExtensionInfo;
     else if (!strcmp("vkCreateGraphicsPipeline", pName))
         return (void *) multi1CreateGraphicsPipeline;
     else if (!strcmp("vkStorePipeline", pName))
         return (void *) multi1StorePipeline;
     else {
-        if (gpuw->pGPA == NULL)
+        if (devw->pGPA == NULL)
             return NULL;
-        return gpuw->pGPA((VkObject) gpuw->nextObject, pName);
+        return devw->pGPA((VkObject) devw->nextObject, pName);
     }
 }
 
@@ -171,8 +167,6 @@
 
     getLayer1InstanceTable(instw);
 
-    if (!strcmp("vkCreateSampler", pName))
-        return (void *) multi1CreateSampler;
     if (!strcmp("vkEnumerateLayers", pName))
         return (void *) multi1EnumerateLayers;
     else if (!strcmp("GetGlobalExtensionInfo", pName))
@@ -292,31 +286,23 @@
     return result;
 }
 
-VK_LAYER_EXPORT void * VKAPI multi2GetProcAddr(VkPhysicalDevice gpu, const char* pName)
+VK_LAYER_EXPORT void * VKAPI multi2GetDeviceProcAddr(VkDevice device, const char* pName)
 {
-    VkBaseLayerObject* gpuw = (VkBaseLayerObject *) gpu;
+    VkBaseLayerObject* devw = (VkBaseLayerObject *) device;
 
-    if (gpu == NULL)
+    if (device == NULL)
         return NULL;
 
-    getLayer2Table(gpuw);
+    getLayer2Table(devw);
 
-    if (!strcmp("vkEnumeratePhysicalDevices", pName))
-        return (void *) multi2EnumeratePhysicalDevices;
-    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 (!strcmp("vkCreateCommandBuffer", pName))
+    if (!strcmp("vkCreateCommandBuffer", pName))
         return (void *) multi2CreateCommandBuffer;
     else if (!strcmp("vkBeginCommandBuffer", pName))
         return (void *) multi2BeginCommandBuffer;
     else {
-        if (gpuw->pGPA == NULL)
+        if (devw->pGPA == NULL)
             return NULL;
-        return gpuw->pGPA((VkObject) gpuw->nextObject, pName);
+        return devw->pGPA((VkObject) devw->nextObject, pName);
     }
 }
 
@@ -412,21 +398,21 @@
     return VK_SUCCESS;
 }
 
-VK_LAYER_EXPORT void * VKAPI vkGetProcAddr(VkPhysicalDevice gpu, const char* pName)
+VK_LAYER_EXPORT void * VKAPI vkGetDeviceProcAddr(VkDevice device, 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;
+    // to find each layers GPA routine Loader will search via "<layerName>GetDeviceProcAddr"
+    if (!strcmp("multi1GetDeviceProcAddr", pName))
+        return (void *) multi1GetDeviceProcAddr;
+    else if (!strcmp("multi2GetDeviceProcAddr", pName))
+        return (void *) multi2GetDeviceProcAddr;
+    else if (!strcmp("vkGetDeviceProcAddr", pName))
+        return (void *) vkGetDeviceProcAddr;
 
     // use first layer activated as GPA dispatch table activation happens in order
     else if (layer1_first_activated)
-        return multi1GetProcAddr(gpu, pName);
+        return multi1GetDeviceProcAddr(device, pName);
     else if (layer2_first_activated)
-        return multi2GetProcAddr(gpu, pName);
+        return multi2GetDeviceProcAddr(device, pName);
     else
         return NULL;
 
@@ -434,19 +420,13 @@
 
 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))
+    // to find each layers GPA routine Loader will search via "<layerName>GetInstanceProcAddr"
+    if (!strcmp("multi1GetInstanceProcAddr", pName))
         return (void *) multi1GetInstanceProcAddr;
     else if (!strcmp("multi2GetInstanceProcAddr", pName))
         return (void *) multi2GetInstanceProcAddr;
     else if (!strcmp("vkGetInstanceProcAddr", pName))
-        return (void *) vkGetProcAddr;
+        return (void *) vkGetInstanceProcAddr;
 
     // use first layer activated as GPA dispatch table activation happens in order
     else if (layer1_first_activated)
@@ -461,14 +441,14 @@
 }    //extern "C"
 #endif
 
-static void initLayerTable(const VkBaseLayerObject *gpuw, VkLayerDispatchTable *pTable, const unsigned int layerNum)
+static void initLayerTable(const VkBaseLayerObject *devw, VkLayerDispatchTable *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_initialize_dispatch_table(pTable, (PFN_vkGetProcAddr) gpuw->pGPA, (VkPhysicalDevice) gpuw->nextObject);
+    layer_initialize_dispatch_table(pTable, (PFN_vkGetDeviceProcAddr) devw->pGPA, (VkDevice) devw->nextObject);
 }
 
 static void initLayerInstanceTable(const VkBaseLayerObject *instw, VkLayerInstanceDispatchTable *pTable, const unsigned int layerNum)
diff --git a/layers/param_checker.cpp b/layers/param_checker.cpp
index 434f87d..8fdcb8d 100644
--- a/layers/param_checker.cpp
+++ b/layers/param_checker.cpp
@@ -52,10 +52,10 @@
 // TODO handle multiple GPUs/instances for both instance and device dispatch tables
 static void initDeviceTable(void)
 {
-    PFN_vkGetProcAddr fpNextGPA;
-    fpNextGPA = (PFN_vkGetProcAddr) pCurObj->pGPA;
+    PFN_vkGetDeviceProcAddr fpNextGPA;
+    fpNextGPA = (PFN_vkGetDeviceProcAddr) pCurObj->pGPA;
     assert(fpNextGPA);
-    layer_initialize_dispatch_table(&nextTable, fpNextGPA, (VkPhysicalDevice) pCurObj->nextObject);
+    layer_initialize_dispatch_table(&nextTable, fpNextGPA, (VkDevice) pCurObj->nextObject);
 }
 
 static void initInstanceTable(void)
@@ -1970,24 +1970,10 @@
         return NULL;
 
     name += 2;
-    if (!strcmp(name, "CreateInstance"))
-        return (void*) vkCreateInstance;
-    if (!strcmp(name, "DestroyInstance"))
-        return (void*) vkDestroyInstance;
-    if (!strcmp(name, "GetPhysicalDeviceInfo"))
-        return (void*) vkGetPhysicalDeviceInfo;
-    if (!strcmp(name, "GetProcAddr"))
-        return (void*) vkGetProcAddr;
-    if (!strcmp(name, "CreateDevice"))
-        return (void*) vkCreateDevice;
+    if (!strcmp(name, "GetDeviceProcAddr"))
+        return (void*) vkGetDeviceProcAddr;
     if (!strcmp(name, "DestroyDevice"))
         return (void*) vkDestroyDevice;
-    if (!strcmp(name, "GetGlobalExtensionInfo"))
-        return (void*) vkGetGlobalExtensionInfo;
-    if (!strcmp(name, "GetPhysicalDeviceExtensionInfo"))
-        return (void*) vkGetPhysicalDeviceExtensionInfo;
-    if (!strcmp(name, "EnumerateLayers"))
-        return (void*) vkEnumerateLayers;
     if (!strcmp(name, "GetDeviceQueue"))
         return (void*) vkGetDeviceQueue;
     if (!strcmp(name, "QueueSubmit"))
@@ -2012,8 +1998,6 @@
         return (void*) vkInvalidateMappedMemoryRanges;
     if (!strcmp(name, "PinSystemMemory"))
         return (void*) vkPinSystemMemory;
-    if (!strcmp(name, "GetMultiDeviceCompatibility"))
-        return (void*) vkGetMultiDeviceCompatibility;
     if (!strcmp(name, "OpenSharedMemory"))
         return (void*) vkOpenSharedMemory;
     if (!strcmp(name, "OpenSharedSemaphore"))
@@ -2188,16 +2172,10 @@
         return (void*) vkCmdEndRenderPass;
     if (!strcmp(name, "DbgSetValidationLevel"))
         return (void*) vkDbgSetValidationLevel;
-    if (!strcmp(name, "DbgRegisterMsgCallback"))
-        return (void*) vkDbgRegisterMsgCallback;
-    if (!strcmp(name, "DbgUnregisterMsgCallback"))
-        return (void*) vkDbgUnregisterMsgCallback;
     if (!strcmp(name, "DbgSetMessageFilter"))
         return (void*) vkDbgSetMessageFilter;
     if (!strcmp(name, "DbgSetObjectTag"))
         return (void*) vkDbgSetObjectTag;
-    if (!strcmp(name, "DbgSetGlobalOption"))
-        return (void*) vkDbgSetGlobalOption;
     if (!strcmp(name, "DbgSetDeviceOption"))
         return (void*) vkDbgSetDeviceOption;
     if (!strcmp(name, "CmdDbgMarkerBegin"))
@@ -2232,8 +2210,6 @@
         return (void*) vkDestroyInstance;
     if (!strcmp(name, "GetPhysicalDeviceInfo"))
         return (void*) vkGetPhysicalDeviceInfo;
-    if (!strcmp(name, "GetProcAddr"))
-        return (void*) vkGetProcAddr;
     if (!strcmp(name, "CreateDevice"))
         return (void*) vkCreateDevice;
     if (!strcmp(name, "GetGlobalExtensionInfo"))
@@ -2254,13 +2230,13 @@
     return NULL;
 }
 
-VK_LAYER_EXPORT void* VKAPI vkGetProcAddr(VkPhysicalDevice gpu, const char* funcName)
+VK_LAYER_EXPORT void* VKAPI vkGetDeviceProcAddr(VkDevice device, const char* funcName)
 {
-    VkBaseLayerObject* gpuw = (VkBaseLayerObject *) gpu;
+    VkBaseLayerObject* devw = (VkBaseLayerObject *) device;
     void* addr;
-    if (gpu == NULL)
+    if (device == NULL)
         return NULL;
-    pCurObj = gpuw;
+    pCurObj = devw;
     loader_platform_thread_once(&initOnce, initParamChecker);
     loader_platform_thread_once(&tabDeviceOnce, initDeviceTable);
 
@@ -2268,9 +2244,9 @@
     if (addr)
         return addr;
     else {
-        if (gpuw->pGPA == NULL)
+        if (devw->pGPA == NULL)
             return NULL;
-        return gpuw->pGPA((VkObject)gpuw->nextObject, funcName);
+        return devw->pGPA((VkObject)devw->nextObject, funcName);
     }
 }
 
diff --git a/layers/shader_checker.cpp b/layers/shader_checker.cpp
index fd3a815..23c6740 100644
--- a/layers/shader_checker.cpp
+++ b/layers/shader_checker.cpp
@@ -145,22 +145,22 @@
 }
 
 
-static VkLayerDispatchTable * initLayerTable(const VkBaseLayerObject *gpuw)
+static VkLayerDispatchTable * initLayerTable(const VkBaseLayerObject *devw)
 {
     VkLayerDispatchTable *pTable;
 
-    assert(gpuw);
-    std::unordered_map<void *, VkLayerDispatchTable *>::const_iterator it = tableMap.find((void *) gpuw->baseObject);
+    assert(devw);
+    std::unordered_map<void *, VkLayerDispatchTable *>::const_iterator it = tableMap.find((void *) devw->baseObject);
     if (it == tableMap.end())
     {
         pTable =  new VkLayerDispatchTable;
-        tableMap[(void *) gpuw->baseObject] = pTable;
+        tableMap[(void *) devw->baseObject] = pTable;
     } else
     {
         return it->second;
     }
 
-    layer_initialize_dispatch_table(pTable, (PFN_vkGetProcAddr) gpuw->pGPA, (VkPhysicalDevice) gpuw->nextObject);
+    layer_initialize_dispatch_table(pTable, (PFN_vkGetDeviceProcAddr) devw->pGPA, (VkDevice) devw->nextObject);
 
     return pTable;
 }
@@ -1002,12 +1002,12 @@
 }
 
 
-VK_LAYER_EXPORT void * VKAPI vkGetProcAddr(VkPhysicalDevice gpu, const char* pName)
+VK_LAYER_EXPORT void * VKAPI vkGetDeviceProcAddr(VkDevice device, const char* pName)
 {
-    if (gpu == NULL)
+    if (device == NULL)
         return NULL;
 
-    initLayerTable((const VkBaseLayerObject *) gpu);
+    initLayerTable((const VkBaseLayerObject *) device);
 
     loader_platform_thread_once(&g_initOnce, initLayer);
 
@@ -1015,18 +1015,16 @@
     if (!strncmp(#fn, pName, sizeof(#fn))) \
         return (void *) fn
 
-    ADD_HOOK(vkGetProcAddr);
-    ADD_HOOK(vkEnumerateLayers);
-    ADD_HOOK(vkGetGlobalExtensionInfo);
+    ADD_HOOK(vkGetDeviceProcAddr);
     ADD_HOOK(vkCreateShader);
     ADD_HOOK(vkCreateGraphicsPipeline);
     ADD_HOOK(vkCreateGraphicsPipelineDerivative);
 #undef ADD_HOOK
 
-    VkBaseLayerObject* gpuw = (VkBaseLayerObject *) gpu;
-    if (gpuw->pGPA == NULL)
+    VkBaseLayerObject* devw = (VkBaseLayerObject *) device;
+    if (devw->pGPA == NULL)
         return NULL;
-    return gpuw->pGPA((VkObject) gpuw->nextObject, pName);
+    return devw->pGPA((VkObject) devw->nextObject, pName);
 }
 
 VK_LAYER_EXPORT void * VKAPI vkGetInstanceProcAddr(VkInstance inst, const char* pName)
@@ -1042,7 +1040,6 @@
     if (!strncmp(#fn, pName, sizeof(#fn))) \
         return (void *) fn
 
-    ADD_HOOK(vkGetProcAddr);
     ADD_HOOK(vkGetInstanceProcAddr);
     ADD_HOOK(vkEnumerateLayers);
     ADD_HOOK(vkGetGlobalExtensionInfo);
diff --git a/loader/gpa_helper.h b/loader/gpa_helper.h
index eb8d1fb..3e49195 100644
--- a/loader/gpa_helper.h
+++ b/loader/gpa_helper.h
@@ -40,8 +40,8 @@
         return (void*) vkGetPhysicalDeviceInfo;
     if (!strcmp(name, "GetInstanceProcAddr"))
         return (void*) vkGetInstanceProcAddr;
-    if (!strcmp(name, "GetProcAddr"))
-        return (void*) vkGetProcAddr;
+    if (!strcmp(name, "GetDeviceProcAddr"))
+        return (void*) vkGetDeviceProcAddr;
     if (!strcmp(name, "CreateDevice"))
         return (void*) vkCreateDevice;
     if (!strcmp(name, "DestroyDevice"))
@@ -310,8 +310,8 @@
         return (void*) vkGetPhysicalDeviceInfo;
     if (!strcmp(name, "GetInstanceProcAddr"))
         return (void*) vkGetInstanceProcAddr;
-    if (!strcmp(name, "GetProcAddr"))
-        return (void*) vkGetProcAddr;
+    if (!strcmp(name, "GetDeviceProcAddr"))
+        return (void*) vkGetDeviceProcAddr;
     if (!strcmp(name, "CreateDevice"))
         return (void*) vkCreateDevice;
     if (!strcmp(name, "GetGlobalExtensionInfo"))
diff --git a/loader/loader.c b/loader/loader.c
index 37fea21..737bf66 100644
--- a/loader/loader.c
+++ b/loader/loader.c
@@ -74,7 +74,6 @@
 
 VkLayerInstanceDispatchTable instance_disp = {
     .GetInstanceProcAddr = vkGetInstanceProcAddr,
-    .GetProcAddr = vkGetProcAddr,
     .CreateInstance = loader_CreateInstance,
     .DestroyInstance = loader_DestroyInstance,
     .EnumeratePhysicalDevices = loader_EnumeratePhysicalDevices,
@@ -462,8 +461,8 @@
     }                                                          \
     } while (0)
 
-    /* could change this to use GetInstanceProcAddr in driver once they support it */
-    LOOKUP(GetProcAddr);
+    /* could change this to use GetInstanceProcAddr in driver instead of dlsym */
+    LOOKUP(GetDeviceProcAddr);
     LOOKUP(DestroyInstance);
     LOOKUP(EnumeratePhysicalDevices);
     LOOKUP(GetPhysicalDeviceInfo);
@@ -738,9 +737,9 @@
     if (addr)
         return addr;
     else  {
-        if (disp_table->GetProcAddr == NULL)
+        if (disp_table->GetDeviceProcAddr == NULL)
             return NULL;
-        return disp_table->GetProcAddr(physDev, pName);
+        return disp_table->GetDeviceProcAddr(physDev, pName);
     }
 }
 
@@ -1135,7 +1134,7 @@
         VkObject nextObj =  (VkObject) device;
         VkObject baseObj = nextObj;
         VkBaseLayerObject *nextGpuObj;
-        PFN_vkGetProcAddr nextGPA = loader_gpa_device_internal;
+        PFN_vkGetDeviceProcAddr nextGPA = loader_gpa_device_internal;
 
         count = loader_get_layer_libs(ext_count, ext_names, &pLayerNames);
         if (!count)
@@ -1155,11 +1154,11 @@
             nextObj = (VkObject) nextGpuObj;
 
             char funcStr[256];
-            snprintf(funcStr, 256, "%sGetProcAddr",icd->layer_libs[gpu_index][i].name);
-            if ((nextGPA = (PFN_vkGetProcAddr) loader_platform_get_proc_address(icd->layer_libs[gpu_index][i].lib_handle, funcStr)) == NULL)
-                nextGPA = (PFN_vkGetProcAddr) loader_platform_get_proc_address(icd->layer_libs[gpu_index][i].lib_handle, "vkGetProcAddr");
+            snprintf(funcStr, 256, "%sGetDeviceProcAddr",icd->layer_libs[gpu_index][i].name);
+            if ((nextGPA = (PFN_vkGetDeviceProcAddr) loader_platform_get_proc_address(icd->layer_libs[gpu_index][i].lib_handle, funcStr)) == NULL)
+                nextGPA = (PFN_vkGetDeviceProcAddr) loader_platform_get_proc_address(icd->layer_libs[gpu_index][i].lib_handle, "vkGetDeviceProcAddr");
             if (!nextGPA) {
-                loader_log(VK_DBG_MSG_ERROR, 0, "Failed to find vkGetProcAddr in layer %s", icd->layer_libs[gpu_index][i].name);
+                loader_log(VK_DBG_MSG_ERROR, 0, "Failed to find vkGetDeviceProcAddr in layer %s", icd->layer_libs[gpu_index][i].name);
                 continue;
             }
 
@@ -1168,7 +1167,7 @@
                 //Insert the new wrapped objects into the list with loader object at head
                 nextGpuObj = icd->wrappedGpus[gpu_index] + icd->layer_count[gpu_index] - 1;
                 nextGpuObj->nextObject = baseObj;
-                nextGpuObj->pGPA = icd->GetProcAddr;
+                nextGpuObj->pGPA = icd->GetDeviceProcAddr;
             }
 
         }
@@ -1311,7 +1310,7 @@
             return VK_ERROR_OUT_OF_HOST_MEMORY;
         while (icd) {
             VkBaseLayerObject * wrapped_gpus;
-            PFN_vkGetProcAddr get_proc_addr = icd->GetProcAddr;
+            PFN_vkGetDeviceProcAddr get_proc_addr = icd->GetDeviceProcAddr;
 
             n = *pPhysicalDeviceCount;
             res = icd->EnumeratePhysicalDevices(
@@ -1406,12 +1405,10 @@
     return NULL;
 }
 
-LOADER_EXPORT void * VKAPI vkGetProcAddr(VkPhysicalDevice gpu, const char * pName)
+LOADER_EXPORT void * VKAPI vkGetDeviceProcAddr(VkDevice device, const char * pName)
 {
-    if (gpu == VK_NULL_HANDLE) {
-
-        /* return entrypoint addresses that are global (in the loader)*/
-        return globalGetProcAddr(pName);
+    if (device == VK_NULL_HANDLE) {
+        return NULL;
     }
 
     void *addr;
@@ -1424,7 +1421,7 @@
     }
 
     /* return the dispatch table entrypoint for the fastest case */
-    const VkLayerDispatchTable *disp_table = * (VkLayerDispatchTable **) gpu;
+    const VkLayerDispatchTable *disp_table = * (VkLayerDispatchTable **) device;
     if (disp_table == NULL)
         return NULL;
 
@@ -1432,9 +1429,9 @@
     if (addr)
         return addr;
     else  {
-        if (disp_table->GetProcAddr == NULL)
+        if (disp_table->GetDeviceProcAddr == NULL)
             return NULL;
-        return disp_table->GetProcAddr(gpu, pName);
+        return disp_table->GetDeviceProcAddr(device, pName);
     }
 }
 
diff --git a/loader/loader.h b/loader/loader.h
index e93f258..972b4f1 100644
--- a/loader/loader.h
+++ b/loader/loader.h
@@ -67,7 +67,7 @@
     uint32_t gpu_count;
     VkBaseLayerObject *gpus;
     VkInstance instance;       // instance object from the icd
-    PFN_vkGetProcAddr GetProcAddr;
+    PFN_vkGetDeviceProcAddr GetDeviceProcAddr;
     PFN_vkDestroyInstance DestroyInstance;
     PFN_vkEnumeratePhysicalDevices EnumeratePhysicalDevices;
     PFN_vkGetPhysicalDeviceInfo GetPhysicalDeviceInfo;
diff --git a/loader/table_ops.h b/loader/table_ops.h
index 5316720..9a5a0c0 100644
--- a/loader/table_ops.h
+++ b/loader/table_ops.h
@@ -29,122 +29,123 @@
 #include "loader_platform.h"
 
 static inline void loader_init_device_dispatch_table(VkLayerDispatchTable *table,
-                                                    PFN_vkGetProcAddr gpa,
-                                                    VkPhysicalDevice gpu)
+                                                    PFN_vkGetDeviceProcAddr gpa,
+                                                    VkDevice dev)
 {
-    table->DestroyDevice = (PFN_vkDestroyDevice) gpa(gpu, "vkDestroyDevice");
-    table->GetDeviceQueue = (PFN_vkGetDeviceQueue) gpa(gpu, "vkGetDeviceQueue");
-    table->QueueSubmit = (PFN_vkQueueSubmit) gpa(gpu, "vkQueueSubmit");
-    table->QueueWaitIdle = (PFN_vkQueueWaitIdle) gpa(gpu, "vkQueueWaitIdle");
-    table->DeviceWaitIdle = (PFN_vkDeviceWaitIdle) gpa(gpu, "vkDeviceWaitIdle");
-    table->AllocMemory = (PFN_vkAllocMemory) gpa(gpu, "vkAllocMemory");
-    table->FreeMemory = (PFN_vkFreeMemory) gpa(gpu, "vkFreeMemory");
-    table->SetMemoryPriority = (PFN_vkSetMemoryPriority) gpa(gpu, "vkSetMemoryPriority");
-    table->MapMemory = (PFN_vkMapMemory) gpa(gpu, "vkMapMemory");
-    table->UnmapMemory = (PFN_vkUnmapMemory) gpa(gpu, "vkUnmapMemory");
-    table->FlushMappedMemoryRanges = (PFN_vkFlushMappedMemoryRanges) gpa(gpu, "vkFlushMappedMemoryRanges");
-    table->InvalidateMappedMemoryRanges = (PFN_vkInvalidateMappedMemoryRanges) gpa(gpu, "vkInvalidateMappedMemoryRanges");
-    table->PinSystemMemory = (PFN_vkPinSystemMemory) gpa(gpu, "vkPinSystemMemory");
-    table->OpenSharedMemory = (PFN_vkOpenSharedMemory) gpa(gpu, "vkOpenSharedMemory");
-    table->OpenSharedSemaphore = (PFN_vkOpenSharedSemaphore) gpa(gpu, "vkOpenSharedSemaphore");
-    table->OpenPeerMemory = (PFN_vkOpenPeerMemory) gpa(gpu, "vkOpenPeerMemory");
-    table->OpenPeerImage = (PFN_vkOpenPeerImage) gpa(gpu, "vkOpenPeerImage");
-    table->DestroyObject = (PFN_vkDestroyObject) gpa(gpu, "vkDestroyObject");
-    table->GetObjectInfo = (PFN_vkGetObjectInfo) gpa(gpu, "vkGetObjectInfo");
-    table->BindObjectMemory = (PFN_vkBindObjectMemory) gpa(gpu, "vkBindObjectMemory");
-    table->QueueBindSparseBufferMemory = (PFN_vkQueueBindSparseBufferMemory) gpa(gpu, "vkQueueBindSparseBufferMemory");
-    table->QueueBindSparseImageMemory = (PFN_vkQueueBindSparseImageMemory) gpa(gpu, "vkQueueBindSparseImageMemory");
-    table->CreateFence = (PFN_vkCreateFence) gpa(gpu, "vkCreateFence");
-    table->ResetFences = (PFN_vkResetFences) gpa(gpu, "vkResetFences");
-    table->GetFenceStatus = (PFN_vkGetFenceStatus) gpa(gpu, "vkGetFenceStatus");
-    table->WaitForFences = (PFN_vkWaitForFences) gpa(gpu, "vkWaitForFences");
-    table->CreateSemaphore = (PFN_vkCreateSemaphore) gpa(gpu, "vkCreateSemaphore");
-    table->QueueSignalSemaphore = (PFN_vkQueueSignalSemaphore) gpa(gpu, "vkQueueSignalSemaphore");
-    table->QueueWaitSemaphore = (PFN_vkQueueWaitSemaphore) gpa(gpu, "vkQueueWaitSemaphore");
-    table->CreateEvent = (PFN_vkCreateEvent) gpa(gpu, "vkCreateEvent");
-    table->GetEventStatus = (PFN_vkGetEventStatus) gpa(gpu, "vkGetEventStatus");
-    table->SetEvent = (PFN_vkSetEvent) gpa(gpu, "vkSetEvent");
-    table->ResetEvent = (PFN_vkResetEvent) gpa(gpu, "vkResetEvent");
-    table->CreateQueryPool = (PFN_vkCreateQueryPool) gpa(gpu, "vkCreateQueryPool");
-    table->GetQueryPoolResults = (PFN_vkGetQueryPoolResults) gpa(gpu, "vkGetQueryPoolResults");
-    table->GetFormatInfo = (PFN_vkGetFormatInfo) gpa(gpu, "vkGetFormatInfo");
-    table->CreateBuffer = (PFN_vkCreateBuffer) gpa(gpu, "vkCreateBuffer");
-    table->CreateBufferView = (PFN_vkCreateBufferView) gpa(gpu, "vkCreateBufferView");
-    table->CreateImage = (PFN_vkCreateImage) gpa(gpu, "vkCreateImage");
-    table->GetImageSubresourceInfo = (PFN_vkGetImageSubresourceInfo) gpa(gpu, "vkGetImageSubresourceInfo");
-    table->CreateImageView = (PFN_vkCreateImageView) gpa(gpu, "vkCreateImageView");
-    table->CreateColorAttachmentView = (PFN_vkCreateColorAttachmentView) gpa(gpu, "vkCreateColorAttachmentView");
-    table->CreateDepthStencilView = (PFN_vkCreateDepthStencilView) gpa(gpu, "vkCreateDepthStencilView");
-    table->CreateShader = (PFN_vkCreateShader) gpa(gpu, "vkCreateShader");
-    table->CreateGraphicsPipeline = (PFN_vkCreateGraphicsPipeline) gpa(gpu, "vkCreateGraphicsPipeline");
-    table->CreateGraphicsPipelineDerivative = (PFN_vkCreateGraphicsPipelineDerivative) gpa(gpu, "vkCreateGraphicsPipelineDerivative");
-    table->CreateComputePipeline = (PFN_vkCreateComputePipeline) gpa(gpu, "vkCreateComputePipeline");
-    table->StorePipeline = (PFN_vkStorePipeline) gpa(gpu, "vkStorePipeline");
-    table->LoadPipeline = (PFN_vkLoadPipeline) gpa(gpu, "vkLoadPipeline");
-    table->LoadPipelineDerivative = (PFN_vkLoadPipelineDerivative) gpa(gpu, "vkLoadPipelineDerivative");
-    table->CreatePipelineLayout = (PFN_vkCreatePipelineLayout) gpa(gpu, "vkCreatePipelineLayout");
-    table->CreateSampler = (PFN_vkCreateSampler) gpa(gpu, "vkCreateSampler");
-    table->CreateDescriptorSetLayout = (PFN_vkCreateDescriptorSetLayout) gpa(gpu, "vkCreateDescriptorSetLayout");
-    table->CreateDescriptorPool = (PFN_vkCreateDescriptorPool) gpa(gpu, "vkCreateDescriptorPool");
-    table->ResetDescriptorPool = (PFN_vkResetDescriptorPool) gpa(gpu, "vkResetDescriptorPool");
-    table->AllocDescriptorSets = (PFN_vkAllocDescriptorSets) gpa(gpu, "vkAllocDescriptorSets");
-    table->ClearDescriptorSets = (PFN_vkClearDescriptorSets) gpa(gpu, "vkClearDescriptorSets");
-    table->UpdateDescriptorSets = (PFN_vkUpdateDescriptorSets) gpa(gpu, "vkUpdateDescriptorSets");
-    table->CreateDynamicViewportState = (PFN_vkCreateDynamicViewportState) gpa(gpu, "vkCreateDynamicViewportState");
-    table->CreateDynamicRasterState = (PFN_vkCreateDynamicRasterState) gpa(gpu, "vkCreateDynamicRasterState");
-    table->CreateDynamicColorBlendState = (PFN_vkCreateDynamicColorBlendState) gpa(gpu, "vkCreateDynamicColorBlendState");
-    table->CreateDynamicDepthStencilState = (PFN_vkCreateDynamicDepthStencilState) gpa(gpu, "vkCreateDynamicDepthStencilState");
-    table->CreateCommandBuffer = (PFN_vkCreateCommandBuffer) gpa(gpu, "vkCreateCommandBuffer");
-    table->BeginCommandBuffer = (PFN_vkBeginCommandBuffer) gpa(gpu, "vkBeginCommandBuffer");
-    table->EndCommandBuffer = (PFN_vkEndCommandBuffer) gpa(gpu, "vkEndCommandBuffer");
-    table->ResetCommandBuffer = (PFN_vkResetCommandBuffer) gpa(gpu, "vkResetCommandBuffer");
-    table->CmdBindPipeline = (PFN_vkCmdBindPipeline) gpa(gpu, "vkCmdBindPipeline");
-    table->CmdBindDynamicStateObject = (PFN_vkCmdBindDynamicStateObject) gpa(gpu, "vkCmdBindDynamicStateObject");
-    table->CmdBindDescriptorSets = (PFN_vkCmdBindDescriptorSets) gpa(gpu, "vkCmdBindDescriptorSets");
-    table->CmdBindVertexBuffers = (PFN_vkCmdBindVertexBuffers) gpa(gpu, "vkCmdBindVertexBuffers");
-    table->CmdBindIndexBuffer = (PFN_vkCmdBindIndexBuffer) gpa(gpu, "vkCmdBindIndexBuffer");
-    table->CmdDraw = (PFN_vkCmdDraw) gpa(gpu, "vkCmdDraw");
-    table->CmdDrawIndexed = (PFN_vkCmdDrawIndexed) gpa(gpu, "vkCmdDrawIndexed");
-    table->CmdDrawIndirect = (PFN_vkCmdDrawIndirect) gpa(gpu, "vkCmdDrawIndirect");
-    table->CmdDrawIndexedIndirect = (PFN_vkCmdDrawIndexedIndirect) gpa(gpu, "vkCmdDrawIndexedIndirect");
-    table->CmdDispatch = (PFN_vkCmdDispatch) gpa(gpu, "vkCmdDispatch");
-    table->CmdDispatchIndirect = (PFN_vkCmdDispatchIndirect) gpa(gpu, "vkCmdDispatchIndirect");
-    table->CmdCopyBuffer = (PFN_vkCmdCopyBuffer) gpa(gpu, "vkCmdCopyBuffer");
-    table->CmdCopyImage = (PFN_vkCmdCopyImage) gpa(gpu, "vkCmdCopyImage");
-    table->CmdBlitImage = (PFN_vkCmdBlitImage) gpa(gpu, "vkCmdBlitImage");
-    table->CmdCopyBufferToImage = (PFN_vkCmdCopyBufferToImage) gpa(gpu, "vkCmdCopyBufferToImage");
-    table->CmdCopyImageToBuffer = (PFN_vkCmdCopyImageToBuffer) gpa(gpu, "vkCmdCopyImageToBuffer");
-    table->CmdUpdateBuffer = (PFN_vkCmdUpdateBuffer) gpa(gpu, "vkCmdUpdateBuffer");
-    table->CmdFillBuffer = (PFN_vkCmdFillBuffer) gpa(gpu, "vkCmdFillBuffer");
-    table->CmdClearColorImage = (PFN_vkCmdClearColorImage) gpa(gpu, "vkCmdClearColorImage");
-    table->CmdClearDepthStencil = (PFN_vkCmdClearDepthStencil) gpa(gpu, "vkCmdClearDepthStencil");
-    table->CmdResolveImage = (PFN_vkCmdResolveImage) gpa(gpu, "vkCmdResolveImage");
-    table->CmdSetEvent = (PFN_vkCmdSetEvent) gpa(gpu, "vkCmdSetEvent");
-    table->CmdResetEvent = (PFN_vkCmdResetEvent) gpa(gpu, "vkCmdResetEvent");
-    table->CmdWaitEvents = (PFN_vkCmdWaitEvents) gpa(gpu, "vkCmdWaitEvents");
-    table->CmdPipelineBarrier = (PFN_vkCmdPipelineBarrier) gpa(gpu, "vkCmdPipelineBarrier");
-    table->CmdBeginQuery = (PFN_vkCmdBeginQuery) gpa(gpu, "vkCmdBeginQuery");
-    table->CmdEndQuery = (PFN_vkCmdEndQuery) gpa(gpu, "vkCmdEndQuery");
-    table->CmdResetQueryPool = (PFN_vkCmdResetQueryPool) gpa(gpu, "vkCmdResetQueryPool");
-    table->CmdWriteTimestamp = (PFN_vkCmdWriteTimestamp) gpa(gpu, "vkCmdWriteTimestamp");
-    table->CmdCopyQueryPoolResults = (PFN_vkCmdCopyQueryPoolResults) gpa(gpu, "vkCmdCopyQueryPoolResults");
-    table->CmdInitAtomicCounters = (PFN_vkCmdInitAtomicCounters) gpa(gpu, "vkCmdInitAtomicCounters");
-    table->CmdLoadAtomicCounters = (PFN_vkCmdLoadAtomicCounters) gpa(gpu, "vkCmdLoadAtomicCounters");
-    table->CmdSaveAtomicCounters = (PFN_vkCmdSaveAtomicCounters) gpa(gpu, "vkCmdSaveAtomicCounters");
-    table->CreateFramebuffer = (PFN_vkCreateFramebuffer) gpa(gpu, "vkCreateFramebuffer");
-    table->CreateRenderPass = (PFN_vkCreateRenderPass) gpa(gpu, "vkCreateRenderPass");
-    table->CmdBeginRenderPass = (PFN_vkCmdBeginRenderPass) gpa(gpu, "vkCmdBeginRenderPass");
-    table->CmdEndRenderPass = (PFN_vkCmdEndRenderPass) gpa(gpu, "vkCmdEndRenderPass");
-    table->DbgSetValidationLevel = (PFN_vkDbgSetValidationLevel) gpa(gpu, "vkDbgSetValidationLevel");
-    table->DbgSetMessageFilter = (PFN_vkDbgSetMessageFilter) gpa(gpu, "vkDbgSetMessageFilter");
-    table->DbgSetObjectTag = (PFN_vkDbgSetObjectTag) gpa(gpu, "vkDbgSetObjectTag");
-    table->DbgSetDeviceOption = (PFN_vkDbgSetDeviceOption) gpa(gpu, "vkDbgSetDeviceOption");
-    table->CmdDbgMarkerBegin = (PFN_vkCmdDbgMarkerBegin) gpa(gpu, "vkCmdDbgMarkerBegin");
-    table->CmdDbgMarkerEnd = (PFN_vkCmdDbgMarkerEnd) gpa(gpu, "vkCmdDbgMarkerEnd");
-    table->CreateSwapChainWSI = (PFN_vkCreateSwapChainWSI) gpa(gpu, "vkCreateSwapChainWSI");
-    table->DestroySwapChainWSI = (PFN_vkDestroySwapChainWSI) gpa(gpu, "vkDestroySwapChainWSI");
-    table->GetSwapChainInfoWSI = (PFN_vkGetSwapChainInfoWSI) gpa(gpu, "vkGetSwapChainInfoWSI");
-    table->QueuePresentWSI = (PFN_vkQueuePresentWSI) gpa(gpu, "vkQueuePresentWSI");
+    table->GetDeviceProcAddr = gpa;
+    table->DestroyDevice = (PFN_vkDestroyDevice) gpa(dev, "vkDestroyDevice");
+    table->GetDeviceQueue = (PFN_vkGetDeviceQueue) gpa(dev, "vkGetDeviceQueue");
+    table->QueueSubmit = (PFN_vkQueueSubmit) gpa(dev, "vkQueueSubmit");
+    table->QueueWaitIdle = (PFN_vkQueueWaitIdle) gpa(dev, "vkQueueWaitIdle");
+    table->DeviceWaitIdle = (PFN_vkDeviceWaitIdle) gpa(dev, "vkDeviceWaitIdle");
+    table->AllocMemory = (PFN_vkAllocMemory) gpa(dev, "vkAllocMemory");
+    table->FreeMemory = (PFN_vkFreeMemory) gpa(dev, "vkFreeMemory");
+    table->SetMemoryPriority = (PFN_vkSetMemoryPriority) gpa(dev, "vkSetMemoryPriority");
+    table->MapMemory = (PFN_vkMapMemory) gpa(dev, "vkMapMemory");
+    table->UnmapMemory = (PFN_vkUnmapMemory) gpa(dev, "vkUnmapMemory");
+    table->FlushMappedMemoryRanges = (PFN_vkFlushMappedMemoryRanges) gpa(dev, "vkFlushMappedMemoryRanges");
+    table->InvalidateMappedMemoryRanges = (PFN_vkInvalidateMappedMemoryRanges) gpa(dev, "vkInvalidateMappedMemoryRanges");
+    table->PinSystemMemory = (PFN_vkPinSystemMemory) gpa(dev, "vkPinSystemMemory");
+    table->OpenSharedMemory = (PFN_vkOpenSharedMemory) gpa(dev, "vkOpenSharedMemory");
+    table->OpenSharedSemaphore = (PFN_vkOpenSharedSemaphore) gpa(dev, "vkOpenSharedSemaphore");
+    table->OpenPeerMemory = (PFN_vkOpenPeerMemory) gpa(dev, "vkOpenPeerMemory");
+    table->OpenPeerImage = (PFN_vkOpenPeerImage) gpa(dev, "vkOpenPeerImage");
+    table->DestroyObject = (PFN_vkDestroyObject) gpa(dev, "vkDestroyObject");
+    table->GetObjectInfo = (PFN_vkGetObjectInfo) gpa(dev, "vkGetObjectInfo");
+    table->BindObjectMemory = (PFN_vkBindObjectMemory) gpa(dev, "vkBindObjectMemory");
+    table->QueueBindSparseBufferMemory = (PFN_vkQueueBindSparseBufferMemory) gpa(dev, "vkQueueBindSparseBufferMemory");
+    table->QueueBindSparseImageMemory = (PFN_vkQueueBindSparseImageMemory) gpa(dev, "vkQueueBindSparseImageMemory");
+    table->CreateFence = (PFN_vkCreateFence) gpa(dev, "vkCreateFence");
+    table->ResetFences = (PFN_vkResetFences) gpa(dev, "vkResetFences");
+    table->GetFenceStatus = (PFN_vkGetFenceStatus) gpa(dev, "vkGetFenceStatus");
+    table->WaitForFences = (PFN_vkWaitForFences) gpa(dev, "vkWaitForFences");
+    table->CreateSemaphore = (PFN_vkCreateSemaphore) gpa(dev, "vkCreateSemaphore");
+    table->QueueSignalSemaphore = (PFN_vkQueueSignalSemaphore) gpa(dev, "vkQueueSignalSemaphore");
+    table->QueueWaitSemaphore = (PFN_vkQueueWaitSemaphore) gpa(dev, "vkQueueWaitSemaphore");
+    table->CreateEvent = (PFN_vkCreateEvent) gpa(dev, "vkCreateEvent");
+    table->GetEventStatus = (PFN_vkGetEventStatus) gpa(dev, "vkGetEventStatus");
+    table->SetEvent = (PFN_vkSetEvent) gpa(dev, "vkSetEvent");
+    table->ResetEvent = (PFN_vkResetEvent) gpa(dev, "vkResetEvent");
+    table->CreateQueryPool = (PFN_vkCreateQueryPool) gpa(dev, "vkCreateQueryPool");
+    table->GetQueryPoolResults = (PFN_vkGetQueryPoolResults) gpa(dev, "vkGetQueryPoolResults");
+    table->GetFormatInfo = (PFN_vkGetFormatInfo) gpa(dev, "vkGetFormatInfo");
+    table->CreateBuffer = (PFN_vkCreateBuffer) gpa(dev, "vkCreateBuffer");
+    table->CreateBufferView = (PFN_vkCreateBufferView) gpa(dev, "vkCreateBufferView");
+    table->CreateImage = (PFN_vkCreateImage) gpa(dev, "vkCreateImage");
+    table->GetImageSubresourceInfo = (PFN_vkGetImageSubresourceInfo) gpa(dev, "vkGetImageSubresourceInfo");
+    table->CreateImageView = (PFN_vkCreateImageView) gpa(dev, "vkCreateImageView");
+    table->CreateColorAttachmentView = (PFN_vkCreateColorAttachmentView) gpa(dev, "vkCreateColorAttachmentView");
+    table->CreateDepthStencilView = (PFN_vkCreateDepthStencilView) gpa(dev, "vkCreateDepthStencilView");
+    table->CreateShader = (PFN_vkCreateShader) gpa(dev, "vkCreateShader");
+    table->CreateGraphicsPipeline = (PFN_vkCreateGraphicsPipeline) gpa(dev, "vkCreateGraphicsPipeline");
+    table->CreateGraphicsPipelineDerivative = (PFN_vkCreateGraphicsPipelineDerivative) gpa(dev, "vkCreateGraphicsPipelineDerivative");
+    table->CreateComputePipeline = (PFN_vkCreateComputePipeline) gpa(dev, "vkCreateComputePipeline");
+    table->StorePipeline = (PFN_vkStorePipeline) gpa(dev, "vkStorePipeline");
+    table->LoadPipeline = (PFN_vkLoadPipeline) gpa(dev, "vkLoadPipeline");
+    table->LoadPipelineDerivative = (PFN_vkLoadPipelineDerivative) gpa(dev, "vkLoadPipelineDerivative");
+    table->CreatePipelineLayout = (PFN_vkCreatePipelineLayout) gpa(dev, "vkCreatePipelineLayout");
+    table->CreateSampler = (PFN_vkCreateSampler) gpa(dev, "vkCreateSampler");
+    table->CreateDescriptorSetLayout = (PFN_vkCreateDescriptorSetLayout) gpa(dev, "vkCreateDescriptorSetLayout");
+    table->CreateDescriptorPool = (PFN_vkCreateDescriptorPool) gpa(dev, "vkCreateDescriptorPool");
+    table->ResetDescriptorPool = (PFN_vkResetDescriptorPool) gpa(dev, "vkResetDescriptorPool");
+    table->AllocDescriptorSets = (PFN_vkAllocDescriptorSets) gpa(dev, "vkAllocDescriptorSets");
+    table->ClearDescriptorSets = (PFN_vkClearDescriptorSets) gpa(dev, "vkClearDescriptorSets");
+    table->UpdateDescriptorSets = (PFN_vkUpdateDescriptorSets) gpa(dev, "vkUpdateDescriptorSets");
+    table->CreateDynamicViewportState = (PFN_vkCreateDynamicViewportState) gpa(dev, "vkCreateDynamicViewportState");
+    table->CreateDynamicRasterState = (PFN_vkCreateDynamicRasterState) gpa(dev, "vkCreateDynamicRasterState");
+    table->CreateDynamicColorBlendState = (PFN_vkCreateDynamicColorBlendState) gpa(dev, "vkCreateDynamicColorBlendState");
+    table->CreateDynamicDepthStencilState = (PFN_vkCreateDynamicDepthStencilState) gpa(dev, "vkCreateDynamicDepthStencilState");
+    table->CreateCommandBuffer = (PFN_vkCreateCommandBuffer) gpa(dev, "vkCreateCommandBuffer");
+    table->BeginCommandBuffer = (PFN_vkBeginCommandBuffer) gpa(dev, "vkBeginCommandBuffer");
+    table->EndCommandBuffer = (PFN_vkEndCommandBuffer) gpa(dev, "vkEndCommandBuffer");
+    table->ResetCommandBuffer = (PFN_vkResetCommandBuffer) gpa(dev, "vkResetCommandBuffer");
+    table->CmdBindPipeline = (PFN_vkCmdBindPipeline) gpa(dev, "vkCmdBindPipeline");
+    table->CmdBindDynamicStateObject = (PFN_vkCmdBindDynamicStateObject) gpa(dev, "vkCmdBindDynamicStateObject");
+    table->CmdBindDescriptorSets = (PFN_vkCmdBindDescriptorSets) gpa(dev, "vkCmdBindDescriptorSets");
+    table->CmdBindVertexBuffers = (PFN_vkCmdBindVertexBuffers) gpa(dev, "vkCmdBindVertexBuffers");
+    table->CmdBindIndexBuffer = (PFN_vkCmdBindIndexBuffer) gpa(dev, "vkCmdBindIndexBuffer");
+    table->CmdDraw = (PFN_vkCmdDraw) gpa(dev, "vkCmdDraw");
+    table->CmdDrawIndexed = (PFN_vkCmdDrawIndexed) gpa(dev, "vkCmdDrawIndexed");
+    table->CmdDrawIndirect = (PFN_vkCmdDrawIndirect) gpa(dev, "vkCmdDrawIndirect");
+    table->CmdDrawIndexedIndirect = (PFN_vkCmdDrawIndexedIndirect) gpa(dev, "vkCmdDrawIndexedIndirect");
+    table->CmdDispatch = (PFN_vkCmdDispatch) gpa(dev, "vkCmdDispatch");
+    table->CmdDispatchIndirect = (PFN_vkCmdDispatchIndirect) gpa(dev, "vkCmdDispatchIndirect");
+    table->CmdCopyBuffer = (PFN_vkCmdCopyBuffer) gpa(dev, "vkCmdCopyBuffer");
+    table->CmdCopyImage = (PFN_vkCmdCopyImage) gpa(dev, "vkCmdCopyImage");
+    table->CmdBlitImage = (PFN_vkCmdBlitImage) gpa(dev, "vkCmdBlitImage");
+    table->CmdCopyBufferToImage = (PFN_vkCmdCopyBufferToImage) gpa(dev, "vkCmdCopyBufferToImage");
+    table->CmdCopyImageToBuffer = (PFN_vkCmdCopyImageToBuffer) gpa(dev, "vkCmdCopyImageToBuffer");
+    table->CmdUpdateBuffer = (PFN_vkCmdUpdateBuffer) gpa(dev, "vkCmdUpdateBuffer");
+    table->CmdFillBuffer = (PFN_vkCmdFillBuffer) gpa(dev, "vkCmdFillBuffer");
+    table->CmdClearColorImage = (PFN_vkCmdClearColorImage) gpa(dev, "vkCmdClearColorImage");
+    table->CmdClearDepthStencil = (PFN_vkCmdClearDepthStencil) gpa(dev, "vkCmdClearDepthStencil");
+    table->CmdResolveImage = (PFN_vkCmdResolveImage) gpa(dev, "vkCmdResolveImage");
+    table->CmdSetEvent = (PFN_vkCmdSetEvent) gpa(dev, "vkCmdSetEvent");
+    table->CmdResetEvent = (PFN_vkCmdResetEvent) gpa(dev, "vkCmdResetEvent");
+    table->CmdWaitEvents = (PFN_vkCmdWaitEvents) gpa(dev, "vkCmdWaitEvents");
+    table->CmdPipelineBarrier = (PFN_vkCmdPipelineBarrier) gpa(dev, "vkCmdPipelineBarrier");
+    table->CmdBeginQuery = (PFN_vkCmdBeginQuery) gpa(dev, "vkCmdBeginQuery");
+    table->CmdEndQuery = (PFN_vkCmdEndQuery) gpa(dev, "vkCmdEndQuery");
+    table->CmdResetQueryPool = (PFN_vkCmdResetQueryPool) gpa(dev, "vkCmdResetQueryPool");
+    table->CmdWriteTimestamp = (PFN_vkCmdWriteTimestamp) gpa(dev, "vkCmdWriteTimestamp");
+    table->CmdCopyQueryPoolResults = (PFN_vkCmdCopyQueryPoolResults) gpa(dev, "vkCmdCopyQueryPoolResults");
+    table->CmdInitAtomicCounters = (PFN_vkCmdInitAtomicCounters) gpa(dev, "vkCmdInitAtomicCounters");
+    table->CmdLoadAtomicCounters = (PFN_vkCmdLoadAtomicCounters) gpa(dev, "vkCmdLoadAtomicCounters");
+    table->CmdSaveAtomicCounters = (PFN_vkCmdSaveAtomicCounters) gpa(dev, "vkCmdSaveAtomicCounters");
+    table->CreateFramebuffer = (PFN_vkCreateFramebuffer) gpa(dev, "vkCreateFramebuffer");
+    table->CreateRenderPass = (PFN_vkCreateRenderPass) gpa(dev, "vkCreateRenderPass");
+    table->CmdBeginRenderPass = (PFN_vkCmdBeginRenderPass) gpa(dev, "vkCmdBeginRenderPass");
+    table->CmdEndRenderPass = (PFN_vkCmdEndRenderPass) gpa(dev, "vkCmdEndRenderPass");
+    table->DbgSetValidationLevel = (PFN_vkDbgSetValidationLevel) gpa(dev, "vkDbgSetValidationLevel");
+    table->DbgSetMessageFilter = (PFN_vkDbgSetMessageFilter) gpa(dev, "vkDbgSetMessageFilter");
+    table->DbgSetObjectTag = (PFN_vkDbgSetObjectTag) gpa(dev, "vkDbgSetObjectTag");
+    table->DbgSetDeviceOption = (PFN_vkDbgSetDeviceOption) gpa(dev, "vkDbgSetDeviceOption");
+    table->CmdDbgMarkerBegin = (PFN_vkCmdDbgMarkerBegin) gpa(dev, "vkCmdDbgMarkerBegin");
+    table->CmdDbgMarkerEnd = (PFN_vkCmdDbgMarkerEnd) gpa(dev, "vkCmdDbgMarkerEnd");
+    table->CreateSwapChainWSI = (PFN_vkCreateSwapChainWSI) gpa(dev, "vkCreateSwapChainWSI");
+    table->DestroySwapChainWSI = (PFN_vkDestroySwapChainWSI) gpa(dev, "vkDestroySwapChainWSI");
+    table->GetSwapChainInfoWSI = (PFN_vkGetSwapChainInfoWSI) gpa(dev, "vkGetSwapChainInfoWSI");
+    table->QueuePresentWSI = (PFN_vkQueuePresentWSI) gpa(dev, "vkQueuePresentWSI");
 }
 
 static inline void *loader_lookup_device_dispatch_table(
@@ -155,6 +156,8 @@
         return NULL;
 
     name += 2;
+    if (!strcmp(name, "GetDeviceProcAddr"))
+        return (void *) table->GetDeviceProcAddr;
     if (!strcmp(name, "DestroyDevice"))
         return (void *) table->DestroyDevice;
     if (!strcmp(name, "GetDeviceQueue"))
@@ -394,7 +397,6 @@
     table->EnumeratePhysicalDevices = (PFN_vkEnumeratePhysicalDevices) gpa(inst, "vkEnumeratePhysicalDevices");
     table->GetPhysicalDeviceInfo = (PFN_vkGetPhysicalDeviceInfo) gpa(inst, "vkGetPhysicalDeviceInfo");
     table->GetInstanceProcAddr = (PFN_vkGetInstanceProcAddr) gpa(inst, "vkGetInstanceProcAddr");
-    table->GetProcAddr = (PFN_vkGetProcAddr) gpa(inst, "vkGetProcAddr");
     table->CreateDevice = (PFN_vkCreateDevice) gpa(inst, "vkCreateDevice");
     table->GetGlobalExtensionInfo = (PFN_vkGetGlobalExtensionInfo) gpa(inst,"vkGetGlobalExtensionInfo");
     table->GetPhysicalDeviceExtensionInfo = (PFN_vkGetPhysicalDeviceExtensionInfo) gpa(inst, "vkGetPhysicalDeviceExtensionInfo");
@@ -424,8 +426,6 @@
         return (void *) table->GetPhysicalDeviceInfo;
     if (!strcmp(name, "GetInstanceProcAddr"))
         return (void *) table->GetInstanceProcAddr;
-    if (!strcmp(name, "GetProcAddr"))
-        return (void *) table->GetProcAddr;
     if (!strcmp(name, "CreateDevice"))
         return (void *) table->CreateDevice;
     if (!strcmp(name, "GetGlobalExtensionInfo"))
@@ -446,4 +446,4 @@
         return (void *) table->GetDisplayInfoWSI;
 
     return NULL;
-}
\ No newline at end of file
+}
diff --git a/loader/vk-loader-generate.py b/loader/vk-loader-generate.py
index 1d55d56..f0fcbdb 100755
--- a/loader/vk-loader-generate.py
+++ b/loader/vk-loader-generate.py
@@ -56,7 +56,7 @@
            return False
 
     def _is_loader_non_trampoline_entrypoint(self, proto):
-        if proto.name in ["GetProcAddr", "EnumeratePhysicalDevices", "EnumerateLayers", "DbgRegisterMsgCallback", "DbgUnregisterMsgCallback", "DbgSetGlobalOption", "DestroyInstance"]:
+        if proto.name in ["GetDeviceProcAddr", "EnumeratePhysicalDevices", "EnumerateLayers", "DbgRegisterMsgCallback", "DbgUnregisterMsgCallback", "DbgSetGlobalOption", "DestroyInstance"]:
             return True
         return not self.is_dispatchable_object_first_param(proto)
 
@@ -250,7 +250,7 @@
                              (proto.name, proto.name))
             func.append("static inline void %s_init_device_dispatch_table(VkLayerDispatchTable *table,"
                 % self.prefix)
-            func.append("%s                                              PFN_vkGetProcAddr gpa,"
+            func.append("%s                                              PFN_vkGetDeviceProcAddr gpa,"
                 % (" " * len(self.prefix)))
             func.append("%s                                              VkPhysicalDevice gpu)"
                 % (" " * len(self.prefix)))
@@ -365,7 +365,7 @@
         self.intercepted = [proto.name for proto in self.protos]
 
         for proto in self.protos:
-            if proto.name == "GetProcAddr":
+            if proto.name == "GetDeviceProcAddr":
                 self.gpa = proto
 
         super().run()
diff --git a/tests/vktestbinding.h b/tests/vktestbinding.h
index 2faea49..809472f 100644
--- a/tests/vktestbinding.h
+++ b/tests/vktestbinding.h
@@ -76,8 +76,6 @@
     VkPhysicalDeviceMemoryProperties memory_properties() const;
     std::vector<VkPhysicalDeviceQueueProperties> queue_properties() const;
 
-    // vkGetProcAddr()
-    void *get_proc(const char *name) const { return vkGetProcAddr(gpu_, name); }
 
     // vkGetGlobalExtensionInfo()
     std::vector<const char *> extensions() const;
@@ -212,6 +210,9 @@
 
     const PhysicalGpu &gpu() const { return gpu_; }
 
+    // vkGetDeviceProcAddr()
+    void *get_proc(const char *name) const { return vkGetDeviceProcAddr(obj(), name); }
+
     // vkGetDeviceQueue()
     const std::vector<Queue *> &graphics_queues() const { return queues_[GRAPHICS]; }
     const std::vector<Queue *> &compute_queues() { return queues_[COMPUTE]; }
diff --git a/vk-generate.py b/vk-generate.py
index ca3a6d3..3375b1b 100755
--- a/vk-generate.py
+++ b/vk-generate.py
@@ -117,13 +117,13 @@
             for proto in self.protos:
                 if proto.name == "CreateInstance" or proto.name == "GetGlobalExtensionInfo" or proto.name == "GetDisplayInfoWSI" or proto.params[0].ty == "VkInstance" or proto.params[0].ty == "VkPhysicalDevice":
                     continue
-                stmts.append("table->%s = (PFN_vk%s) gpa(gpu, \"vk%s\");" %
+                stmts.append("table->%s = (PFN_vk%s) gpa(device, \"vk%s\");" %
                         (proto.name, proto.name, proto.name))
             func.append("static inline void %s_initialize_dispatch_table(VkLayerDispatchTable *table,"
                 % self.prefix)
-            func.append("%s                                              PFN_vkGetProcAddr gpa,"
+            func.append("%s                                              PFN_vkGetDeviceProcAddr gpa,"
                 % (" " * len(self.prefix)))
-            func.append("%s                                              VkPhysicalDevice gpu)"
+            func.append("%s                                              VkDevice device)"
                 % (" " * len(self.prefix)))
         else:
             for proto in self.protos:
@@ -188,7 +188,7 @@
 
     def generate_body(self):
         for proto in self.protos:
-            if proto.name == "GetProcAddr":
+            if proto.name == "GetDeviceProcAddr":
                 gpa_proto = proto
             if proto.name == "GetInstanceProcAddr":
                 gpa_instance_proto = proto
@@ -231,11 +231,12 @@
                     "EnumeratePhysicalDevices",
                     "CreateInstance",
                     "DestroyInstance",
-                    "GetProcAddr",
+                    "GetDeviceProcAddr",
+                    "GetInstanceProcAddr",
                 ],
                 "layer": [
                     "GetInstanceProcAddr",
-                    "GetProcAddr",
+                    "GetDeviceProcAddr",
                     "EnumerateLayers",
                     "GetGlobalExtensionInfo",
                 ],
diff --git a/vk-layer-generate.py b/vk-layer-generate.py
index 617406b..43c1fc2 100755
--- a/vk-layer-generate.py
+++ b/vk-layer-generate.py
@@ -286,7 +286,7 @@
         funcs = []
         intercepted = []
         for proto in self.protos:
-            if proto.name == "GetProcAddr" or proto.name == "GetInstanceProcAddr":
+            if proto.name == "GetDeviceProcAddr" or proto.name == "GetInstanceProcAddr":
                 intercepted.append(proto)
             else:
                 intercept = self.generate_intercept(proto, qual)
@@ -410,13 +410,13 @@
 
     def _generate_layer_gpa_function(self, extensions=[], instance_extensions=[]):
         func_body = []
-        func_body.append("VK_LAYER_EXPORT void* VKAPI vkGetProcAddr(VkPhysicalDevice gpu, const char* funcName)\n"
+        func_body.append("VK_LAYER_EXPORT void* VKAPI vkGetDeviceProcAddr(VkDevice device, const char* funcName)\n"
                          "{\n"
-                         "    VkBaseLayerObject* gpuw = (VkBaseLayerObject *) gpu;\n"
+                         "    VkBaseLayerObject* devw = (VkBaseLayerObject *) device;\n"
                          "    void* addr;\n"
-                         "    if (gpu == VK_NULL_HANDLE)\n"
+                         "    if (device == VK_NULL_HANDLE)\n"
                          "        return NULL;\n"
-                         "    pCurObj = gpuw;\n"
+                         "    pCurObj = devw;\n"
                          "    loader_platform_thread_once(&initOnce, init%s);\n\n"
                          "    loader_platform_thread_once(&tabDeviceOnce, initDeviceTable);\n\n"
                          "    addr = layer_intercept_proc(funcName);\n"
@@ -433,9 +433,9 @@
                 func_body.append('    else if (!strncmp("%s", funcName, sizeof("%s")))\n'
                                  '        return %s%s%s;' % (ext_name, ext_name, cpp_prefix, ext_name, cpp_postfix))
         func_body.append("    else {\n"
-                         "        if (gpuw->pGPA == NULL)\n"
+                         "        if (devw->pGPA == NULL)\n"
                          "            return NULL;\n"
-                         "        return gpuw->pGPA((VkObject)gpuw->nextObject, funcName);\n"
+                         "        return devw->pGPA((VkObject)devw->nextObject, funcName);\n"
                          "    }\n"
                          "}\n")
         func_body.append("VK_LAYER_EXPORT void* VKAPI vkGetInstanceProcAddr(VkInstance inst, const char* funcName)\n"
@@ -498,10 +498,10 @@
         func_body.append('')
         func_body.append('static void initDeviceTable(void)')
         func_body.append('{')
-        func_body.append('    PFN_vkGetProcAddr fpNextGPA;')
-        func_body.append('    fpNextGPA = (PFN_vkGetProcAddr) pCurObj->pGPA;')
+        func_body.append('    PFN_vkGetDeviceProcAddr fpNextGPA;')
+        func_body.append('    fpNextGPA = (PFN_vkGetDeviceProcAddr) pCurObj->pGPA;')
         func_body.append('    assert(fpNextGPA);')
-        func_body.append('    layer_initialize_dispatch_table(&nextTable, fpNextGPA, (VkPhysicalDevice) pCurObj->nextObject);')
+        func_body.append('    layer_initialize_dispatch_table(&nextTable, fpNextGPA, (VkDevice) pCurObj->nextObject);')
         func_body.append('}')
         func_body.append('')
         func_body.append('static void initInstanceTable(void)')
@@ -730,10 +730,10 @@
         func_body.append('')
         func_body.append('static void initDeviceTable(void)')
         func_body.append('{')
-        func_body.append('    PFN_vkGetProcAddr fpNextGPA;')
-        func_body.append('    fpNextGPA = (PFN_vkGetProcAddr) pCurObj->pGPA;')
+        func_body.append('    PFN_vkGetDeviceProcAddr fpNextGPA;')
+        func_body.append('    fpNextGPA = (PFN_vkGetDeviceProcAddr) pCurObj->pGPA;')
         func_body.append('    assert(fpNextGPA);')
-        func_body.append('    layer_initialize_dispatch_table(&nextTable, fpNextGPA, (VkPhysicalDevice) pCurObj->nextObject);')
+        func_body.append('    layer_initialize_dispatch_table(&nextTable, fpNextGPA, (VkDevice) pCurObj->nextObject);')
         func_body.append('}')
         func_body.append('')
         func_body.append('static void initInstanceTable(void)')
diff --git a/vulkan.py b/vulkan.py
index f18ab68..796a280 100755
--- a/vulkan.py
+++ b/vulkan.py
@@ -239,8 +239,8 @@
             [Param("VkInstance", "instance"),
              Param("const char*", "pName")]),
 
-        Proto("void*", "GetProcAddr",
-            [Param("VkPhysicalDevice", "gpu"),
+        Proto("void*", "GetDeviceProcAddr",
+            [Param("VkDevice", "device"),
              Param("const char*", "pName")]),
 
         Proto("VkResult", "CreateDevice",