diff options
| -rw-r--r-- | layers/linux/multi.json | 10 | ||||
| -rw-r--r-- | layers/windows/multi.json | 10 | ||||
| -rw-r--r-- | 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, |
