From ffc7cb965ba1b1f7ea618aeb6ca4eecacd99b479 Mon Sep 17 00:00:00 2001 From: Jon Ashburn Date: Wed, 9 Sep 2015 11:29:24 -0600 Subject: loader: Use GetProcAddr function names from layer manifest file No longer assume vkGetInstanceProcAddr or 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. --- layers/linux/multi.json | 10 +++++++-- layers/windows/multi.json | 10 +++++++-- loader/loader.c | 57 +++++++++++++++++++++++++++-------------------- 3 files changed, 49 insertions(+), 28 deletions(-) diff --git a/layers/linux/multi.json b/layers/linux/multi.json index 25aef2f2..90fdf1d8 100644 --- a/layers/linux/multi.json +++ b/layers/linux/multi.json @@ -6,7 +6,10 @@ "library_path": "./libVKLayerMulti.so", "abi_versions": "1.0.0", "implementation_version": "1.1.0", - "description": "LunarG Sample multiple layer per library" + "description": "LunarG Sample multiple layer per library", + "functions" : { + "vkGetDeviceProcAddr" : "multi1GetDeviceProcAddr" + } }, "layer" : { "name": "multi2", @@ -14,6 +17,9 @@ "library_path": "./libVKLayerMulti.so", "abi_versions": "1.0.0", "implementation_version": "1.1.0", - "description": "LunarG Sample multiple layer per library" + "description": "LunarG Sample multiple layer per library", + "functions" : { + "vkGetInstanceProcAddr" : "multi2GetInstanceProcAddr" + } } } diff --git a/layers/windows/multi.json b/layers/windows/multi.json index 355c83b5..dd30334b 100644 --- a/layers/windows/multi.json +++ b/layers/windows/multi.json @@ -6,7 +6,10 @@ "library_path": ".\\VKLayerMulti.dll", "abi_versions": "1.0.0", "implementation_version": "1.1.0", - "description": "LunarG Sample multiple layer per library" + "description": "LunarG Sample multiple layer per library", + "functions" : { + "vkGetDeviceProcAddr" : "multi1GetDeviceProcAddr" + } }, "layer" : { "name": "multi2", @@ -14,6 +17,9 @@ "library_path": ".\\VKLayerMulti.dll", "abi_versions": "1.0.0", "implementation_version": "1.1.0", - "description": "LunarG Sample multiple layer per library" + "description": "LunarG Sample multiple layer per library", + "functions" : { + "vkGetInstanceProcAddr" : "multi2GetInstanceProcAddr" + } } } 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, -- cgit v1.2.3