loader: Use GetInstanceProcAddr rather than dlsym for most ICD entrypoints
Conflicts:
loader/loader.c
diff --git a/loader/loader.c b/loader/loader.c
index 834986f..98f579d 100644
--- a/loader/loader.c
+++ b/loader/loader.c
@@ -948,8 +948,7 @@
loader_platform_dl_handle handle;
PFN_vkCreateInstance fp_create_inst;
PFN_vkGetGlobalExtensionProperties fp_get_global_ext_props;
- PFN_vkGetPhysicalDeviceExtensionProperties fp_get_device_ext_props;
- PFN_vkGetDeviceProcAddr fp_get_proc_addr;
+ PFN_vkGetInstanceProcAddr fp_get_proc_addr;
struct loader_scanned_icds *new_node;
// Used to call: dlopen(filename, RTLD_LAZY);
@@ -959,7 +958,7 @@
return;
}
-#define LOOKUP(func_ptr, func) do { \
+#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(VK_DBG_REPORT_WARN_BIT, 0, loader_platform_get_proc_address_error("vk" #func)); \
@@ -967,11 +966,11 @@
} \
} while (0)
- LOOKUP(fp_create_inst, CreateInstance);
- LOOKUP(fp_get_global_ext_props, GetGlobalExtensionProperties);
- LOOKUP(fp_get_device_ext_props, GetPhysicalDeviceExtensionProperties);
- LOOKUP(fp_get_proc_addr, GetDeviceProcAddr);
-#undef LOOKUP
+ LOOKUP_LD(fp_get_proc_addr, GetInstanceProcAddr);
+ LOOKUP_LD(fp_create_inst, CreateInstance);
+ LOOKUP_LD(fp_get_global_ext_props, GetGlobalExtensionProperties);
+
+#undef LOOKUP_LD
new_node = (struct loader_scanned_icds *) malloc(sizeof(struct loader_scanned_icds)
+ strlen(filename) + 1);
@@ -981,6 +980,7 @@
}
new_node->handle = handle;
+ new_node->GetInstanceProcAddr = fp_get_proc_addr;
new_node->CreateInstance = fp_create_inst;
new_node->GetGlobalExtensionProperties = fp_get_global_ext_props;
loader_init_ext_list(&new_node->global_extension_list);
@@ -1057,42 +1057,41 @@
}
}
-static void loader_icd_init_entrys(struct loader_icd *icd,
- struct loader_scanned_icds *scanned_icds)
+static bool loader_icd_init_entrys(struct loader_icd *icd,
+ VkInstance inst,
+ const PFN_vkGetInstanceProcAddr fp_gipa)
{
/* initialize entrypoint function pointers */
- #define LOOKUP(func) do { \
- icd->func = (PFN_vk ##func) loader_platform_get_proc_address(scanned_icds->handle, "vk" #func); \
- if (!icd->func) { \
- loader_log(VK_DBG_REPORT_WARN_BIT, 0, loader_platform_get_proc_address_error("vk" #func)); \
- return; \
- } \
+ #define LOOKUP_GIPA(func, required) do { \
+ icd->func = (PFN_vk ##func) fp_gipa(inst, "vk" #func); \
+ if (!icd->func && required) { \
+ loader_log(VK_DBG_REPORT_WARN_BIT, 0, \
+ loader_platform_get_proc_address_error("vk" #func)); \
+ return false; \
+ } \
} while (0)
- /* could change this to use GetInstanceProcAddr in driver instead of dlsym */
- LOOKUP(GetDeviceProcAddr);
- LOOKUP(DestroyInstance);
- LOOKUP(EnumeratePhysicalDevices);
- LOOKUP(GetPhysicalDeviceFeatures);
- LOOKUP(GetPhysicalDeviceFormatProperties);
- LOOKUP(GetPhysicalDeviceLimits);
- LOOKUP(CreateDevice);
- LOOKUP(GetPhysicalDeviceProperties);
- LOOKUP(GetPhysicalDeviceMemoryProperties);
- LOOKUP(GetPhysicalDeviceQueueCount);
- LOOKUP(GetPhysicalDeviceQueueProperties);
- LOOKUP(GetPhysicalDeviceExtensionProperties);
- LOOKUP(GetPhysicalDeviceSparseImageFormatProperties);
- LOOKUP(DbgCreateMsgCallback);
- LOOKUP(DbgDestroyMsgCallback);
-#undef LOOKUP
+ LOOKUP_GIPA(GetDeviceProcAddr, true);
+ LOOKUP_GIPA(DestroyInstance, true);
+ LOOKUP_GIPA(EnumeratePhysicalDevices, true);
+ LOOKUP_GIPA(GetPhysicalDeviceFeatures, true);
+ LOOKUP_GIPA(GetPhysicalDeviceFormatProperties, true);
+ LOOKUP_GIPA(GetPhysicalDeviceLimits, true);
+ LOOKUP_GIPA(CreateDevice, true);
+ LOOKUP_GIPA(GetPhysicalDeviceProperties, true);
+ LOOKUP_GIPA(GetPhysicalDeviceMemoryProperties, true);
+ LOOKUP_GIPA(GetPhysicalDeviceQueueCount, true);
+ LOOKUP_GIPA(GetPhysicalDeviceQueueProperties, true);
+ LOOKUP_GIPA(GetPhysicalDeviceExtensionProperties, true);
+ LOOKUP_GIPA(GetPhysicalDeviceSparseImageFormatProperties, true);
+ LOOKUP_GIPA(DbgCreateMsgCallback, false);
+ LOOKUP_GIPA(DbgDestroyMsgCallback, false);
+ LOOKUP_GIPA(GetPhysicalDeviceSurfaceSupportWSI, false);
- icd->GetPhysicalDeviceSurfaceSupportWSI =
- (PFN_vkGetPhysicalDeviceSurfaceSupportWSI) loader_platform_get_proc_address(scanned_icds->handle,
- "vkGetPhysicalDeviceSurfaceSupportWSI");
+#undef LOOKUP_GIPA
- return;
+ return true;
}
static void loader_debug_init(void)
@@ -2387,6 +2386,7 @@
char **filtered_extension_names = NULL;
VkInstanceCreateInfo icd_create_info;
VkResult res = VK_SUCCESS;
+ bool success;
icd_create_info.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
icd_create_info.layerCount = 0;
@@ -2412,7 +2412,6 @@
while (scanned_icds) {
icd = loader_icd_add(ptr_instance, scanned_icds);
if (icd) {
-
icd_create_info.extensionCount = 0;
for (uint32_t i = 0; i < pCreateInfo->extensionCount; i++) {
prop = get_extension_property(pCreateInfo->ppEnabledExtensionNames[i],
@@ -2425,16 +2424,18 @@
res = scanned_icds->CreateInstance(&icd_create_info,
&(icd->instance));
- if (res != VK_SUCCESS)
+ success = loader_icd_init_entrys(
+ icd,
+ icd->instance,
+ scanned_icds->GetInstanceProcAddr);
+
+ if (res != VK_SUCCESS || !success)
{
ptr_instance->icds = ptr_instance->icds->next;
loader_icd_destroy(ptr_instance, icd);
icd->instance = VK_NULL_HANDLE;
- loader_log(VK_DBG_REPORT_WARN_BIT, 0,
- "ICD ignored: failed to CreateInstance on device");
- } else
- {
- loader_icd_init_entrys(icd, scanned_icds);
+ loader_log(VK_DBG_REPORT_ERROR_BIT, 0,
+ "ICD ignored: failed to CreateInstance and find entrypoints with ICD");
}
}
scanned_icds = scanned_icds->next;
diff --git a/loader/loader.h b/loader/loader.h
index 2bd6b3e..7f4d7ba 100644
--- a/loader/loader.h
+++ b/loader/loader.h
@@ -152,11 +152,10 @@
PFN_vkGetPhysicalDeviceQueueProperties GetPhysicalDeviceQueueProperties;
PFN_vkGetPhysicalDeviceMemoryProperties GetPhysicalDeviceMemoryProperties;
PFN_vkGetPhysicalDeviceExtensionProperties GetPhysicalDeviceExtensionProperties;
- PFN_vkGetPhysicalDeviceLayerProperties GetPhysicalDeviceLayerProperties;
PFN_vkGetPhysicalDeviceSparseImageFormatProperties GetPhysicalDeviceSparseImageFormatProperties;
- PFN_vkGetPhysicalDeviceSurfaceSupportWSI GetPhysicalDeviceSurfaceSupportWSI;
PFN_vkDbgCreateMsgCallback DbgCreateMsgCallback;
PFN_vkDbgDestroyMsgCallback DbgDestroyMsgCallback;
+ PFN_vkGetPhysicalDeviceSurfaceSupportWSI GetPhysicalDeviceSurfaceSupportWSI;
/*
* Fill in the cache of available layers that operate
@@ -277,12 +276,9 @@
char *lib_name;
loader_platform_dl_handle handle;
+ PFN_vkGetInstanceProcAddr GetInstanceProcAddr;
PFN_vkCreateInstance CreateInstance;
- PFN_vkDestroyInstance DestroyInstance;
- PFN_vkEnumeratePhysicalDevices EnumeratePhysicalDevices;
PFN_vkGetGlobalExtensionProperties GetGlobalExtensionProperties;
- PFN_vkGetGlobalLayerProperties GetGlobalLayerProperties;
- PFN_vkGetPhysicalDeviceLayerProperties GetPhysicalDeviceLayerProperties;
VkInstance instance;
struct loader_scanned_icds *next;