aboutsummaryrefslogtreecommitdiff
path: root/loader/loader.c
diff options
context:
space:
mode:
authorJon Ashburn <jon@lunarg.com>2016-01-07 09:44:27 -0700
committerJon Ashburn <jon@lunarg.com>2016-01-07 10:06:00 -0700
commit05fd7eacb0983a069c79d8c0ab80a0d30dfd8c25 (patch)
tree58d7e0e0e00bcbdb7e60a0bf44d3f3c42ff351cd /loader/loader.c
parentb747f683985481598983d9bb5d5b0b8e7197a41b (diff)
downloadusermoji-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.c37
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,