aboutsummaryrefslogtreecommitdiff
path: root/loader
diff options
context:
space:
mode:
authorJon Ashburn <jon@lunarg.com>2015-09-09 11:29:24 -0600
committerJon Ashburn <jon@lunarg.com>2015-09-09 16:17:33 -0600
commitffc7cb965ba1b1f7ea618aeb6ca4eecacd99b479 (patch)
tree2bed86a952aabf62bf64a7aacf52b81272c96029 /loader
parentc9a1f1baa667eeb1de8bed90017834fb7faf5ca5 (diff)
downloadusermoji-ffc7cb965ba1b1f7ea618aeb6ca4eecacd99b479.tar.xz
loader: Use GetProcAddr function names from layer manifest file
No longer assume vkGetInstanceProcAddr or <layerName>GetInstanceProcAddr to find layer's instance GetProcAddrs. And similiar for device ProcAddr. Instead use any value specified in manifest file. If none specified in manifest file then assume vkGetInstanceProcAddr or vkGetDeviceProcAddr.
Diffstat (limited to 'loader')
-rw-r--r--loader/loader.c57
1 files changed, 33 insertions, 24 deletions
diff --git a/loader/loader.c b/loader/loader.c
index 18a4a2a7..0b7d1ba6 100644
--- a/loader/loader.c
+++ b/loader/loader.c
@@ -1516,23 +1516,26 @@ static void loader_add_layer_properties(const struct loader_instance *inst,
}
#define GET_JSON_ITEM(node, var) { \
item = cJSON_GetObjectItem(node, #var); \
- if (item != NULL) \
+ if (item != NULL) { \
temp = cJSON_Print(item); \
- temp[strlen(temp) - 1] = '\0'; \
- var = loader_stack_alloc(strlen(temp) + 1); \
- strcpy(var, &temp[1]); \
- loader_tls_heap_free(temp); \
+ temp[strlen(temp) - 1] = '\0'; \
+ var = loader_stack_alloc(strlen(temp) + 1);\
+ strcpy(var, &temp[1]); \
+ loader_tls_heap_free(temp); \
+ } \
}
cJSON *instance_extensions, *device_extensions, *functions, *enable_environment;
- char *vkGetInstanceProcAddr, *vkGetDeviceProcAddr, *version;
+ char *vkGetInstanceProcAddr = NULL, *vkGetDeviceProcAddr = NULL, *version;
GET_JSON_OBJECT(layer_node, functions)
if (functions != NULL) {
GET_JSON_ITEM(functions, vkGetInstanceProcAddr)
GET_JSON_ITEM(functions, vkGetDeviceProcAddr)
- strncpy(props->functions.str_gipa, vkGetInstanceProcAddr, sizeof (props->functions.str_gipa));
+ if (vkGetInstanceProcAddr != NULL)
+ strncpy(props->functions.str_gipa, vkGetInstanceProcAddr, sizeof (props->functions.str_gipa));
props->functions.str_gipa[sizeof (props->functions.str_gipa) - 1] = '\0';
- strncpy(props->functions.str_gdpa, vkGetDeviceProcAddr, sizeof (props->functions.str_gdpa));
+ if (vkGetDeviceProcAddr != NULL)
+ strncpy(props->functions.str_gdpa, vkGetDeviceProcAddr, sizeof (props->functions.str_gdpa));
props->functions.str_gdpa[sizeof (props->functions.str_gdpa) - 1] = '\0';
}
GET_JSON_OBJECT(layer_node, instance_extensions)
@@ -2273,16 +2276,19 @@ uint32_t loader_activate_instance_layers(struct loader_instance *inst)
nextInstObj->nextObject = nextObj;
nextObj = (void*) nextInstObj;
- char funcStr[256];
- snprintf(funcStr, 256, "%sGetInstanceProcAddr", layer_prop->info.layerName);
lib_handle = loader_add_layer_lib(inst, "instance", layer_prop);
- if ((nextGPA = (PFN_vkGetInstanceProcAddr) loader_platform_get_proc_address(lib_handle, funcStr)) == NULL)
- nextGPA = (PFN_vkGetInstanceProcAddr) loader_platform_get_proc_address(lib_handle, "vkGetInstanceProcAddr");
- if (!nextGPA) {
- loader_log(VK_DBG_REPORT_ERROR_BIT, 0, "Failed to find vkGetInstanceProcAddr in layer %s", layer_prop->lib_name);
-
- /* TODO: Should we return nextObj, nextGPA to previous? or decrement layer_list count*/
- continue;
+ if ((nextGPA = layer_prop->functions.get_instance_proc_addr) == NULL) {
+ if (layer_prop->functions.str_gipa == NULL || strlen(layer_prop->functions.str_gipa) == 0) {
+ nextGPA = (PFN_vkGetInstanceProcAddr) loader_platform_get_proc_address(lib_handle, "vkGetInstanceProcAddr");
+ layer_prop->functions.get_instance_proc_addr = nextGPA;
+ } else
+ nextGPA = (PFN_vkGetInstanceProcAddr) loader_platform_get_proc_address(lib_handle, layer_prop->functions.str_gipa);
+ if (!nextGPA) {
+ loader_log(VK_DBG_REPORT_ERROR_BIT, 0, "Failed to find vkGetInstanceProcAddr in layer %s", layer_prop->lib_name);
+
+ /* TODO: Should we return nextObj, nextGPA to previous? or decrement layer_list count*/
+ continue;
+ }
}
loader_log(VK_DBG_REPORT_INFO_BIT, 0,
@@ -2419,14 +2425,17 @@ static uint32_t loader_activate_device_layers(
nextGpuObj->nextObject = nextObj;
nextObj = (void*) nextGpuObj;
- char funcStr[256];
- snprintf(funcStr, 256, "%sGetDeviceProcAddr", layer_prop->info.layerName);
lib_handle = loader_add_layer_lib(inst, "device", layer_prop);
- if ((nextGPA = (PFN_vkGetDeviceProcAddr) loader_platform_get_proc_address(lib_handle, funcStr)) == NULL)
- nextGPA = (PFN_vkGetDeviceProcAddr) loader_platform_get_proc_address(lib_handle, "vkGetDeviceProcAddr");
- if (!nextGPA) {
- loader_log(VK_DBG_REPORT_ERROR_BIT, 0, "Failed to find vkGetDeviceProcAddr in layer %s", layer_prop->info.layerName);
- continue;
+ if ((nextGPA = layer_prop->functions.get_device_proc_addr) == NULL) {
+ if (layer_prop->functions.str_gdpa == NULL || strlen(layer_prop->functions.str_gdpa) == 0) {
+ nextGPA = (PFN_vkGetDeviceProcAddr) loader_platform_get_proc_address(lib_handle, "vkGetDeviceProcAddr");
+ layer_prop->functions.get_device_proc_addr = nextGPA;
+ } else
+ nextGPA = (PFN_vkGetDeviceProcAddr) loader_platform_get_proc_address(lib_handle, layer_prop->functions.str_gdpa);
+ if (!nextGPA) {
+ loader_log(VK_DBG_REPORT_ERROR_BIT, 0, "Failed to find vkGetDeviceProcAddr in layer %s", layer_prop->lib_name);
+ continue;
+ }
}
loader_log(VK_DBG_REPORT_INFO_BIT, 0,