loader: Fix vkGetInstanceProcAddr to handle debug_report extension
authorJon Ashburn <jon@lunarg.com>
Thu, 1 Oct 2015 18:03:17 +0000 (12:03 -0600)
committerJon Ashburn <jon@lunarg.com>
Thu, 1 Oct 2015 19:32:55 +0000 (13:32 -0600)
Need loader entrypoints for debug_report extension including the utility
functions. Don't call down the instance chain GPA for this extension.

Remove instance extensions decoding when GPA instance == NULL as don't want
to return extension entrypoints unless they are enabled.
This meant the WSI swapchain instance GPA was no longer used so remove it.

loader/debug_report.c
loader/debug_report.h
loader/loader.c
loader/wsi_swapchain.c
loader/wsi_swapchain.h

index 63c86c6f5718fabd4bfe51ca327998c131d85c93..c8686dc08d232e0756467577dbe69a589794f045 100644 (file)
@@ -320,23 +320,34 @@ static void VKAPI BreakCallback(
 #endif
 }
 
-void *debug_report_instance_gpa(
+bool debug_report_instance_gpa(
         struct loader_instance *ptr_instance,
-        const char* name)
+        const char* name,
+        void **addr)
 {
-    if (ptr_instance == VK_NULL_HANDLE || !ptr_instance->debug_report_enabled)
-        return NULL;
-
-    if (!strcmp("vkDbgCreateMsgCallback", name))
-        return (void *) debug_report_DbgCreateMsgCallback;
-    else if (!strcmp("vkDbgDestroyMsgCallback", name))
-        return (void *) debug_report_DbgDestroyMsgCallback;
-    else if (!strcmp("vkDbgStringCallback", name))
-        return (void *) StringCallback;
-    else if (!strcmp("vkDbgStdioCallback", name))
-        return (void *) StdioCallback;
-    else if (!strcmp("vkDbgBreakCallback", name))
-        return (void *) BreakCallback;
-
-    return NULL;
+    *addr = NULL;
+    if (ptr_instance == VK_NULL_HANDLE)
+        return false;
+
+    if (!strcmp("vkDbgCreateMsgCallback", name)) {
+        *addr = ptr_instance->debug_report_enabled ? (void *) debug_report_DbgCreateMsgCallback : NULL;
+        return true;
+    }
+    if (!strcmp("vkDbgDestroyMsgCallback", name)) {
+        *addr = ptr_instance->debug_report_enabled ? (void *) debug_report_DbgDestroyMsgCallback : NULL;
+        return true;
+    }
+    if (!strcmp("vkDbgStringCallback", name)) {
+        *addr = ptr_instance->debug_report_enabled ? (void *) StringCallback : NULL;
+        return true;
+    }
+    if (!strcmp("vkDbgStdioCallback", name)) {
+        *addr = ptr_instance->debug_report_enabled ? (void *) StdioCallback : NULL;
+        return true;
+    }
+    if (!strcmp("vkDbgBreakCallback", name)) {
+        *addr = ptr_instance->debug_report_enabled ? (void *) BreakCallback : NULL;
+        return true;
+    }
+    return false;
 }
index a04386a04a0777830f3ffbcc0666b2cae5fca081..7b008d354f7d6f719dbddd621f3cd03a852bcaeb 100644 (file)
@@ -98,9 +98,10 @@ void debug_report_create_instance(
         struct loader_instance *ptr_instance,
         const VkInstanceCreateInfo *pCreateInfo);
 
-void *debug_report_instance_gpa(
+bool debug_report_instance_gpa(
         struct loader_instance *ptr_instance,
-        const char* name);
+        const char* name,
+        void **addr);
 
 VkResult VKAPI loader_DbgCreateMsgCallback(
     VkInstance                          instance,
index 6cee2a69192914ba2d7e57ac71b3ce6a722fcec2..a0817aac7badd9c0639a2ebdf0beca62d0b3a18f 100644 (file)
@@ -3019,30 +3019,29 @@ LOADER_EXPORT PFN_vkVoidFunction VKAPI vkGetInstanceProcAddr(VkInstance instance
     void *addr;
 
     if (instance == VK_NULL_HANDLE) {
-        struct loader_instance *ptr_instance = (struct loader_instance *) instance;
-        /* get entrypoint addresses that are global (in the loader)*/
+        /* get entrypoint addresses that are global (in the loader),
+           doesn't include any instance extensions since they may not be enabled yet*/
         addr = globalGetProcAddr(pName);
-        if (addr)
-            return addr;
-
-        /* return any extension global entrypoints */
-        addr = debug_report_instance_gpa(ptr_instance, pName);
-        if (addr) {
-            return addr;
-        }
-
-        addr = wsi_swapchain_GetInstanceProcAddr(ptr_instance, pName);
 
         return addr;
     }
 
+
     /* return any instance entrypoints that must resolve to loader code */
     addr = loader_non_passthrough_gipa(pName);
     if (addr) {
         return addr;
     }
 
-    /* return the instance dispatch table entrypoint for extensions */
+    /* debug_report is a special case; need to return loader trampoline entrypoints
+     * unless the extension is not enabled; also need to handle debug_report
+     * utility functions */
+    struct loader_instance *ptr_instance = (struct loader_instance *) instance;
+    if (debug_report_instance_gpa(ptr_instance, pName, &addr)) {
+        return addr;
+    }
+
+    /* return the instance dispatch table entrypoint for core and extensions */
     const VkLayerInstanceDispatchTable *disp_table = * (VkLayerInstanceDispatchTable **) instance;
     if (disp_table == NULL)
         return NULL;
index 19c917ed25d786913266c9f805b7bcb26d6fdb39..5bdf284d859249d8b2c97fbcd2182bd1769c1858 100644 (file)
@@ -109,17 +109,4 @@ VkResult VKAPI loader_GetPhysicalDeviceSurfaceSupportKHR(
 }
 
 
-void *wsi_swapchain_GetInstanceProcAddr(
-        struct loader_instance *ptr_instance,
-        const char*                             pName)
-{
-    if (ptr_instance == VK_NULL_HANDLE || !ptr_instance->wsi_swapchain_enabled) {
-        return NULL;
-    }
 
-    if (!strcmp(pName, "vkGetPhysicalDeviceSurfaceSupportKHR")) {
-        return (void*) wsi_swapchain_GetPhysicalDeviceSurfaceSupportKHR;
-    }
-
-    return NULL;
-}
index 93c9954437e968445206e27638e6ba959fa3fcce..c0647a016c2bbe94fced05a01b7e6ccdbdca1d7e 100644 (file)
@@ -39,9 +39,6 @@ void wsi_swapchain_create_instance(
         struct loader_instance *ptr_instance,
         const VkInstanceCreateInfo *pCreateInfo);
 
-void *wsi_swapchain_GetInstanceProcAddr(
-        struct loader_instance                  *ptr_instance,
-        const char*                             pName);
 
 VkResult VKAPI loader_GetPhysicalDeviceSurfaceSupportKHR(
         VkPhysicalDevice                        physicalDevice,