aboutsummaryrefslogtreecommitdiff
path: root/loader
diff options
context:
space:
mode:
authorJeremy Hayes <jeremy@lunarg.com>2016-04-01 11:40:26 -0600
committerJeremy Hayes <jeremy@lunarg.com>2016-04-01 14:45:32 -0600
commite26f199d098d1ee2ab2418d4ba259d564fbde4d8 (patch)
treed11e17c37bc75f9d43ab30c70edf921ab087f7c0 /loader
parent3a0eb0b42748d56a4f8598cd6949e50881abc73c (diff)
downloadusermoji-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.c53
-rw-r--r--loader/loader.h3
-rw-r--r--loader/trampoline.c29
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;
}