From 4e6f36945ac594bb08d3a2701316a5d4cbdf9af2 Mon Sep 17 00:00:00 2001 From: Courtney Goeltzenleuchter Date: Mon, 6 Jul 2015 17:42:01 -0600 Subject: loader: Filter extension list sent to ICD The loader needs to filter the ppEnabledExtensionNames list to only those supported by the ICD to prevent false failures. (i.e. extensions bound for layers rather than the ICD.) --- loader/loader.c | 58 ++++++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 43 insertions(+), 15 deletions(-) diff --git a/loader/loader.c b/loader/loader.c index 11657b81..62584ac0 100644 --- a/loader/loader.c +++ b/loader/loader.c @@ -958,15 +958,16 @@ static void loader_find_layer_name_add_list( } } -bool loader_is_extension_scanned(const VkExtensionProperties *ext_prop) +static struct loader_extension_property *get_extension_property( + const char *name, + const struct loader_extension_list *list) { - uint32_t i; - - for (i = 0; i < loader.global_extensions.count; i++) { - if (compare_vk_extension_properties(&loader.global_extensions.list[i].info, ext_prop)) - return true; + for (uint32_t i = 0; i < list->count; i++) { + const VkExtensionProperties *item = &list->list[i].info; + if (strcmp(name, item->extName) == 0) + return &list->list[i]; } - return false; + return NULL; } /* @@ -2233,20 +2234,47 @@ VkResult loader_CreateInstance( struct loader_instance *ptr_instance = *(struct loader_instance **) pInstance; struct loader_scanned_icds *scanned_icds; struct loader_icd *icd; + struct loader_extension_property *prop; + char **filtered_extension_names = NULL; + VkInstanceCreateInfo icd_create_info; VkResult res = VK_SUCCESS; + icd_create_info.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO; + icd_create_info.layerCount = 0; + icd_create_info.ppEnabledLayerNames = NULL; + icd_create_info.pAllocCb = pCreateInfo->pAllocCb; + icd_create_info.pAppInfo = pCreateInfo->pAppInfo; + icd_create_info.pNext = pCreateInfo->pNext; + + /* + * NOTE: Need to filter the extensions to only those + * supported by the ICD are in the pCreateInfo structure. + * No ICD will advertise support for layers. An ICD + * library could support a layer, but it would be + * independent of the actual ICD, just in the same library. + */ + filtered_extension_names = loader_stack_alloc(pCreateInfo->extensionCount * sizeof(char *)); + if (!filtered_extension_names) { + return VK_ERROR_OUT_OF_HOST_MEMORY; + } + icd_create_info.ppEnabledExtensionNames = (const char * const *) filtered_extension_names; + scanned_icds = loader.scanned_icd_list; while (scanned_icds) { icd = loader_icd_add(ptr_instance, scanned_icds); if (icd) { - /* - * NOTE: Need to filter the extensions to only those - * supported by the ICD are in the pCreateInfo structure. - * No ICD will advertise support for layers. An ICD - * library could support a layer, but it would be - * indenpendent of the actual ICD, just in the same library. - */ - res = scanned_icds->CreateInstance(pCreateInfo, + + icd_create_info.extensionCount = 0; + for (uint32_t i = 0; i < pCreateInfo->extensionCount; i++) { + prop = get_extension_property(pCreateInfo->ppEnabledExtensionNames[i], + &scanned_icds->global_extension_list); + if (prop) { + filtered_extension_names[icd_create_info.extensionCount] = (char *) pCreateInfo->ppEnabledExtensionNames[i]; + icd_create_info.extensionCount++; + } + } + + res = scanned_icds->CreateInstance(&icd_create_info, &(icd->instance)); if (res != VK_SUCCESS) { -- cgit v1.2.3