loader: Do not enumerate extensions from disabled implicit layers
authorJean-Francois Roy <jfroy@google.com>
Thu, 6 Jul 2017 21:10:13 +0000 (14:10 -0700)
committerLenny Komow <lenny@lunarg.com>
Mon, 17 Jul 2017 17:54:48 +0000 (11:54 -0600)
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".

loader/loader.c
loader/loader.h
loader/trampoline.c

index a3f4a59803b2dc463c60a2277ece055d239954d5..7d645d8d31b05e4915162b4d3c740f80a0fcbd11 100644 (file)
@@ -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) {
index 3a80657d9024d922b55485279fc16619c74d2722..43600f9387a921acd7aa1e09761b6d887bf40037 100644 (file)
@@ -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);
index 1d6105d95d105bf782a736d4559656907f2c5e14..367d3f18eeb0ca1b3b588ccfed78a290c2db3725 100644 (file)
@@ -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);
         }