aboutsummaryrefslogtreecommitdiff
path: root/loader
diff options
context:
space:
mode:
authorJean-Francois Roy <jfroy@google.com>2017-07-06 14:10:13 -0700
committerLenny Komow <lenny@lunarg.com>2017-07-17 11:54:48 -0600
commit0b7ab68bb82ea61ccc49e5e7a0e67b25f27c3b34 (patch)
tree208e15c5b904a47df239242d056072e1a6adec36 /loader
parent901fee470c68aa2e0a3a54706481ee0c40d80d52 (diff)
downloadusermoji-0b7ab68bb82ea61ccc49e5e7a0e67b25f27c3b34.tar.xz
loader: Do not enumerate extensions from disabled implicit layers
This patch adds a check to vkEnumerateInstanceExtensionProperties to omit extensions provided by disabled implicit layers. Per section 31.2 (1.0.51), "When pLayerName parameter is NULL, only extensions provided by the Vulkan implementation or by implicitly enabled layers are returned." Arguably, implicit layers that have been disabled are not "implicitly enabled".
Diffstat (limited to 'loader')
-rw-r--r--loader/loader.c48
-rw-r--r--loader/loader.h1
-rw-r--r--loader/trampoline.c5
3 files changed, 31 insertions, 23 deletions
diff --git a/loader/loader.c b/loader/loader.c
index a3f4a598..7d645d8d 100644
--- a/loader/loader.c
+++ b/loader/loader.c
@@ -1077,28 +1077,7 @@ VkResult loader_add_to_layer_list(const struct loader_instance *inst, struct loa
static void loader_add_implicit_layer(const struct loader_instance *inst, const struct loader_layer_properties *prop,
struct loader_layer_list *target_list, struct loader_layer_list *expanded_target_list,
const struct loader_layer_list *source_list) {
- bool enable = false;
- char *env_value = NULL;
-
- // if no enable_environment variable is specified, this implicit layer
- // should always be enabled. Otherwise check if the variable is set
- if (prop->enable_env_var.name[0] == 0) {
- enable = true;
- } else {
- env_value = loader_secure_getenv(prop->enable_env_var.name, inst);
- if (env_value && !strcmp(prop->enable_env_var.value, env_value)) enable = true;
- loader_free_getenv(env_value, inst);
- }
-
- // disable_environment has priority, i.e. if both enable and disable
- // environment variables are set, the layer is disabled. Implicit
- // layers are required to have a disable_environment variables
- env_value = loader_secure_getenv(prop->disable_env_var.name, inst);
- if (env_value) {
- enable = false;
- }
- loader_free_getenv(env_value, inst);
-
+ bool enable = loader_is_implicit_layer_enabled(inst, prop);
if (enable) {
// If not a meta-layer, simply add it.
if (0 == (prop->type_flags & VK_LAYER_TYPE_FLAG_META_LAYER)) {
@@ -3402,6 +3381,31 @@ void loader_implicit_layer_scan(const struct loader_instance *inst, struct loade
loader_platform_thread_unlock_mutex(&loader_json_lock);
}
+// Check if an implicit layer should be enabled.
+bool loader_is_implicit_layer_enabled(const struct loader_instance *inst, const struct loader_layer_properties *prop) {
+ bool enable = false;
+ char *env_value = NULL;
+
+ // if no enable_environment variable is specified, this implicit layer
+ // should always be enabled. Otherwise check if the variable is set
+ if (prop->enable_env_var.name[0] == 0) {
+ enable = true;
+ } else {
+ env_value = loader_secure_getenv(prop->enable_env_var.name, inst);
+ if (env_value && !strcmp(prop->enable_env_var.value, env_value)) enable = true;
+ loader_free_getenv(env_value, inst);
+ }
+
+ // disable_environment has priority, i.e. if both enable and disable
+ // environment variables are set, the layer is disabled. Implicit
+ // layers are required to have a disable_environment variables
+ env_value = loader_secure_getenv(prop->disable_env_var.name, inst);
+ if (env_value && !strcmp(prop->disable_env_var.value, env_value)) enable = false;
+ loader_free_getenv(env_value, inst);
+
+ return enable;
+}
+
static VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL loader_gpdpa_instance_internal(VkInstance inst, const char *pName) {
// inst is not wrapped
if (inst == VK_NULL_HANDLE) {
diff --git a/loader/loader.h b/loader/loader.h
index 3a80657d..43600f93 100644
--- a/loader/loader.h
+++ b/loader/loader.h
@@ -437,6 +437,7 @@ void loader_scanned_icd_clear(const struct loader_instance *inst, struct loader_
VkResult loader_icd_scan(const struct loader_instance *inst, struct loader_icd_tramp_list *icd_tramp_list);
void loader_layer_scan(const struct loader_instance *inst, struct loader_layer_list *instance_layers);
void loader_implicit_layer_scan(const struct loader_instance *inst, struct loader_layer_list *instance_layers);
+bool loader_is_implicit_layer_enabled(const struct loader_instance *inst, const struct loader_layer_properties *prop);
VkResult loader_get_icd_loader_instance_extensions(const struct loader_instance *inst, struct loader_icd_tramp_list *icd_tramp_list,
struct loader_extension_list *inst_exts);
struct loader_icd_term *loader_get_icd_and_device(const VkDevice device, struct loader_device **found_dev, uint32_t *icd_index);
diff --git a/loader/trampoline.c b/loader/trampoline.c
index 1d6105d9..367d3f18 100644
--- a/loader/trampoline.c
+++ b/loader/trampoline.c
@@ -143,9 +143,12 @@ LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceExtensionPropert
}
loader_scanned_icd_clear(NULL, &icd_tramp_list);
- // Append implicit layers.
+ // Append enabled implicit layers.
loader_implicit_layer_scan(NULL, &instance_layers);
for (uint32_t i = 0; i < instance_layers.count; i++) {
+ if (!loader_is_implicit_layer_enabled(NULL, &instance_layers.list[i])) {
+ continue;
+ }
struct loader_extension_list *ext_list = &instance_layers.list[i].instance_extension_list;
loader_add_to_ext_list(NULL, &local_ext_list, ext_list->count, ext_list->list);
}