diff options
| author | Jon Ashburn <jon@lunarg.com> | 2016-01-07 09:44:27 -0700 |
|---|---|---|
| committer | Jon Ashburn <jon@lunarg.com> | 2016-01-07 10:06:00 -0700 |
| commit | 05fd7eacb0983a069c79d8c0ab80a0d30dfd8c25 (patch) | |
| tree | 58d7e0e0e00bcbdb7e60a0bf44d3f3c42ff351cd /loader/loader.c | |
| parent | b747f683985481598983d9bb5d5b0b8e7197a41b (diff) | |
| download | usermoji-05fd7eacb0983a069c79d8c0ab80a0d30dfd8c25.tar.xz | |
loader: Find ICD entrypoints via vk_icdGetInstanceProcAddr first in ICD library
Also support prior method (now deprecated) of looking up vkGetInstanceProcAddr.
But now other globals are gotten from GetInstanceProcAddr calls.
Diffstat (limited to 'loader/loader.c')
| -rw-r--r-- | loader/loader.c | 37 |
1 files changed, 22 insertions, 15 deletions
diff --git a/loader/loader.c b/loader/loader.c index 3b29efbc..79ed84ba 100644 --- a/loader/loader.c +++ b/loader/loader.c @@ -1262,7 +1262,7 @@ static void loader_scanned_icd_add( { loader_platform_dl_handle handle; PFN_vkCreateInstance fp_create_inst; - PFN_vkEnumerateInstanceExtensionProperties fp_get_global_ext_props; + PFN_vkEnumerateInstanceExtensionProperties fp_get_inst_ext_props; PFN_vkGetInstanceProcAddr fp_get_proc_addr; struct loader_scanned_icds *new_node; @@ -1275,19 +1275,26 @@ static void loader_scanned_icd_add( return; } -#define LOOKUP_LD(func_ptr, func) do { \ - func_ptr = (PFN_vk ##func) loader_platform_get_proc_address(handle, "vk" #func); \ - if (!func_ptr) { \ - loader_log(inst, VK_DEBUG_REPORT_WARN_BIT_EXT, 0, loader_platform_get_proc_address_error("vk" #func)); \ - return; \ - } \ -} while (0) - - LOOKUP_LD(fp_get_proc_addr, GetInstanceProcAddr); - LOOKUP_LD(fp_create_inst, CreateInstance); - LOOKUP_LD(fp_get_global_ext_props, EnumerateInstanceExtensionProperties); - -#undef LOOKUP_LD + fp_get_proc_addr = loader_platform_get_proc_address(handle, "vk_icdGetInstanceProcAddr"); + if (!fp_get_proc_addr) { + fp_get_proc_addr = loader_platform_get_proc_address(handle, "vkGetInstanceProcAddr"); + if (!fp_get_proc_addr) { + loader_log(inst, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0, loader_platform_get_proc_address_error("vk_icdGetInstanceProcAddr")); + return; + } else { + loader_log(inst, VK_DEBUG_REPORT_WARN_BIT_EXT, 0, "Using deprecated ICD interface of vkGetInstanceProcAddr instead of vk_icdGetInstanceProcAddr"); + } + } + fp_create_inst = (PFN_vkCreateInstance) fp_get_proc_addr(NULL, "vkCreateInstance"); + if (!fp_create_inst) { + loader_log(inst, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0, "Couldn't get vkCreateInstance via vkGetInstanceProcAddr from ICD"); + return; + } + fp_get_inst_ext_props = (PFN_vkEnumerateInstanceExtensionProperties) fp_get_proc_addr(NULL, "vkEnumerateInstanceExtensionProperties"); + if (!fp_get_inst_ext_props) { + loader_log(inst, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0, "Couldn't get vkEnumerateInstanceExtensionProperties via vkGetInstanceProcAddr from ICD"); + return; + } // check for enough capacity if ((icd_libs->count * sizeof(struct loader_scanned_icds)) >= icd_libs->capacity) { @@ -1305,8 +1312,8 @@ static void loader_scanned_icd_add( new_node->handle = handle; new_node->api_version = api_version; new_node->GetInstanceProcAddr = fp_get_proc_addr; + new_node->EnumerateInstanceExtensionProperties = fp_get_inst_ext_props; new_node->CreateInstance = fp_create_inst; - new_node->EnumerateInstanceExtensionProperties = fp_get_global_ext_props; new_node->lib_name = (char *) loader_heap_alloc(inst, strlen(filename) + 1, |
