diff options
| author | Jeremy Hayes <jeremy@lunarg.com> | 2016-04-01 11:40:26 -0600 |
|---|---|---|
| committer | Jeremy Hayes <jeremy@lunarg.com> | 2016-04-01 14:45:32 -0600 |
| commit | e26f199d098d1ee2ab2418d4ba259d564fbde4d8 (patch) | |
| tree | d11e17c37bc75f9d43ab30c70edf921ab087f7c0 /loader | |
| parent | 3a0eb0b42748d56a4f8598cd6949e50881abc73c (diff) | |
| download | usermoji-e26f199d098d1ee2ab2418d4ba259d564fbde4d8.tar.xz | |
loader: report implicit instance extensions
GL74: vkEnumerateInstanceExtensionProperties should report implicit
instance extensions when pLayerName is NULL or an implicit layer name.
Change-Id: Iba7664a168e146c4b862468b6255cdc752cc8c77
Diffstat (limited to 'loader')
| -rw-r--r-- | loader/loader.c | 53 | ||||
| -rw-r--r-- | loader/loader.h | 3 | ||||
| -rw-r--r-- | loader/trampoline.c | 29 |
3 files changed, 75 insertions, 10 deletions
diff --git a/loader/loader.c b/loader/loader.c index ff793ea1..8fff9df0 100644 --- a/loader/loader.c +++ b/loader/loader.c @@ -2626,6 +2626,59 @@ void loader_layer_scan(const struct loader_instance *inst, loader_platform_thread_unlock_mutex(&loader_json_lock); } +void loader_implicit_layer_scan(const struct loader_instance *inst, + struct loader_layer_list *instance_layers, + struct loader_layer_list *device_layers) { + char *file_str; + struct loader_manifest_files manifest_files; + cJSON *json; + uint32_t i; + + // Pass NULL for environment variable override - implicit layers are not + // overridden by LAYERS_PATH_ENV + loader_get_manifest_files(inst, NULL, true, DEFAULT_VK_ILAYERS_INFO, + HOME_VK_ILAYERS_INFO, &manifest_files); + if (manifest_files.count == 0) { + return; + } + + /* cleanup any previously scanned libraries */ + loader_delete_layer_properties(inst, instance_layers); + loader_delete_layer_properties(inst, device_layers); + + loader_platform_thread_lock_mutex(&loader_json_lock); + + for (i = 0; i < manifest_files.count; i++) { + file_str = manifest_files.filename_list[i]; + if (file_str == NULL) { + continue; + } + + // parse file into JSON struct + json = loader_get_json(inst, file_str); + if (!json) { + continue; + } + + loader_add_layer_properties(inst, instance_layers, device_layers, + json, true, file_str); + + loader_heap_free(inst, file_str); + cJSON_Delete(json); + } + + if (manifest_files.count != 0) { + loader_heap_free(inst, manifest_files.filename_list); + } + + // add a meta layer for validation if the validation layers are all present + loader_add_layer_property_meta( + inst, sizeof(std_validation_names) / sizeof(std_validation_names[0]), + std_validation_names, instance_layers, device_layers); + + loader_platform_thread_unlock_mutex(&loader_json_lock); +} + static VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL loader_gpa_instance_internal(VkInstance inst, const char *pName) { if (!strcmp(pName, "vkGetInstanceProcAddr")) diff --git a/loader/loader.h b/loader/loader.h index 8a0d4cc8..84f4d6fe 100644 --- a/loader/loader.h +++ b/loader/loader.h @@ -498,6 +498,9 @@ void loader_icd_scan(const struct loader_instance *inst, void loader_layer_scan(const struct loader_instance *inst, struct loader_layer_list *instance_layers, struct loader_layer_list *device_layers); +void loader_implicit_layer_scan(const struct loader_instance *inst, + struct loader_layer_list *instance_layers, + struct loader_layer_list *device_layers); void loader_get_icd_loader_instance_extensions( const struct loader_instance *inst, struct loader_icd_libs *icd_libs, struct loader_extension_list *inst_exts); diff --git a/loader/trampoline.c b/loader/trampoline.c index 260fd340..d1c02f0e 100644 --- a/loader/trampoline.c +++ b/loader/trampoline.c @@ -137,21 +137,22 @@ vkEnumerateInstanceExtensionProperties(const char *pLayerName, /* get layer libraries if needed */ if (pLayerName && strlen(pLayerName) != 0) { - if (vk_string_validate(MaxLoaderStringLength, pLayerName) == + if (vk_string_validate(MaxLoaderStringLength, pLayerName) != VK_STRING_ERROR_NONE) { - loader_layer_scan(NULL, &instance_layers, NULL); - for (uint32_t i = 0; i < instance_layers.count; i++) { - struct loader_layer_properties *props = - &instance_layers.list[i]; - if (strcmp(props->info.layerName, pLayerName) == 0) { - global_ext_list = &props->instance_extension_list; - } - } - } else { assert(VK_FALSE && "vkEnumerateInstanceExtensionProperties: " "pLayerName is too long or is badly formed"); return VK_ERROR_EXTENSION_NOT_PRESENT; } + + loader_layer_scan(NULL, &instance_layers, NULL); + for (uint32_t i = 0; i < instance_layers.count; i++) { + struct loader_layer_properties *props = + &instance_layers.list[i]; + if (strcmp(props->info.layerName, pLayerName) == 0) { + global_ext_list = &props->instance_extension_list; + break; + } + } } else { /* Scan/discover all ICD libraries */ memset(&icd_libs, 0, sizeof(struct loader_icd_libs)); @@ -160,6 +161,14 @@ vkEnumerateInstanceExtensionProperties(const char *pLayerName, loader_get_icd_loader_instance_extensions(NULL, &icd_libs, &icd_extensions); loader_scanned_icd_clear(NULL, &icd_libs); + + // Append implicit layers. + loader_implicit_layer_scan(NULL, &instance_layers, NULL); + for (uint32_t i = 0; i < instance_layers.count; i++) { + struct loader_extension_list *ext_list = &instance_layers.list[i].instance_extension_list; + loader_add_to_ext_list(NULL, &icd_extensions, ext_list->count, ext_list->list); + } + global_ext_list = &icd_extensions; } |
