diff --git a/docs/LoaderApplicationInterface.md b/docs/LoaderApplicationInterface.md index c05f2f46b..22a8681f5 100644 --- a/docs/LoaderApplicationInterface.md +++ b/docs/LoaderApplicationInterface.md @@ -28,7 +28,6 @@ - [MacOs Dynamic Library Usage](#macos-dynamic-library-usage) - [Bundling the Loader With An Application](#bundling-the-loader-with-an-application) - [Application Layer Usage](#application-layer-usage) - - [Meta-Layers](#meta-layers) - [Implicit vs Explicit Layers](#implicit-vs-explicit-layers) - [Override Layer](#override-layer) - [Forcing Layer Source Folders](#forcing-layer-source-folders) @@ -359,28 +358,6 @@ information on layer ordering. > * The `vkEnumerateDeviceLayerProperties` function -### Meta-Layers - -Meta-layers are layers which contain an ordered list of other layers to enable. -This is to allow grouping layers together in a specified order so that they can -interact properly. -Originally, this was used to group together the individual Vulkan Validation -layers in the proper order to avoid conflicts. -It was necessary because instead of a single Validation layer, validation was -split into multiple component layers. -The new `VK_LAYER_KHRONOS_validation` layer pulled everything into a single -layer, dropping the need for meta layers. -While not necessary for validation anymore, VkConfig does use meta layers to -group layers together based on user's preferences. -More can be found out about this functionality through both the -[VkConfig documentation](https://github.com/LunarG/VulkanTools/blob/main/vkconfig/README.md) -and the section later on the [Override Layer](#override-layer). - -Meta-layers are detailed more in the -[Meta-Layers](LoaderLayerInterface.md#meta-layers) section of the -[LoaderLayerInterface.md](LoaderLayerInterface.md) file in this folder. - - ### Implicit vs Explicit Layers ![Different Types of Layers](./images/loader_layer_order.png) diff --git a/docs/LoaderInterfaceArchitecture.md b/docs/LoaderInterfaceArchitecture.md index e90e8b104..d6c74baa2 100644 --- a/docs/LoaderInterfaceArchitecture.md +++ b/docs/LoaderInterfaceArchitecture.md @@ -168,68 +168,8 @@ VkConfig can be found by either installing the [Vulkan SDK](https://vulkan.lunarg.com/) or by building the source out of the [LunarG VulkanTools GitHub Repo](https://github.com/LunarG/VulkanTools). -VkConfig generates three outputs, two of which work with the Vulkan loader and -layers. -These outputs are: - * The Vulkan Override Layer - * The Vulkan Layer Settings File - * VkConfig Configuration Settings - -These files are found in different locations based on your platform: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
PlatformOutputLocation
LinuxVulkan Override Layer$USER/.local/share/vulkan/implicit_layer.d/VkLayer_override.json
Vulkan Layer Settings$USER/.local/share/vulkan/settings.d/vk_layer_settings.txt
VkConfig Configuration Settings$USER/.local/share/vulkan/settings.d/vk_layer_settings.txt
WindowsVulkan Override Layer%HOME%\AppData\Local\LunarG\vkconfig\override\VkLayerOverride.json
Vulkan Layer Settings(registry) HKEY_CURRENT_USER\Software\Khronos\Vulkan\LoaderSettings
VkConfig Configuration Settings(registry) HKEY_CURRENT_USER\Software\LunarG\vkconfig
- -The [Override Meta-Layer](./LoaderLayerInterface.md#override-meta-layer) is -an important part of how VkConfig works. -This layer, when found by the loader, forces the loading of the desired layers -that were enabled inside of VkConfig as well as disables those layers that -were intentionally disabled (including implicit layers). - -The Vulkan Layer Settings file can be used to specify certain behaviors and -actions each enabled layer is expected to perform. -These settings can also be controlled by VkConfig, or they can be manually -enabled. -For details on what settings can be used, refer to the individual layers. - -In the future, VkConfig may have additional interactions with the Vulkan -loader. - More details on VkConfig can be found in its [GitHub documentation](https://github.com/LunarG/VulkanTools/blob/main/vkconfig/README.md). -
-
## Important Vulkan Concepts diff --git a/docs/LoaderLayerInterface.md b/docs/LoaderLayerInterface.md index 4e0fdb08a..526a04323 100644 --- a/docs/LoaderLayerInterface.md +++ b/docs/LoaderLayerInterface.md @@ -44,8 +44,7 @@ - [Layer Dispatch Initialization](#layer-dispatch-initialization) - [Example Code for CreateInstance](#example-code-for-createinstance) - [Example Code for CreateDevice](#example-code-for-createdevice) -- [Meta-layers](#meta-layers) - - [Override Meta-Layer](#override-meta-layer) +- [Meta-layers - REMOVED](#meta-layers---removed) - [Pre-Instance Functions](#pre-instance-functions) - [Special Considerations](#special-considerations) - [Associating Private Data with Vulkan Objects Within a Layer](#associating-private-data-with-vulkan-objects-within-a-layer) @@ -56,6 +55,7 @@ - [Versioning and Activation Interactions](#versioning-and-activation-interactions) - [Layer Manifest File Format](#layer-manifest-file-format) - [Layer Manifest File Version History](#layer-manifest-file-version-history) + - [Layer Manifest File Version 1.2.2](#layer-manifest-file-version-122) - [Layer Manifest File Version 1.2.1](#layer-manifest-file-version-121) - [Layer Manifest File Version 1.2.0](#layer-manifest-file-version-120) - [Layer Manifest File Version 1.1.2](#layer-manifest-file-version-112) @@ -1170,92 +1170,19 @@ In practice, this would be done by any method a layer chooses to get an instance handle from the physical device. -## Meta-layers - -Meta-layers are a special kind of layer which is only available through the -Khronos loader. -While normal layers are associated with one particular library, a meta-layer -is actually a collection layer which contains an ordered list of other layers -(called component layers). - -The benefits of a meta-layer are: - 1. More than one layer may be activated using a single layer name by simply -grouping multiple layers in a meta-layer. - 2. The order of individual component layers is loaded can be defined within -the meta-layer. - 3. Layer configurations (internal to the meta-layer manifest file) can easily -be shared with others. - 4. The loader will automatically collate all instance and device extensions in -a meta-layer's component layers, and report them as the meta-layer's properties -to the application when queried. - -Restrictions to defining and using a meta-layer are: - 1. A Meta-layer Manifest file **must** be a properly formatted that contains -one or more component layers. - 3. All component layers **must be** present on a system for the meta-layer to -be used. - 4. All component layers **must be** at the same Vulkan API major and minor -version as the meta-layer for the meta-layer to be used. - -The ordering of a meta-layer's component layers in the instance or device call- -chain is simple: - * The first layer listed will be the layer closest to the application. - * The last layer listed will be the layer closest to the drivers. - -Inside the meta-layer Manifest file, each component layer is listed by its -layer name. -This is the "name" tag's value associated with each component layer's Manifest -file under the "layer" or "layers" tag. -This is also the name that would normally be used when activating a layer -during `vkCreateInstance`. - -Any duplicate layer names in either the component layer list, or globally among -all enabled layers, will simply be ignored by the loader. -Only the first instance of any layer name will be used. - -For example, if a layer is enabled using the environment variable -`VK_INSTANCE_LAYERS` and have that same layer listed in a meta-layer, then the -environment-variable-enabled layer will be used and the component layer will -be dropped. -Likewise, if a person were to enable a meta-layer and then separately enable -one of the component layers afterwards, the second instantiation of the layer -name would be ignored. - -The Manifest file formatting necessary to define a meta-layer can be found in -the [Layer Manifest File Format](#layer-manifest-file-format) section. - -### Override Meta-Layer - -If an implicit meta-layer was found on the system with the name -`VK_LAYER_LUNARG_override`, the loader uses it as an 'override' layer. -This is used to selectively enable and disable other layers from being loaded. -It can be applied globally or to a specific application or applications. -The override meta layer can have the following additional keys: - * `blacklisted_layers` - List of explicit layer names that should not be -loaded even if requested by the application. - * `app_keys` - List of paths to executables that the override layer applies -to. - * `override_paths` - List of paths which will be used as the search location -for component layers. - -When an application starts up and the override layer is present, the loader -first checks to see if the application is in the list. -If it isn't, the override layer is not applied. -If the list is empty or if `app_keys` doesn't exist, the loader makes the -override layer global and applies it to every application upon startup. - -If the override layer contains `override_paths`, then it uses this list of -paths exclusively for component layers. -Thus, it ignores both the default explicit and implicit layer layer search -locations as well as paths set by environment variables like `VK_LAYER_PATH`. -If any component layer is not present in the provided override paths, the meta -layer is disabled. - -The override meta-layer is primarily enabled when using the -[VkConfig](https://github.com/LunarG/VulkanTools/blob/main/vkconfig/README.md) -tool included in the Vulkan SDK. -It is typically only available while the VkConfig tool is actually executing. -Please refer to that documentation for more information. +## Meta-layers - REMOVED + +Meta-layers have been removed from the Khronos Loader. +Their function was to allow enabling a group of layers in a particular +order, but the were functionally replaced by the Vulkan Loader Settings file. + +See [LoaderSettingsFile.md](LoaderSettingsFile.md) for more details. + +The *Override Meta-Layer* was a special meta layer that was utilized by +VkConfig to provide additional controls over which layers were enabled, +which weren't allowed to be enabled, and custom paths to load layers from. +The Loader Settings File replaced the functionality that the *Override* +*Meta-Layer* provided, so was removed to eliminate duplicate functionality. ## Pre-Instance Functions @@ -1570,42 +1497,12 @@ newer API versions. Thus, the disabling caused confusion for users but didn't protect them from potentially badly behaving layers. -* An implicit layer will ignore its disable environment variable being set if -it is a component in an active meta layer. - * The environment `VK_LAYER_PATH` only affects explicit layer searching, not implicit. Layers found in this path are treated as explicit, even if they contain all the requisite fields to be an implicit layer. This means they will not be implicitly enabled. -* Meta layers do not have to be implicit - they can be explicit. -It cannot be assumed that because a meta layer is present that it will be active. - -* The `blacklisted_layers` member of the override meta layer will prevent both -implicitly enabled and explicitely enabled layers from activating. -Any layers in an application's `VkInstanceCreateInfo::ppEnabledLayerNames` that -are in the blacklist will not be enabled. - -* The `app_keys` member of the override meta layer will make a meta layer apply -to only applications found in this list. -If there are any items in the app keys list, the meta layer isn't enabled for -any application except those found in the list. - -* The `override_paths` member of the override meta layer, if present, will -replace the search paths the loader uses to find component layers. -If any component layer isn't present in the override paths, the override meta -layer is not applied. -So if an override meta layer wants to mix default and custom layer locations, -the override paths must contain both custom and default layer locations. - -* If the override layer is both present and contains `override_paths`, the -paths from the environment variable `VK_LAYER_PATH` are ignored when searching -for explicit layers. -For example, when both the meta layer override paths and `VK_LAYER_PATH` are -present, none of the layers in `VK_LAYER_PATH` are discoverable, and the -loader will not find them. - ## Layer Manifest File Format @@ -1685,24 +1582,6 @@ manifest file: } ``` -Here's an example of a meta-layer manifest file: -```json -{ - "file_format_version" : "1.1.1", - "layer": { - "name": "VK_LAYER_META_layer", - "type": "GLOBAL", - "api_version" : "1.0.40", - "implementation_version" : "1", - "description" : "LunarG Meta-layer example", - "component_layers": [ - "VK_LAYER_KHRONOS_validation", - "VK_LAYER_LUNARG_api_dump" - ] - } -} -``` - @@ -1727,41 +1606,6 @@ Here's an example of a meta-layer manifest file: - - - - - - - - - - - - - - - - - - - - - - - - @@ -1895,7 +1739,7 @@ Here's an example of a meta-layer manifest file: - - + - + @@ -1933,16 +1776,6 @@ Here's an example of a meta-layer manifest file: - - - - - - - - - @@ -2322,7 +2165,7 @@ Android Vulkan documentation. - @@ -2716,7 +2559,7 @@ Android Vulkan documentation. - - @@ -2741,7 +2584,7 @@ Android Vulkan documentation. - diff --git a/loader/loader.c b/loader/loader.c index e77091554..96081bcef 100644 --- a/loader/loader.c +++ b/loader/loader.c @@ -157,8 +157,6 @@ const char *get_enabled_by_what_str(enum loader_layer_enabled_by_what enabled_by return "Environment Variable VK_LOADER_LAYERS_ENABLE"; case ENABLED_BY_WHAT_IN_APPLICATION_API: return "By the Application"; - case ENABLED_BY_WHAT_META_LAYER: - return "Meta Layer (Vulkan Configurator)"; } } @@ -257,13 +255,9 @@ void loader_free_layer_properties(const struct loader_instance *inst, struct loa loader_instance_heap_free(inst, layer_properties->disable_env_var.value); loader_instance_heap_free(inst, layer_properties->enable_env_var.name); loader_instance_heap_free(inst, layer_properties->enable_env_var.value); - free_string_list(inst, &layer_properties->component_layer_names); loader_instance_heap_free(inst, layer_properties->pre_instance_functions.enumerate_instance_extension_properties); loader_instance_heap_free(inst, layer_properties->pre_instance_functions.enumerate_instance_layer_properties); loader_instance_heap_free(inst, layer_properties->pre_instance_functions.enumerate_instance_version); - free_string_list(inst, &layer_properties->override_paths); - free_string_list(inst, &layer_properties->blacklist_layer_names); - free_string_list(inst, &layer_properties->app_key_paths); // Make sure to clear out the removed layer, in case new layers are added in the previous location memset(layer_properties, 0, sizeof(struct loader_layer_properties)); @@ -843,16 +837,6 @@ bool loader_find_layer_name_in_list(const char *name, const struct loader_pointe return false; } -// Search the override layer's blacklist for a layer matching the given layer name -bool loader_find_layer_name_in_blacklist(const char *layer_name, struct loader_layer_properties *meta_layer_props) { - for (uint32_t black_layer = 0; black_layer < meta_layer_props->blacklist_layer_names.count; ++black_layer) { - if (!strcmp(meta_layer_props->blacklist_layer_names.list[black_layer], layer_name)) { - return true; - } - } - return false; -} - // Remove all layer properties entries from the list TEST_FUNCTION_EXPORT void loader_delete_layer_list_and_properties(const struct loader_instance *inst, struct loader_layer_list *layer_list) { @@ -884,8 +868,7 @@ void loader_remove_layer_in_list(const struct loader_instance *inst, struct load } loader_free_layer_properties(inst, &(layer_list->list[layer_to_remove])); - // Remove the current invalid meta-layer from the layer list. Use memmove since we are - // overlapping the source and destination addresses. + // Remove the layer from the layer list. Use memmove since we are overlapping the source and destination addresses. if (layer_to_remove + 1 <= layer_list->count) { memmove(&layer_list->list[layer_to_remove], &layer_list->list[layer_to_remove + 1], sizeof(struct loader_layer_properties) * (layer_list->count - 1 - layer_to_remove)); @@ -895,89 +878,6 @@ void loader_remove_layer_in_list(const struct loader_instance *inst, struct load layer_list->count--; } -// Remove all layers in the layer list that are blacklisted by the override layer. -// NOTE: This should only be called if an override layer is found and not expired. -void loader_remove_layers_in_blacklist(const struct loader_instance *inst, struct loader_layer_list *layer_list) { - struct loader_layer_properties *override_prop = loader_find_layer_property(VK_OVERRIDE_LAYER_NAME, layer_list); - if (NULL == override_prop) { - return; - } - - for (int32_t j = 0; j < (int32_t)(layer_list->count); j++) { - struct loader_layer_properties cur_layer_prop = layer_list->list[j]; - const char *cur_layer_name = &cur_layer_prop.info.layerName[0]; - - // Skip the override layer itself. - if (!strcmp(VK_OVERRIDE_LAYER_NAME, cur_layer_name)) { - continue; - } - - // If found in the override layer's blacklist, remove it - if (loader_find_layer_name_in_blacklist(cur_layer_name, override_prop)) { - loader_log(inst, VULKAN_LOADER_DEBUG_BIT, 0, - "loader_remove_layers_in_blacklist: Override layer is active and layer %s is in the blacklist inside of it. " - "Removing that layer from current layer list.", - cur_layer_name); - loader_remove_layer_in_list(inst, layer_list, j); - j--; - - // Re-do the query for the override layer - override_prop = loader_find_layer_property(VK_OVERRIDE_LAYER_NAME, layer_list); - } - } -} - -// Remove all layers in the layer list that are not found inside any implicit meta-layers. -void loader_remove_layers_not_in_implicit_meta_layers(const struct loader_instance *inst, struct loader_layer_list *layer_list) { - int32_t i; - int32_t j; - int32_t layer_count = (int32_t)(layer_list->count); - - for (i = 0; i < layer_count; i++) { - layer_list->list[i].keep = false; - } - - for (i = 0; i < layer_count; i++) { - struct loader_layer_properties *cur_layer_prop = &layer_list->list[i]; - - if (0 == (cur_layer_prop->type_flags & VK_LAYER_TYPE_FLAG_EXPLICIT_LAYER)) { - cur_layer_prop->keep = true; - continue; - } - for (j = 0; j < layer_count; j++) { - struct loader_layer_properties *layer_to_check = &layer_list->list[j]; - - if (i == j) { - continue; - } - - if (layer_to_check->type_flags & VK_LAYER_TYPE_FLAG_META_LAYER) { - // For all layers found in this meta layer, we want to keep them as well. - for (uint32_t comp_layer = 0; comp_layer < layer_to_check->component_layer_names.count; comp_layer++) { - if (!strcmp(layer_to_check->component_layer_names.list[comp_layer], cur_layer_prop->info.layerName)) { - cur_layer_prop->keep = true; - } - } - } - } - } - - // Remove any layers we don't want to keep (Don't use layer_count here as we need it to be - // dynamically updated if we delete a layer property in the list). - for (i = 0; i < (int32_t)(layer_list->count); i++) { - struct loader_layer_properties *cur_layer_prop = &layer_list->list[i]; - if (!cur_layer_prop->keep) { - loader_log( - inst, VULKAN_LOADER_DEBUG_BIT, 0, - "loader_remove_layers_not_in_implicit_meta_layers : Implicit meta-layers are active, and layer %s is not list " - "inside of any. So removing layer from current layer list.", - cur_layer_prop->info.layerName); - loader_remove_layer_in_list(inst, layer_list, i); - i--; - } - } -} - VkResult loader_add_instance_extensions(const struct loader_instance *inst, const PFN_vkEnumerateInstanceExtensionProperties fp_get_props, const char *lib_name, struct loader_extension_list *ext_list) { @@ -1372,15 +1272,9 @@ VkResult loader_add_layer_names_to_list(struct loader_instance *inst, const stru continue; } - // If not a meta-layer, simply add it. - if (0 == (layer_prop->type_flags & VK_LAYER_TYPE_FLAG_META_LAYER)) { - layer_prop->enabled_by_what = ENABLED_BY_WHAT_IN_APPLICATION_API; - err = loader_add_layer_properties_to_list(inst, layer_prop); - if (err == VK_ERROR_OUT_OF_HOST_MEMORY) return err; - } else { - err = loader_add_meta_layer(inst, filters, layer_prop, NULL); - if (err == VK_ERROR_OUT_OF_HOST_MEMORY) return err; - } + layer_prop->enabled_by_what = ENABLED_BY_WHAT_IN_APPLICATION_API; + err = loader_add_layer_properties_to_list(inst, layer_prop); + if (err == VK_ERROR_OUT_OF_HOST_MEMORY) return err; } return err; @@ -1447,133 +1341,24 @@ bool loader_implicit_layer_is_enabled(const struct loader_instance *inst, const "Implicit layer \"%s\" missing disabled environment variable!", prop->info.layerName); } - // Enable this layer if it is included in the override layer - if (inst != NULL && inst->override_layer_present) { - struct loader_layer_properties *override = NULL; - for (uint32_t i = 0; i < inst->instance_layer_list.count; ++i) { - if (strcmp(inst->instance_layer_list.list[i].info.layerName, VK_OVERRIDE_LAYER_NAME) == 0) { - override = &inst->instance_layer_list.list[i]; - break; - } - } - if (override != NULL) { - for (uint32_t i = 0; i < override->component_layer_names.count; ++i) { - if (strcmp(override->component_layer_names.list[i], prop->info.layerName) == 0) { - enable = true; - break; - } - } - } - } - return enable; } // Check the individual implicit layer for the enable/disable environment variable settings. Only add it after // every check has passed indicating it should be used, including making sure a layer of the same name hasn't already been // added. -// NOLINTNEXTLINE(misc-no-recursion) - mutual recursion with loader_add_meta_layer is bounded by finite meta-layer nesting VkResult loader_add_implicit_layer(struct loader_instance *inst, struct loader_layer_properties *prop, const struct loader_envvar_all_filters *filters) { VkResult result = VK_SUCCESS; if (loader_implicit_layer_is_enabled(inst, filters, prop)) { - if (0 == (prop->type_flags & VK_LAYER_TYPE_FLAG_META_LAYER)) { - // Make sure the layer isn't already in the output_list, skip adding it if it is. - if (loader_find_layer_name_in_list(&prop->info.layerName[0], &inst->expanded_activated_layer_list)) { - return result; - } - prop->enabled_by_what = ENABLED_BY_WHAT_IMPLICIT_LAYER; - result = loader_add_layer_properties_to_list(inst, prop); - if (result == VK_ERROR_OUT_OF_HOST_MEMORY) return result; - } else { - result = loader_add_meta_layer(inst, filters, prop, NULL); - } - } - return result; -} - -// Add the component layers of a meta-layer to the active list of layers -// NOLINTNEXTLINE(misc-no-recursion) - mutual recursion with loader_add_implicit_layer is bounded by finite meta-layer nesting -VkResult loader_add_meta_layer(struct loader_instance *inst, const struct loader_envvar_all_filters *filters, - struct loader_layer_properties *prop, bool *out_found_all_component_layers) { - VkResult result = VK_SUCCESS; - bool found_all_component_layers = true; - - // A meta-layer whose component chain loops back to itself would recurse here until the stack overflows. - // verify_all_meta_layers rejects such cycles for layers found through normal discovery, but layers pulled - // in from the settings file skip that check, so break the recursion on the second entry to the same layer. - if (prop->is_being_expanded) { - loader_log(inst, VULKAN_LOADER_WARN_BIT | VULKAN_LOADER_LAYER_BIT, 0, - "loader_add_meta_layer: Meta-layer %s recursively references itself through its component layers. Skipping the " - "recursive reference.", - prop->info.layerName); - if (NULL != out_found_all_component_layers) { - *out_found_all_component_layers = false; - } - return VK_SUCCESS; - } - prop->is_being_expanded = true; - - // We need to add all the individual component layers - loader_api_version meta_layer_api_version = loader_make_version(prop->info.specVersion); - for (uint32_t comp_layer = 0; comp_layer < prop->component_layer_names.count; comp_layer++) { - struct loader_layer_properties *search_prop = - loader_find_layer_property(prop->component_layer_names.list[comp_layer], &inst->instance_layer_list); - if (NULL == search_prop) { - loader_log(inst, VULKAN_LOADER_WARN_BIT | VULKAN_LOADER_LAYER_BIT, 0, - "Failed to find layer name \"%s\" component layer \"%s\" to activate (Policy #LLP_LAYER_7)", - prop->component_layer_names.list[comp_layer], prop->component_layer_names.list[comp_layer]); - found_all_component_layers = false; - continue; - } - loader_api_version search_prop_version = loader_make_version(prop->info.specVersion); - if (!loader_check_version_meets_required(meta_layer_api_version, search_prop_version)) { - loader_log(inst, VULKAN_LOADER_WARN_BIT | VULKAN_LOADER_LAYER_BIT, 0, - "Meta-layer \"%s\" API version %u.%u, component layer \"%s\" version %u.%u, may have " - "incompatibilities (Policy #LLP_LAYER_8)!", - prop->info.layerName, meta_layer_api_version.major, meta_layer_api_version.minor, - search_prop->info.layerName, search_prop_version.major, search_prop_version.minor); - } - - if (!loader_layer_is_available(inst, filters, search_prop)) { - loader_log(inst, VULKAN_LOADER_WARN_BIT | VULKAN_LOADER_LAYER_BIT, 0, - "Meta Layer \"%s\" component layer \"%s\" disabled.", prop->info.layerName, search_prop->info.layerName); - continue; - } - - // If the component layer is itself an implicit layer, we need to do the implicit layer enable - // checks - if (0 == (search_prop->type_flags & VK_LAYER_TYPE_FLAG_EXPLICIT_LAYER)) { - search_prop->enabled_by_what = ENABLED_BY_WHAT_META_LAYER; - result = loader_add_implicit_layer(inst, search_prop, filters); - if (result == VK_ERROR_OUT_OF_HOST_MEMORY) return result; - } else { - if (0 != (search_prop->type_flags & VK_LAYER_TYPE_FLAG_META_LAYER)) { - bool found_layers_in_component_meta_layer = true; - search_prop->enabled_by_what = ENABLED_BY_WHAT_META_LAYER; - result = loader_add_meta_layer(inst, filters, search_prop, &found_layers_in_component_meta_layer); - if (result == VK_ERROR_OUT_OF_HOST_MEMORY) return result; - if (!found_layers_in_component_meta_layer) found_all_component_layers = false; - } else if (!loader_find_layer_name_in_list(&search_prop->info.layerName[0], &inst->expanded_activated_layer_list)) { - // Make sure the layer isn't already in the output_list, skip adding it if it is. - search_prop->enabled_by_what = ENABLED_BY_WHAT_META_LAYER; - result = loader_add_layer_properties_to_list(inst, search_prop); - if (result == VK_ERROR_OUT_OF_HOST_MEMORY) return result; - } + // Make sure the layer isn't already in the output_list, skip adding it if it is. + if (loader_find_layer_name_in_list(&prop->info.layerName[0], &inst->expanded_activated_layer_list)) { + return result; } - } - - prop->is_being_expanded = false; - - // Add this layer to the overall target list (not the expanded one) - if (found_all_component_layers) { - prop->enabled_by_what = ENABLED_BY_WHAT_META_LAYER; + prop->enabled_by_what = ENABLED_BY_WHAT_IMPLICIT_LAYER; result = loader_add_layer_properties_to_list(inst, prop); if (result == VK_ERROR_OUT_OF_HOST_MEMORY) return result; - // Write the result to out_found_all_component_layers in case this function is being recursed - if (out_found_all_component_layers) *out_found_all_component_layers = found_all_component_layers; } - return result; } @@ -2592,266 +2377,10 @@ VkResult loader_get_fullpath(const struct loader_instance *inst, const char *fil return res; } -// Verify that all component layers in a meta-layer are valid. -// This function is potentially recursive so we pass in an array of "already checked" (length of the instance_layers->count) meta -// layers, preventing a stack overflow verifying meta layers that are each other's component layers -// NOLINTNEXTLINE(misc-no-recursion) - self-recursion is bounded by already_checked_meta_layers sized to instance_layers->count -bool verify_meta_layer_component_layers(const struct loader_instance *inst, size_t prop_index, - struct loader_layer_list *instance_layers, bool *already_checked_meta_layers) { - struct loader_layer_properties *prop = &instance_layers->list[prop_index]; - loader_api_version meta_layer_version = loader_make_version(prop->info.specVersion); - - // Mark this meta layer as 'already checked', indicating which layers have already been recursed. - already_checked_meta_layers[prop_index] = true; - - for (uint32_t comp_layer = 0; comp_layer < prop->component_layer_names.count; comp_layer++) { - struct loader_layer_properties *comp_prop = - loader_find_layer_property(prop->component_layer_names.list[comp_layer], instance_layers); - if (comp_prop == NULL) { - loader_log(inst, VULKAN_LOADER_WARN_BIT, 0, - "verify_meta_layer_component_layers: Meta-layer %s can't find component layer %s at index %d." - " Skipping this layer.", - prop->info.layerName, prop->component_layer_names.list[comp_layer], comp_layer); - - return false; - } - - // Check the version of each layer, they need to be at least MAJOR and MINOR - loader_api_version comp_prop_version = loader_make_version(comp_prop->info.specVersion); - if (!loader_check_version_meets_required(meta_layer_version, comp_prop_version)) { - loader_log(inst, VULKAN_LOADER_WARN_BIT, 0, - "verify_meta_layer_component_layers: Meta-layer uses API version %d.%d, but component " - "layer %d has API version %d.%d that is lower. Skipping this layer.", - meta_layer_version.major, meta_layer_version.minor, comp_layer, comp_prop_version.major, - comp_prop_version.minor); - - return false; - } - - // Make sure the layer isn't using it's own name - if (!strcmp(prop->info.layerName, prop->component_layer_names.list[comp_layer])) { - loader_log(inst, VULKAN_LOADER_WARN_BIT, 0, - "verify_meta_layer_component_layers: Meta-layer %s lists itself in its component layer " - "list at index %d. Skipping this layer.", - prop->info.layerName, comp_layer); - - return false; - } - if (comp_prop->type_flags & VK_LAYER_TYPE_FLAG_META_LAYER) { - size_t comp_prop_index = INT32_MAX; - // Make sure we haven't verified this meta layer before - for (uint32_t i = 0; i < instance_layers->count; i++) { - if (strcmp(comp_prop->info.layerName, instance_layers->list[i].info.layerName) == 0) { - comp_prop_index = i; - } - } - if (comp_prop_index != INT32_MAX && already_checked_meta_layers[comp_prop_index]) { - loader_log(inst, VULKAN_LOADER_WARN_BIT, 0, - "verify_meta_layer_component_layers: Recursive dependency between Meta-layer %s and Meta-layer %s. " - "Skipping this layer.", - instance_layers->list[prop_index].info.layerName, comp_prop->info.layerName); - return false; - } - - loader_log(inst, VULKAN_LOADER_INFO_BIT, 0, - "verify_meta_layer_component_layers: Adding meta-layer %s which also contains meta-layer %s", - prop->info.layerName, comp_prop->info.layerName); - - // Make sure if the layer is using a meta-layer in its component list that we also verify that. - if (!verify_meta_layer_component_layers(inst, comp_prop_index, instance_layers, already_checked_meta_layers)) { - loader_log(inst, VULKAN_LOADER_WARN_BIT, 0, - "Meta-layer %s component layer %s can not find all component layers." - " Skipping this layer.", - prop->info.layerName, prop->component_layer_names.list[comp_layer]); - return false; - } - } - } - // Didn't exit early so that means it passed all checks - loader_log(inst, VULKAN_LOADER_INFO_BIT | VULKAN_LOADER_LAYER_BIT, 0, - "Meta-layer \"%s\" all %d component layers appear to be valid.", prop->info.layerName, - prop->component_layer_names.count); - - // If layer logging is on, list the internals included in the meta-layer - for (uint32_t comp_layer = 0; comp_layer < prop->component_layer_names.count; comp_layer++) { - loader_log(inst, VULKAN_LOADER_LAYER_BIT, 0, " [%d] %s", comp_layer, prop->component_layer_names.list[comp_layer]); - } - return true; -} - -// Add any instance and device extensions from component layers to this layer -// list, so that anyone querying extensions will only need to look at the meta-layer -VkResult update_meta_layer_extensions_from_component_layers(const struct loader_instance *inst, - struct loader_layer_properties *prop, - struct loader_layer_list *instance_layers) { - VkResult res = VK_SUCCESS; - for (uint32_t comp_layer = 0; comp_layer < prop->component_layer_names.count; comp_layer++) { - struct loader_layer_properties *comp_prop = - loader_find_layer_property(prop->component_layer_names.list[comp_layer], instance_layers); - - if (NULL != comp_prop->instance_extension_list.list) { - for (uint32_t ext = 0; ext < comp_prop->instance_extension_list.count; ext++) { - loader_log(inst, VULKAN_LOADER_DEBUG_BIT, 0, "Meta-layer %s component layer %s adding instance extension %s", - prop->info.layerName, prop->component_layer_names.list[comp_layer], - comp_prop->instance_extension_list.list[ext].extensionName); - - if (!has_vk_extension_property(&comp_prop->instance_extension_list.list[ext], &prop->instance_extension_list)) { - res = loader_add_to_ext_list(inst, &prop->instance_extension_list, 1, - &comp_prop->instance_extension_list.list[ext]); - if (VK_ERROR_OUT_OF_HOST_MEMORY == res) { - return res; - } - } - } - } - if (NULL != comp_prop->device_extension_list.list) { - for (uint32_t ext = 0; ext < comp_prop->device_extension_list.count; ext++) { - loader_log(inst, VULKAN_LOADER_DEBUG_BIT, 0, "Meta-layer %s component layer %s adding device extension %s", - prop->info.layerName, prop->component_layer_names.list[comp_layer], - comp_prop->device_extension_list.list[ext].props.extensionName); - - if (!has_vk_dev_ext_property(&comp_prop->device_extension_list.list[ext].props, &prop->device_extension_list)) { - res = loader_add_to_dev_ext_list(inst, &prop->device_extension_list, - &comp_prop->device_extension_list.list[ext].props, NULL); - if (VK_ERROR_OUT_OF_HOST_MEMORY == res) { - return res; - } - } - } - } - } - return res; -} - -// Verify that all meta-layers in a layer list are valid. -VkResult verify_all_meta_layers(struct loader_instance *inst, const struct loader_envvar_all_filters *filters, - struct loader_layer_list *instance_layers, bool *override_layer_present) { - VkResult res = VK_SUCCESS; - *override_layer_present = false; - // No layers, no problem - if (instance_layers->count == 0) { - return VK_SUCCESS; - } - bool *already_checked_meta_layers = - loader_instance_heap_calloc(inst, sizeof(bool) * instance_layers->count, VK_SYSTEM_ALLOCATION_SCOPE_COMMAND); - if (NULL == already_checked_meta_layers) { - return VK_ERROR_OUT_OF_HOST_MEMORY; - } - for (int32_t i = 0; i < (int32_t)instance_layers->count; i++) { - struct loader_layer_properties *prop = &instance_layers->list[i]; - - // If this is a meta-layer, make sure it is valid - if (prop->type_flags & VK_LAYER_TYPE_FLAG_META_LAYER) { - // The size of the layer list doesn't change so we can re-use the allocation, but we do need to clear it every iteration - memset(already_checked_meta_layers, 0, sizeof(bool) * instance_layers->count); - - if (verify_meta_layer_component_layers(inst, i, instance_layers, already_checked_meta_layers)) { - // If any meta layer is valid, update its extension list to include the extensions from its component layers. - res = update_meta_layer_extensions_from_component_layers(inst, prop, instance_layers); - if (VK_ERROR_OUT_OF_HOST_MEMORY == res) { - goto out; - } - if (prop->is_override && loader_implicit_layer_is_enabled(inst, filters, prop)) { - *override_layer_present = true; - } - } else { - loader_log(inst, VULKAN_LOADER_DEBUG_BIT, 0, - "Removing meta-layer %s from instance layer list since it appears invalid.", prop->info.layerName); - - loader_remove_layer_in_list(inst, instance_layers, i); - i--; - } - } - } -out: - loader_instance_heap_free(inst, already_checked_meta_layers); - - return res; -} - -// If the current working directory matches any app_key_path of the layers, remove all other override layers. -// Otherwise if no matching app_key was found, remove all but the global override layer, which has no app_key_path. -VkResult remove_all_non_valid_override_layers(struct loader_instance *inst, struct loader_layer_list *instance_layers) { - if (instance_layers == NULL) { - return VK_SUCCESS; - } - - bool oom = false; - char *cur_path = loader_platform_executable_path(inst, &oom); - if (oom) { - return VK_ERROR_OUT_OF_HOST_MEMORY; - } - if (NULL == cur_path) { - return VK_SUCCESS; // No way to get the current app path, so give up - } - // Find out if there is an override layer with same the app_key_path as the path to the current executable. - // If more than one is found, remove it and use the first layer - // Remove any layers which aren't global and do not have the same app_key_path as the path to the current executable. - bool found_active_override_layer = false; - int global_layer_index = -1; - for (uint32_t i = 0; i < instance_layers->count; i++) { - struct loader_layer_properties *props = &instance_layers->list[i]; - if (strcmp(props->info.layerName, VK_OVERRIDE_LAYER_NAME) == 0) { - if (props->app_key_paths.count > 0) { // not the global layer - for (uint32_t j = 0; j < props->app_key_paths.count; j++) { - if (strcmp(props->app_key_paths.list[j], cur_path) == 0) { - if (!found_active_override_layer) { - found_active_override_layer = true; - } else { - loader_log(inst, VULKAN_LOADER_WARN_BIT | VULKAN_LOADER_LAYER_BIT, 0, - "remove_all_non_valid_override_layers: Multiple override layers where the same path in " - "app_keys " - "was found. Using the first layer found"); - - // Remove duplicate active override layers that have the same app_key_path - loader_remove_layer_in_list(inst, instance_layers, i); - i--; - } - } - } - if (!found_active_override_layer) { - loader_log(inst, VULKAN_LOADER_INFO_BIT | VULKAN_LOADER_LAYER_BIT, 0, - "--Override layer found but not used because app \'%s\' is not in \'app_keys\' list!", cur_path); - - // Remove non-global override layers that don't have an app_key that matches cur_path - loader_remove_layer_in_list(inst, instance_layers, i); - i--; - } - } else { - if (global_layer_index == -1) { - global_layer_index = (int)i; - } else { - loader_log( - inst, VULKAN_LOADER_WARN_BIT | VULKAN_LOADER_LAYER_BIT, 0, - "remove_all_non_valid_override_layers: Multiple global override layers found. Using the first global " - "layer found"); - loader_remove_layer_in_list(inst, instance_layers, i); - i--; - } - } - } - } - // Remove global layer if layer with same the app_key_path as the path to the current executable is found - if (found_active_override_layer && global_layer_index >= 0) { - loader_remove_layer_in_list(inst, instance_layers, global_layer_index); - } - // Should be at most 1 override layer in the list now. - if (found_active_override_layer) { - loader_log(inst, VULKAN_LOADER_INFO_BIT | VULKAN_LOADER_LAYER_BIT, 0, "Using the override layer for app key %s", cur_path); - } else if (global_layer_index >= 0) { - loader_log(inst, VULKAN_LOADER_INFO_BIT | VULKAN_LOADER_LAYER_BIT, 0, "Using the global override layer"); - } - - loader_instance_heap_free(inst, cur_path); - - return VK_SUCCESS; -} - /* The following are required in the "layer" object: * "name" * "type" - * (for non-meta layers) "library_path" - * (for meta layers) "component_layers" + * "library_path" * "api_version" * "implementation_version" * "description" @@ -2880,11 +2409,6 @@ VkResult loader_read_layer_json(const struct loader_instance *inst, struct loade goto out; } - // Check if this layer's name matches the override layer name, set is_override to true if so. - if (!strcmp(props.info.layerName, VK_OVERRIDE_LAYER_NAME)) { - props.is_override = true; - } - if (0 != strncmp(props.info.layerName, "VK_LAYER_", 9)) { loader_log(inst, VULKAN_LOADER_WARN_BIT, 0, "Layer name %s does not conform to naming standard (Policy #LLP_LAYER_3)", props.info.layerName); @@ -2976,69 +2500,24 @@ VkResult loader_read_layer_json(const struct loader_instance *inst, struct loade result = VK_ERROR_OUT_OF_HOST_MEMORY; goto out; } - if (NULL != library_path) { - if (NULL != loader_cJSON_GetObjectItem(layer_node, "component_layers")) { - loader_log( - inst, VULKAN_LOADER_WARN_BIT, 0, - "Layer \"%s\" contains meta-layer-specific component_layers, but also defining layer library path. Both are not " - "compatible, so skipping this layer", - props.info.layerName); - result = VK_ERROR_INITIALIZATION_FAILED; - loader_instance_heap_free(inst, library_path); - goto out; - } - - // This function takes ownership of library_path_str - so we don't need to clean it up - result = combine_manifest_directory_and_library_path(inst, library_path, filename, &props.lib_name); - if (result == VK_ERROR_OUT_OF_HOST_MEMORY) goto out; - } - - // Parse component_layers - if (NULL == library_path) { - if (!loader_check_version_meets_required(LOADER_VERSION_1_1_0, version)) { + if (NULL != loader_cJSON_GetObjectItem(layer_node, "component_layers")) { loader_log(inst, VULKAN_LOADER_WARN_BIT, 0, - "Layer \"%s\" contains meta-layer-specific component_layers, but using older JSON file version.", + "Layer \"%s\" contains meta-layer-specific component_layers. Meta-layer support has been removed from the " + "loader, so skipping this layer", props.info.layerName); - } - - result = loader_parse_json_array_of_strings(inst, layer_node, "component_layers", &(props.component_layer_names)); - if (VK_ERROR_OUT_OF_HOST_MEMORY == result) { - goto out; - } - if (VK_ERROR_INITIALIZATION_FAILED == result) { + } else { loader_log(inst, VULKAN_LOADER_WARN_BIT, 0, - "Layer \"%s\" is missing both library_path and component_layers fields. One or the other MUST be defined. " - "Skipping this layer", + "Layer \"%s\" is missing the library_path field. It MUST be defined. Skipping this layer", props.info.layerName); - goto out; - } - // This is now, officially, a meta-layer - props.type_flags |= VK_LAYER_TYPE_FLAG_META_LAYER; - loader_log(inst, VULKAN_LOADER_INFO_BIT | VULKAN_LOADER_LAYER_BIT, 0, "Encountered meta-layer \"%s\"", - props.info.layerName); - } - - // Parse blacklisted_layers - - if (props.is_override) { - result = loader_parse_json_array_of_strings(inst, layer_node, "blacklisted_layers", &(props.blacklist_layer_names)); - if (VK_ERROR_OUT_OF_HOST_MEMORY == result) { - goto out; } - } - - // Parse override_paths - - result = loader_parse_json_array_of_strings(inst, layer_node, "override_paths", &(props.override_paths)); - if (VK_ERROR_OUT_OF_HOST_MEMORY == result) { + result = VK_ERROR_INITIALIZATION_FAILED; goto out; } - if (NULL != props.override_paths.list && !loader_check_version_meets_required(loader_combine_version(1, 1, 0), version)) { - loader_log(inst, VULKAN_LOADER_WARN_BIT, 0, - "Layer \"%s\" contains meta-layer-specific override paths, but using older JSON file version.", - props.info.layerName); - } + + // This function takes ownership of library_path_str - so we don't need to clean it up + result = combine_manifest_directory_and_library_path(inst, library_path, filename, &props.lib_name); + if (result == VK_ERROR_OUT_OF_HOST_MEMORY) goto out; // Parse disable_environment @@ -3229,18 +2708,6 @@ VkResult loader_read_layer_json(const struct loader_instance *inst, struct loade } } - if (loader_cJSON_GetObjectItem(layer_node, "app_keys")) { - if (!props.is_override) { - loader_log(inst, VULKAN_LOADER_WARN_BIT | VULKAN_LOADER_LAYER_BIT, 0, - "Layer %s contains app_keys, but any app_keys can only be provided by the override meta layer. " - "These will be ignored.", - props.info.layerName); - } - - result = loader_parse_json_array_of_strings(inst, layer_node, "app_keys", &props.app_key_paths); - if (result == VK_ERROR_OUT_OF_HOST_MEMORY) goto out; - } - char *library_arch = loader_cJSON_GetStringValue(loader_cJSON_GetObjectItem(layer_node, "library_arch")); if (NULL != library_arch) { if ((strncmp(library_arch, "32", 2) == 0 && sizeof(void *) != 4) || @@ -4370,23 +3837,6 @@ VkResult loader_parse_instance_layers(struct loader_instance *inst, enum loader_ return res; } -// Given a loader_layer_properties struct that is a valid override layer, concatenate the properties override paths and put them -// into the output parameter override_paths -VkResult get_override_layer_override_paths(struct loader_instance *inst, struct loader_layer_properties *prop, - struct loader_string_list *override_paths) { - if (prop->override_paths.count > 0) { - for (uint32_t j = 0; j < prop->override_paths.count; j++) { - VkResult result = copy_data_file_info(inst, prop->override_paths.list[j], NULL, 0, override_paths); - if (VK_SUCCESS != result) { - return result; - } - loader_log(inst, VULKAN_LOADER_WARN_BIT | VULKAN_LOADER_LAYER_BIT, 0, "Override layer has override path %s", - prop->override_paths.list[j]); - } - } - return VK_SUCCESS; -} - void loader_remove_duplicate_layers(struct loader_instance *inst, struct loader_layer_list *layers) { // Remove duplicate layers (that share the same layerName) for (uint32_t i = 0; i < layers->count; ++i) { @@ -4413,7 +3863,6 @@ VkResult loader_scan_for_layers(struct loader_instance *inst, struct loader_laye VkResult res = VK_SUCCESS; struct loader_layer_list settings_layers = {0}; struct loader_layer_list regular_instance_layers = {0}; - bool override_layer_valid = false; struct loader_string_list override_paths = {0}; bool should_search_for_other_layers = true; @@ -4435,44 +3884,12 @@ VkResult loader_scan_for_layers(struct loader_instance *inst, struct loader_laye goto out; } - // Remove any extraneous override layers. - res = remove_all_non_valid_override_layers(inst, ®ular_instance_layers); - if (VK_SUCCESS != res) { - goto out; - } - - // Check to see if the override layer is present, and use it's override paths. - for (uint32_t i = 0; i < regular_instance_layers.count; i++) { - struct loader_layer_properties *prop = ®ular_instance_layers.list[i]; - if (prop->is_override && loader_implicit_layer_is_enabled(inst, filters, prop) && prop->override_paths.count > 0) { - res = get_override_layer_override_paths(inst, prop, &override_paths); - if (VK_SUCCESS != res) { - goto out; - } - break; - } - } - // Get a list of manifest files for explicit layers res = loader_parse_instance_layers(inst, LOADER_DATA_FILE_MANIFEST_EXPLICIT_LAYER, &override_paths, ®ular_instance_layers); if (VK_SUCCESS != res) { goto out; } - // Verify any meta-layers in the list are valid and all the component layers are - // actually present in the available layer list - res = verify_all_meta_layers(inst, filters, ®ular_instance_layers, &override_layer_valid); - if (VK_ERROR_OUT_OF_HOST_MEMORY == res) { - goto out; - } - - if (override_layer_valid) { - loader_remove_layers_in_blacklist(inst, ®ular_instance_layers); - if (NULL != inst) { - inst->override_layer_present = true; - } - } - // Remove disabled layers for (uint32_t i = 0; i < regular_instance_layers.count; ++i) { if (!loader_layer_is_available(inst, filters, ®ular_instance_layers.list[i])) { @@ -4499,9 +3916,7 @@ VkResult loader_scan_for_implicit_layers(struct loader_instance *inst, struct lo VkResult res = VK_SUCCESS; struct loader_layer_list settings_layers = {0}; struct loader_layer_list regular_instance_layers = {0}; - bool override_layer_valid = false; struct loader_string_list override_paths = {0}; - bool implicit_metalayer_present = false; bool should_search_for_other_layers = true; res = get_settings_layers(inst, &settings_layers, &should_search_for_other_layers); @@ -4533,51 +3948,6 @@ VkResult loader_scan_for_implicit_layers(struct loader_instance *inst, struct lo goto out; } - // Remove any extraneous override layers. - res = remove_all_non_valid_override_layers(inst, ®ular_instance_layers); - if (VK_SUCCESS != res) { - goto out; - } - // Check to see if either the override layer is present, or another implicit meta-layer. - // Each of these may require explicit layers to be enabled at this time. - for (uint32_t i = 0; i < regular_instance_layers.count; i++) { - struct loader_layer_properties *prop = ®ular_instance_layers.list[i]; - if (prop->is_override && loader_implicit_layer_is_enabled(inst, layer_filters, prop)) { - override_layer_valid = true; - res = get_override_layer_override_paths(inst, prop, &override_paths); - if (VK_SUCCESS != res) { - goto out; - } - } else if (!prop->is_override && prop->type_flags & VK_LAYER_TYPE_FLAG_META_LAYER) { - implicit_metalayer_present = true; - } - } - - // If either the override layer or an implicit meta-layer are present, we need to add - // explicit layer info as well. Not to worry, though, all explicit layers not included - // in the override layer will be removed below in loader_remove_layers_in_blacklist(). - if (override_layer_valid || implicit_metalayer_present) { - res = - loader_parse_instance_layers(inst, LOADER_DATA_FILE_MANIFEST_EXPLICIT_LAYER, &override_paths, ®ular_instance_layers); - if (VK_SUCCESS != res) { - goto out; - } - } - - // Verify any meta-layers in the list are valid and all the component layers are - // actually present in the available layer list - res = verify_all_meta_layers(inst, layer_filters, ®ular_instance_layers, &override_layer_valid); - if (VK_ERROR_OUT_OF_HOST_MEMORY == res) { - goto out; - } - - if (override_layer_valid || implicit_metalayer_present) { - loader_remove_layers_not_in_implicit_meta_layers(inst, ®ular_instance_layers); - if (override_layer_valid && inst != NULL) { - inst->override_layer_present = true; - } - } - // Remove disabled layers for (uint32_t i = 0; i < regular_instance_layers.count; ++i) { if (!loader_implicit_layer_is_enabled(inst, layer_filters, ®ular_instance_layers.list[i])) { @@ -5150,14 +4520,12 @@ VkResult loader_create_instance_chain(const VkInstanceCreateInfo *pCreateInfo, c loader_platform_dl_handle lib_handle; // Skip it if a Layer with the same name has been already successfully activated - if (loader_names_array_has_layer_property(&layer_prop->info, num_activated_layers, activated_layers)) { + // Ignore this if the settings file is active + if ((!inst->settings.settings_active || !inst->settings.layer_configurations_active) && + loader_names_array_has_layer_property(&layer_prop->info, num_activated_layers, activated_layers)) { continue; } - // Skip meta layers - if (NULL == layer_prop->lib_name) { - continue; - } bool oom = false; lib_handle = loader_open_layer_file(inst, layer_prop, &oom); if (oom || layer_prop->lib_status == LOADER_LAYER_LIB_ERROR_OUT_OF_MEMORY) { @@ -5295,9 +4663,9 @@ VkResult loader_create_instance_chain(const VkInstanceCreateInfo *pCreateInfo, c break; } } - // If it wasn't found and it isn't a meta layer (which doesn't have a lib name) we want to at least log an error. However, - // if it was enabled by the application directly, we want to return a bad layer error. - if (!found && NULL != exp_layer_prop->lib_name) { + // If it wasn't found we want to at least log an error. However if it was enabled by the application directly, we want to + // return a bad layer error. + if (!found) { bool app_requested = false; for (uint32_t act = 0; act < pCreateInfo->enabledLayerCount; ++act) { if (!strcmp(pCreateInfo->ppEnabledLayerNames[act], exp_layer_prop->info.layerName)) { diff --git a/loader/loader.h b/loader/loader.h index ef529e3ef..1ca9d4564 100644 --- a/loader/loader.h +++ b/loader/loader.h @@ -161,8 +161,6 @@ VkResult loader_add_layer_properties_to_list(struct loader_instance *inst, struc void loader_free_layer_properties(const struct loader_instance *inst, struct loader_layer_properties *layer_properties); bool loader_implicit_layer_is_enabled(const struct loader_instance *inst, const struct loader_envvar_all_filters *filters, const struct loader_layer_properties *prop); -VkResult loader_add_meta_layer(struct loader_instance *inst, const struct loader_envvar_all_filters *filters, - struct loader_layer_properties *prop, bool *out_found_all_component_layers); VkResult loader_add_to_ext_list(const struct loader_instance *inst, struct loader_extension_list *ext_list, uint32_t prop_list_count, const VkExtensionProperties *props); VkResult loader_add_device_extensions(const struct loader_instance *inst, diff --git a/loader/loader_common.h b/loader/loader_common.h index e26e35725..b5a9abe23 100644 --- a/loader/loader_common.h +++ b/loader/loader_common.h @@ -186,7 +186,6 @@ enum layer_type_flags { VK_LAYER_TYPE_FLAG_NONE = 0x0, VK_LAYER_TYPE_FLAG_INSTANCE_LAYER = 0x1, // If not set, indicates Device layer VK_LAYER_TYPE_FLAG_EXPLICIT_LAYER = 0x2, // If not set, indicates Implicit layer - VK_LAYER_TYPE_FLAG_META_LAYER = 0x4, // If not set, indicates standard layer }; enum loader_layer_enabled_by_what { @@ -196,7 +195,6 @@ enum loader_layer_enabled_by_what { ENABLED_BY_WHAT_VK_INSTANCE_LAYERS, ENABLED_BY_WHAT_VK_LOADER_LAYERS_ENABLE, ENABLED_BY_WHAT_IN_APPLICATION_API, - ENABLED_BY_WHAT_META_LAYER, }; struct loader_layer_properties { @@ -215,19 +213,11 @@ struct loader_layer_properties { struct loader_device_extension_list device_extension_list; struct loader_name_value disable_env_var; struct loader_name_value enable_env_var; - struct loader_string_list component_layer_names; struct { char *enumerate_instance_extension_properties; char *enumerate_instance_layer_properties; char *enumerate_instance_version; } pre_instance_functions; - struct loader_string_list override_paths; - bool is_override; - bool keep; - // Set while this meta-layer is being expanded, used to break cyclic component references. - bool is_being_expanded; - struct loader_string_list blacklist_layer_names; - struct loader_string_list app_key_paths; }; // Stores a list of loader_layer_properties @@ -373,11 +363,9 @@ struct loader_instance { struct loader_string_list enabled_layer_names; struct loader_layer_list instance_layer_list; - bool override_layer_present; - // List of activated layers, including the layers enabled from expanding meta-layers into their individual component - // layers. This active list of layers can include layers that failed to actually be enabled, such as not being able to load the - // binary, failing version negotiation, and not being able to query vkGetInstanceProcAddr + // List of activated layers. This active list of layers can include layers that failed to actually be enabled, such as not being + // able to load the binary, failing version negotiation, and not being able to query vkGetInstanceProcAddr struct loader_pointer_layer_list expanded_activated_layer_list; VkInstance instance; // layers/ICD instance returned to trampoline diff --git a/loader/loader_environment.c b/loader/loader_environment.c index 7c63053ae..cc28638b5 100644 --- a/loader/loader_environment.c +++ b/loader/loader_environment.c @@ -497,14 +497,9 @@ VkResult loader_add_environment_layers(struct loader_instance *inst, const char found = true; // Only add it if it doesn't already appear in the layer list if (!loader_find_layer_name_in_list(source_prop->info.layerName, &inst->expanded_activated_layer_list)) { - if (0 == (source_prop->type_flags & VK_LAYER_TYPE_FLAG_META_LAYER)) { - source_prop->enabled_by_what = ENABLED_BY_WHAT_VK_INSTANCE_LAYERS; - res = loader_add_layer_properties_to_list(inst, source_prop); - if (res == VK_ERROR_OUT_OF_HOST_MEMORY) goto out; - } else { - res = loader_add_meta_layer(inst, filters, source_prop, NULL); - if (res == VK_ERROR_OUT_OF_HOST_MEMORY) goto out; - } + source_prop->enabled_by_what = ENABLED_BY_WHAT_VK_INSTANCE_LAYERS; + res = loader_add_layer_properties_to_list(inst, source_prop); + if (res == VK_ERROR_OUT_OF_HOST_MEMORY) goto out; break; } } @@ -554,15 +549,9 @@ VkResult loader_add_environment_layers(struct loader_instance *inst, const char loader_log(inst, VULKAN_LOADER_WARN_BIT | VULKAN_LOADER_LAYER_BIT, 0, "Layer \"%s\" forced enabled due to env var \'%s\'", source_prop->info.layerName, VK_LAYERS_ENABLE_ENV_VAR); - // If not a meta-layer, simply add it. - if (0 == (source_prop->type_flags & VK_LAYER_TYPE_FLAG_META_LAYER)) { - source_prop->enabled_by_what = ENABLED_BY_WHAT_VK_LOADER_LAYERS_ENABLE; - res = loader_add_layer_properties_to_list(inst, source_prop); - if (res == VK_ERROR_OUT_OF_HOST_MEMORY) goto out; - } else { - res = loader_add_meta_layer(inst, filters, source_prop, NULL); - if (res == VK_ERROR_OUT_OF_HOST_MEMORY) goto out; - } + source_prop->enabled_by_what = ENABLED_BY_WHAT_VK_LOADER_LAYERS_ENABLE; + res = loader_add_layer_properties_to_list(inst, source_prop); + if (res == VK_ERROR_OUT_OF_HOST_MEMORY) goto out; } out: diff --git a/loader/settings.c b/loader/settings.c index 7769c4ceb..57c5a9e38 100644 --- a/loader/settings.c +++ b/loader/settings.c @@ -1049,8 +1049,7 @@ TEST_FUNCTION_EXPORT VkResult get_settings_layers(const struct loader_instance* for (uint32_t k = 0; k < j; k++) { if (0 == strncmp(settings_layers->list[k].info.layerName, newly_added_layer->info.layerName, VK_MAX_EXTENSION_NAME_SIZE)) { - if (0 == (newly_added_layer->type_flags & VK_LAYER_TYPE_FLAG_META_LAYER) && - settings_layers->list[k].lib_name != NULL && newly_added_layer->lib_name != NULL && + if (settings_layers->list[k].lib_name != NULL && newly_added_layer->lib_name != NULL && strcmp(settings_layers->list[k].lib_name, newly_added_layer->lib_name) == 0) { should_remove = true; break; @@ -1071,7 +1070,6 @@ TEST_FUNCTION_EXPORT VkResult get_settings_layers(const struct loader_instance* // Check if layers has an element with the same name. // LAYER_CONTROL_OFF layers are missing some fields, just make sure the layerName is the same -// If layer_property is a meta layer, just make sure the layerName is the same // Skip comparing to UNORDERED_LAYER_LOCATION // If layer_property is a regular layer, check if the lib_path is the same. // Make sure that the lib_name pointers are non-null before calling strcmp. @@ -1079,15 +1077,11 @@ TEST_FUNCTION_EXPORT VkResult get_settings_layers(const struct loader_instance* // between settings file provided layers and default found layers bool check_if_layer_is_in_list(struct loader_layer_list* layer_list, struct loader_layer_properties* layer_property, bool consider_lib_path) { - // If the layer is a meta layer, just check against the name for (uint32_t i = 0; i < layer_list->count; i++) { if (0 == strncmp(layer_list->list[i].info.layerName, layer_property->info.layerName, VK_MAX_EXTENSION_NAME_SIZE)) { if (layer_list->list[i].settings_control_value == LOADER_SETTINGS_LAYER_CONTROL_OFF) { return true; } - if (VK_LAYER_TYPE_FLAG_META_LAYER == (layer_property->type_flags & VK_LAYER_TYPE_FLAG_META_LAYER)) { - return true; - } if (!consider_lib_path) { return true; } @@ -1277,15 +1271,9 @@ VkResult enable_correct_layers_from_settings(struct loader_instance* inst, const } if (enable_layer) { - // Check if the layer is a meta layer reuse the existing function to add the meta layer - if (props->type_flags & VK_LAYER_TYPE_FLAG_META_LAYER) { - res = loader_add_meta_layer(inst, filters, props, NULL); - if (res == VK_ERROR_OUT_OF_HOST_MEMORY) goto out; - } else { - res = loader_add_layer_properties_to_list(inst, props); - if (res != VK_SUCCESS) { - goto out; - } + res = loader_add_layer_properties_to_list(inst, props); + if (res != VK_SUCCESS) { + goto out; } } } diff --git a/loader/trampoline.c b/loader/trampoline.c index 7f942934c..eab76d386 100644 --- a/loader/trampoline.c +++ b/loader/trampoline.c @@ -1131,11 +1131,10 @@ LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceLayerProperties(Vk const struct loader_instance *inst = phys_dev->this_instance; - // Only count layers that successfully loaded, or had nothing to load (like meta layers) + // Only count layers that successfully loaded uint32_t count = 0; for (uint32_t i = 0; i < inst->expanded_activated_layer_list.count; i++) { - if (inst->expanded_activated_layer_list.list[i]->lib_status == LOADER_LAYER_LIB_NOT_LOADED || - inst->expanded_activated_layer_list.list[i]->lib_status == LOADER_LAYER_LIB_SUCCESS_LOADED) { + if (inst->expanded_activated_layer_list.list[i]->lib_status == LOADER_LAYER_LIB_SUCCESS_LOADED) { count++; } } diff --git a/loader/vk_loader_platform.h b/loader/vk_loader_platform.h index 324e956a2..f232880cd 100644 --- a/loader/vk_loader_platform.h +++ b/loader/vk_loader_platform.h @@ -137,9 +137,6 @@ #define VK_LOADER_SEARCH_ONLY_IN_BUNDLE_ENV_VAR "VK_LOADER_SEARCH_ONLY_IN_BUNDLE" #endif -// Override layer information -#define VK_OVERRIDE_LAYER_NAME "VK_LAYER_LUNARG_override" - // Loader Settings filename #define VK_LOADER_SETTINGS_FILENAME "vk_loader_settings.json" diff --git a/tests/framework/layer/test_layer.h b/tests/framework/layer/test_layer.h index d5e88f2c3..abdd884be 100644 --- a/tests/framework/layer/test_layer.h +++ b/tests/framework/layer/test_layer.h @@ -100,8 +100,6 @@ struct TestLayer { std::filesystem::path manifest_file_path; uint32_t manifest_version = VK_MAKE_API_VERSION(0, 1, 1, 2); - BUILDER_VALUE(bool, is_meta_layer) - BUILDER_VALUE_WITH_DEFAULT(uint32_t, api_version, VK_API_VERSION_1_0) BUILDER_VALUE_WITH_DEFAULT(uint32_t, reported_layer_props, 1) BUILDER_VALUE(uint32_t, reported_extension_props) @@ -130,8 +128,6 @@ struct TestLayer { // Modifies the extension list returned by vkEnumerateDeviceExtensionProperties to include what is in this vector BUILDER_VECTOR(Extension, injected_device_extensions, injected_device_extension) - BUILDER_VECTOR(LayerDefinition, meta_component_layers, meta_component_layer); - BUILDER_VALUE(bool, intercept_vkEnumerateInstanceExtensionProperties) BUILDER_VALUE(bool, intercept_vkEnumerateInstanceLayerProperties) // Called in vkCreateInstance after calling down the chain & returning diff --git a/tests/framework/test_environment.cpp b/tests/framework/test_environment.cpp index fab4d40e5..3bfc56e51 100644 --- a/tests/framework/test_environment.cpp +++ b/tests/framework/test_environment.cpp @@ -366,8 +366,8 @@ ManifestLocation FrameworkEnvironment::map_discovery_type_to_location(ManifestDi case (ManifestDiscoveryType::windows_app_package): return ManifestLocation::windows_app_package; #endif - case (ManifestDiscoveryType::override_folder): - return ManifestLocation::override_layer; + case (ManifestDiscoveryType::overflow_folder): + return ManifestLocation::overflow; #if defined(__APPLE__) case (ManifestDiscoveryType::macos_bundle): return ManifestLocation::macos_bundle; diff --git a/tests/framework/util/folder_manager.cpp b/tests/framework/util/folder_manager.cpp index d92b962d4..94328329b 100644 --- a/tests/framework/util/folder_manager.cpp +++ b/tests/framework/util/folder_manager.cpp @@ -177,7 +177,7 @@ FileSystemManager::FileSystemManager() folders.try_emplace(ManifestLocation::implicit_layer, root, std::string("implicit_layer_manifests")); folders.try_emplace(ManifestLocation::implicit_layer_env_var, root, std::string("implicit_env_var_layer_manifests")); folders.try_emplace(ManifestLocation::implicit_layer_add_env_var, root, std::string("implicit_add_env_var_layer_manifests")); - folders.try_emplace(ManifestLocation::override_layer, root, std::string("override_layer_manifests")); + folders.try_emplace(ManifestLocation::overflow, root, std::string("overflow")); #if defined(_WIN32) folders.try_emplace(ManifestLocation::windows_app_package, root, std::string("app_package_manifests")); #endif diff --git a/tests/framework/util/manifest_builders.cpp b/tests/framework/util/manifest_builders.cpp index 6666a5769..2331dc15c 100644 --- a/tests/framework/util/manifest_builders.cpp +++ b/tests/framework/util/manifest_builders.cpp @@ -122,10 +122,6 @@ void ManifestLayer::LayerDescription::get_manifest_str(JsonWriter& writer) const writer.AddKeyedString(disable_environment, "1"); writer.EndObject(); } - print_vector_of_strings(writer, "component_layers", component_layers); - print_vector_of_strings(writer, "blacklisted_layers", blacklisted_layers); - print_vector_of_strings(writer, "override_paths", override_paths); - print_vector_of_strings(writer, "app_keys", app_keys); print_object_of_t(writer, "pre_instance_functions", pre_instance_functions); if (!library_arch.empty()) { writer.AddKeyedString("library_arch", library_arch); diff --git a/tests/framework/util/manifest_builders.h b/tests/framework/util/manifest_builders.h index 8ebb816a7..67c0b4bc9 100644 --- a/tests/framework/util/manifest_builders.h +++ b/tests/framework/util/manifest_builders.h @@ -95,11 +95,7 @@ struct ManifestLayer { BUILDER_VECTOR(Extension, device_extensions, device_extension) BUILDER_VALUE(std::string, enable_environment) BUILDER_VALUE(std::string, disable_environment) - BUILDER_VECTOR(std::string, component_layers, component_layer) - BUILDER_VECTOR(std::string, blacklisted_layers, blacklisted_layer) - BUILDER_VECTOR(std::filesystem::path, override_paths, override_path) BUILDER_VECTOR(FunctionOverride, pre_instance_functions, pre_instance_function) - BUILDER_VECTOR(std::string, app_keys, app_key) BUILDER_VALUE(std::string, library_arch) void get_manifest_str(JsonWriter& writer) const; diff --git a/tests/framework/util/test_defines.h b/tests/framework/util/test_defines.h index 9c261bb0c..5908a8344 100644 --- a/tests/framework/util/test_defines.h +++ b/tests/framework/util/test_defines.h @@ -58,7 +58,7 @@ enum class ManifestDiscoveryType { null_dir, // put the manifest in the 'null_dir' which the loader does not search in (D3DKMT for instance) env_var, // use the corresponding env-var for it add_env_var, // use the corresponding add-env-var for it - override_folder, // add to a special folder for the override layer to use + overflow_folder, // add to a special folder for the override layer to use #if defined(_WIN32) windows_app_package, // let the app package search find it #endif @@ -84,7 +84,7 @@ enum class ManifestLocation { implicit_layer, implicit_layer_env_var, implicit_layer_add_env_var, - override_layer, + overflow, #if defined(_WIN32) windows_app_package, #endif diff --git a/tests/loader_alloc_callback_tests.cpp b/tests/loader_alloc_callback_tests.cpp index 3af2c9ff1..537cd5197 100644 --- a/tests/loader_alloc_callback_tests.cpp +++ b/tests/loader_alloc_callback_tests.cpp @@ -978,14 +978,6 @@ TEST(Allocation, CreateInstanceDeviceIntentionalAllocFail) { .set_api_version(VK_MAKE_API_VERSION(0, 1, 1, 0)) .add_device_extension({"NeverGonnaLetYouDown"}))); - const char* override_layer_name = "VK_LAYER_LUNARG_override"; - env.add_implicit_layer({}, ManifestLayer{} - .set_file_format_version(ManifestVersion{1, 1, 2}) - .add_layer(ManifestLayer::LayerDescription{} - .set_name(override_layer_name) - .set_disable_environment("DISABLE_ENV") - .add_component_layer(regular_layer_name))); - const char* layer_name = "VK_LAYER_ImplicitAllocFail"; env.add_implicit_layer({}, ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} .set_name(layer_name) diff --git a/tests/loader_layer_tests.cpp b/tests/loader_layer_tests.cpp index a85d21f57..daad5d1e4 100644 --- a/tests/loader_layer_tests.cpp +++ b/tests/loader_layer_tests.cpp @@ -44,8 +44,6 @@ void CheckLogForLayerString(FrameworkEnvironment& env, const char* implicit_laye env.debug_log.clear(); } -const char* lunarg_meta_layer_name = "VK_LAYER_LUNARG_override"; - TEST(ImplicitLayers, WithEnableAndDisableEnvVar) { FrameworkEnvironment env; env.add_icd(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA); @@ -1133,7 +1131,7 @@ TEST(ImplicitLayers, DuplicateLayersInVkImplicitLayerPath) { env.add_implicit_layer(ManifestOptions{} // putting it in a separate folder then manually adding the folder to VK_IMPLICIT_LAYER_PATH - .set_discovery_type(ManifestDiscoveryType::override_folder), + .set_discovery_type(ManifestDiscoveryType::overflow_folder), ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} .set_name(layer_name) .set_description("actually_layer_2") @@ -1141,1036 +1139,118 @@ TEST(ImplicitLayers, DuplicateLayersInVkImplicitLayerPath) { .set_disable_environment("Ah!"))); auto& layer2 = env.get_test_layer(1); layer2.set_description("actually_layer_2"); - env.env_var_vk_implicit_layer_paths.add_to_list(env.get_folder(ManifestLocation::override_layer).location().string()); + env.env_var_vk_implicit_layer_paths.add_to_list(env.get_folder(ManifestLocation::overflow).location().string()); auto layer_props = env.GetLayerProperties(1); ASSERT_TRUE(string_eq(layer_name, layer_props[0].layerName)); ASSERT_TRUE(string_eq(layer1.description.c_str(), layer_props[0].description)); - EnvVarWrapper inst_layers_env_var{"VK_INSTANCE_LAYERS"}; - inst_layers_env_var.add_to_list(layer_name); - - InstWrapper inst{env.vulkan_functions}; - inst.CheckCreate(); - - // Expect the first layer added to be found - auto enabled_layer_props = inst.GetActiveLayers(inst.GetPhysDev(), 1); - ASSERT_TRUE(string_eq(layer_name, enabled_layer_props[0].layerName)); - ASSERT_TRUE(string_eq(layer1.description.c_str(), enabled_layer_props[0].description)); -} - -TEST(ImplicitLayers, DuplicateLayersInVK_ADD_IMPLICIT_LAYER_PATH) { - FrameworkEnvironment env; - env.add_icd(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA).add_physical_device({}); - - const char* same_layer_name_1 = "VK_LAYER_RegularLayer1"; - env.add_implicit_layer(ManifestOptions{} - // use override folder as just a folder and manually set the VK_ADD_IMPLICIT_LAYER_PATH env-var to it - .set_discovery_type(ManifestDiscoveryType::override_folder), - ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} - .set_name(same_layer_name_1) - .set_description("actually_layer_1") - .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) - .set_disable_environment("Red"))); - auto& layer1 = env.get_test_layer(0); - layer1.set_description("actually_layer_1"); - layer1.set_make_spurious_log_in_create_instance("actually_layer_1"); - env.add_env_var_vk_implicit_layer_paths.add_to_list(env.get_folder(ManifestLocation::override_layer).location()); - - env.add_implicit_layer(ManifestOptions{}.set_discovery_type(ManifestDiscoveryType::add_env_var).set_is_dir(true), - ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} - .set_name(same_layer_name_1) - .set_description("actually_layer_2") - .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) - .set_disable_environment("Blue"))); - auto& layer2 = env.get_test_layer(1); - layer2.set_description("actually_layer_2"); - layer2.set_make_spurious_log_in_create_instance("actually_layer_2"); - - auto layer_props = env.GetLayerProperties(1); - ASSERT_TRUE(string_eq(same_layer_name_1, layer_props[0].layerName)); - ASSERT_TRUE(string_eq(layer1.description.c_str(), layer_props[0].description)); - - InstWrapper inst{env.vulkan_functions}; - FillDebugUtilsCreateDetails(inst.create_info, env.debug_log); - inst.CheckCreate(); - auto enabled_layer_props = inst.GetActiveLayers(inst.GetPhysDev(), 1); - ASSERT_TRUE(string_eq(same_layer_name_1, enabled_layer_props.at(0).layerName)); - ASSERT_TRUE(string_eq(layer1.description.c_str(), enabled_layer_props.at(0).description)); - ASSERT_TRUE(env.debug_log.find("actually_layer_1")); - ASSERT_FALSE(env.debug_log.find("actually_layer_2")); -} - -TEST(ImplicitLayers, OrderedByVK_INSTANCE_LAYERS) { - FrameworkEnvironment env; - env.add_icd(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA).add_physical_device({}); - const char* implicit_layer_name = "VK_LAYER_implicit"; - env.add_implicit_layer({}, ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} - .set_name(implicit_layer_name) - - .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) - .set_disable_environment("foo"))); - const char* explicit_layer_name = "VK_LAYER_explicit"; - env.add_explicit_layer( - {}, ManifestLayer{}.add_layer( - ManifestLayer::LayerDescription{}.set_name(explicit_layer_name).set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2))); - // Only enable the explicit layer through the env-var - { - EnvVarWrapper env_var("VK_INSTANCE_LAYERS"); - env_var.add_to_list(explicit_layer_name); - InstWrapper inst{env.vulkan_functions}; - inst.CheckCreate(); - auto active_layers = inst.GetActiveLayers(inst.GetPhysDev(), 2); - ASSERT_TRUE(string_eq(active_layers.at(0).layerName, implicit_layer_name)); - ASSERT_TRUE(string_eq(active_layers.at(1).layerName, explicit_layer_name)); - } - // Enable both layers, implicit then explicit - { - EnvVarWrapper env_var("VK_INSTANCE_LAYERS"); - env_var.add_to_list(implicit_layer_name); - env_var.add_to_list(explicit_layer_name); - InstWrapper inst{env.vulkan_functions}; - inst.CheckCreate(); - auto active_layers = inst.GetActiveLayers(inst.GetPhysDev(), 2); - ASSERT_TRUE(string_eq(active_layers.at(0).layerName, implicit_layer_name)); - ASSERT_TRUE(string_eq(active_layers.at(1).layerName, explicit_layer_name)); - } - // Enable both layers, explicit then implicit - { - EnvVarWrapper env_var("VK_INSTANCE_LAYERS"); - env_var.add_to_list(explicit_layer_name); - env_var.add_to_list(implicit_layer_name); - InstWrapper inst{env.vulkan_functions}; - inst.CheckCreate(); - auto active_layers = inst.GetActiveLayers(inst.GetPhysDev(), 2); - ASSERT_TRUE(string_eq(active_layers.at(0).layerName, explicit_layer_name)); - ASSERT_TRUE(string_eq(active_layers.at(1).layerName, implicit_layer_name)); - } -} - -// Meta layer which contains component layers that do not exist. -TEST(MetaLayers, InvalidComponentLayer) { - FrameworkEnvironment env; - env.add_icd(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA); - const char* meta_layer_name = "VK_LAYER_MetaTestLayer"; - const char* invalid_layer_name_1 = "VK_LAYER_InvalidLayer1"; - const char* invalid_layer_name_2 = "VK_LAYER_InvalidLayer2"; - env.add_implicit_layer({}, ManifestLayer{}.set_file_format_version({1, 1, 2}).add_layer( - ManifestLayer::LayerDescription{} - .set_name(meta_layer_name) - .add_component_layers({invalid_layer_name_1, invalid_layer_name_2}) - .set_disable_environment("NotGonnaWork") - .add_instance_extension({"NeverGonnaGiveYouUp"}) - .add_device_extension({"NeverGonnaLetYouDown"}))); - - const char* regular_layer_name = "TestLayer"; - env.add_explicit_layer( - {}, ManifestLayer{}.add_layer( - ManifestLayer::LayerDescription{}.set_name(regular_layer_name).set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2))); - - // should find 1, the 'regular' layer - auto layer_props = env.GetLayerProperties(1); - EXPECT_TRUE(string_eq(layer_props.at(0).layerName, regular_layer_name)); - - auto extensions = env.GetInstanceExtensions(4); - EXPECT_TRUE(string_eq(extensions.at(0).extensionName, VK_EXT_DEBUG_REPORT_EXTENSION_NAME)); - EXPECT_TRUE(string_eq(extensions.at(1).extensionName, VK_EXT_DEBUG_UTILS_EXTENSION_NAME)); - EXPECT_TRUE(string_eq(extensions.at(2).extensionName, VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME)); - EXPECT_TRUE(string_eq(extensions.at(3).extensionName, VK_LUNARG_DIRECT_DRIVER_LOADING_EXTENSION_NAME)); - - InstWrapper inst{env.vulkan_functions}; - inst.create_info.add_layer(meta_layer_name); - FillDebugUtilsCreateDetails(inst.create_info, env.debug_log); - inst.CheckCreate(VK_ERROR_LAYER_NOT_PRESENT); - ASSERT_TRUE(env.debug_log.find(std::string("verify_meta_layer_component_layers: Meta-layer ") + meta_layer_name + - " can't find component layer " + invalid_layer_name_1 + " at index 0. Skipping this layer.")); -} - -// Meta layer that is an explicit layer -TEST(MetaLayers, ExplicitMetaLayer) { - FrameworkEnvironment env; - env.add_icd(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA).add_physical_device({}); - const char* meta_layer_name = "VK_LAYER_MetaTestLayer"; - const char* regular_layer_name = "VK_LAYER_TestLayer"; - env.add_explicit_layer( - {}, ManifestLayer{}.set_file_format_version({1, 1, 2}).add_layer( - ManifestLayer::LayerDescription{}.set_name(meta_layer_name).add_component_layers({regular_layer_name}))); - - env.add_explicit_layer( - {}, ManifestLayer{}.add_layer( - ManifestLayer::LayerDescription{}.set_name(regular_layer_name).set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2))); - - { // global functions - // should find 1, the 'regular' layer - auto layer_props = env.GetLayerProperties(2); - EXPECT_TRUE(check_permutation({regular_layer_name, meta_layer_name}, layer_props)); - - auto extensions = env.GetInstanceExtensions(4); - EXPECT_TRUE(string_eq(extensions.at(0).extensionName, VK_EXT_DEBUG_REPORT_EXTENSION_NAME)); - EXPECT_TRUE(string_eq(extensions.at(1).extensionName, VK_EXT_DEBUG_UTILS_EXTENSION_NAME)); - EXPECT_TRUE(string_eq(extensions.at(2).extensionName, VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME)); - EXPECT_TRUE(string_eq(extensions.at(3).extensionName, VK_LUNARG_DIRECT_DRIVER_LOADING_EXTENSION_NAME)); - } - { // don't enable the layer, shouldn't find any layers when calling vkEnumerateDeviceLayerProperties - InstWrapper inst{env.vulkan_functions}; - inst.CheckCreate(); - ASSERT_NO_FATAL_FAILURE(inst.GetActiveLayers(inst.GetPhysDev(), 0)); - } - { - InstWrapper inst{env.vulkan_functions}; - inst.create_info.add_layer(meta_layer_name); - inst.CheckCreate(); - auto layer_props = inst.GetActiveLayers(inst.GetPhysDev(), 2); - EXPECT_TRUE(check_permutation({regular_layer_name, meta_layer_name}, layer_props)); - } -} - -// Meta layer which adds itself in its list of component layers -TEST(MetaLayers, MetaLayerNameInComponentLayers) { - FrameworkEnvironment env; - env.add_icd(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA); - const char* meta_layer_name = "VK_LAYER_MetaTestLayer"; - const char* regular_layer_name = "VK_LAYER_TestLayer"; - env.add_implicit_layer({}, ManifestLayer{}.set_file_format_version({1, 1, 2}).add_layer( - ManifestLayer::LayerDescription{} - .set_name(meta_layer_name) - .add_component_layers({meta_layer_name, regular_layer_name}) - .set_disable_environment("NotGonnaWork") - .add_instance_extension({"NeverGonnaGiveYouUp"}) - .add_device_extension({"NeverGonnaLetYouDown"}))); - - env.add_explicit_layer( - {}, ManifestLayer{}.add_layer( - ManifestLayer::LayerDescription{}.set_name(regular_layer_name).set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2))); - - // should find 1, the 'regular' layer - auto layer_props = env.GetLayerProperties(1); - EXPECT_TRUE(string_eq(layer_props.at(0).layerName, regular_layer_name)); - - auto extensions = env.GetInstanceExtensions(4); - EXPECT_TRUE(string_eq(extensions.at(0).extensionName, VK_EXT_DEBUG_REPORT_EXTENSION_NAME)); - EXPECT_TRUE(string_eq(extensions.at(1).extensionName, VK_EXT_DEBUG_UTILS_EXTENSION_NAME)); - EXPECT_TRUE(string_eq(extensions.at(2).extensionName, VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME)); - EXPECT_TRUE(string_eq(extensions.at(3).extensionName, VK_LUNARG_DIRECT_DRIVER_LOADING_EXTENSION_NAME)); - - InstWrapper inst{env.vulkan_functions}; - inst.create_info.add_layer(meta_layer_name); - FillDebugUtilsCreateDetails(inst.create_info, env.debug_log); - inst.CheckCreate(VK_ERROR_LAYER_NOT_PRESENT); - ASSERT_TRUE(env.debug_log.find(std::string("verify_meta_layer_component_layers: Meta-layer ") + meta_layer_name + - " lists itself in its component layer " + "list at index 0. Skipping this layer.")); -} - -// Meta layer which adds another meta layer as a component layer -TEST(MetaLayers, MetaLayerWhichAddsMetaLayer) { - FrameworkEnvironment env; - env.add_icd(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA); - const char* meta_layer_name = "VK_LAYER_MetaTestLayer"; - const char* meta_meta_layer_name = "VK_LAYER_MetaMetaTestLayer"; - const char* regular_layer_name = "VK_LAYER_TestLayer"; - env.add_explicit_layer( - {}, ManifestLayer{}.add_layer( - ManifestLayer::LayerDescription{}.set_name(regular_layer_name).set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2))); - - env.add_explicit_layer( - {}, ManifestLayer{}.set_file_format_version({1, 1, 2}).add_layer( - ManifestLayer::LayerDescription{}.set_name(meta_layer_name).add_component_layers({regular_layer_name}))); - - env.add_explicit_layer({}, ManifestLayer{}.set_file_format_version({1, 1, 2}).add_layer( - ManifestLayer::LayerDescription{} - .set_name(meta_meta_layer_name) - .add_component_layers({meta_layer_name, regular_layer_name}))); - - auto layer_props = env.GetLayerProperties(3); - EXPECT_TRUE(check_permutation({regular_layer_name, meta_layer_name, meta_meta_layer_name}, layer_props)); - - auto extensions = env.GetInstanceExtensions(4); - EXPECT_TRUE(string_eq(extensions.at(0).extensionName, VK_EXT_DEBUG_REPORT_EXTENSION_NAME)); - EXPECT_TRUE(string_eq(extensions.at(1).extensionName, VK_EXT_DEBUG_UTILS_EXTENSION_NAME)); - EXPECT_TRUE(string_eq(extensions.at(2).extensionName, VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME)); - EXPECT_TRUE(string_eq(extensions.at(3).extensionName, VK_LUNARG_DIRECT_DRIVER_LOADING_EXTENSION_NAME)); - - InstWrapper inst{env.vulkan_functions}; - inst.create_info.add_layer(meta_layer_name); - FillDebugUtilsCreateDetails(inst.create_info, env.debug_log); - inst.CheckCreate(); - ASSERT_TRUE(env.debug_log.find(std::string("verify_meta_layer_component_layers: Adding meta-layer ") + meta_meta_layer_name + - " which also contains meta-layer " + meta_layer_name)); -} - -// A meta-layer cycle discovered through normal manifest scanning (VK_LAYER_PATH / standard layer discovery, -// not a settings.json file) exercises verify_meta_layer_component_layers's already_checked_meta_layers guard, -// as opposed to CyclicMetaLayerComponentDoesNotRecurse (loader_settings_tests.cpp) which exercises -// loader_add_meta_layer's is_being_expanded guard used only by the settings-file path. -TEST(MetaLayers, CyclicMetaLayerComponentsFoundThroughManifestDiscovery) { - FrameworkEnvironment env; - env.add_icd(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA); - - const char* meta_a = "VK_LAYER_meta_A"; - const char* meta_b = "VK_LAYER_meta_B"; - env.add_explicit_layer({}, ManifestLayer{}.set_file_format_version({1, 2, 0}).add_layer( - ManifestLayer::LayerDescription{}.set_name(meta_a).add_component_layer(meta_b))); - env.add_explicit_layer({}, ManifestLayer{}.set_file_format_version({1, 2, 0}).add_layer( - ManifestLayer::LayerDescription{}.set_name(meta_b).add_component_layer(meta_a))); - - InstWrapper inst{env.vulkan_functions}; - FillDebugUtilsCreateDetails(inst.create_info, env.debug_log); - // Before the already_checked_meta_layers guard, this recursion would stack overflow instead of returning. - inst.CheckCreate(); - ASSERT_TRUE(env.debug_log.find("Recursive dependency between Meta-layer")); - - // Both cyclic meta-layers are considered invalid and are dropped from the instance layer list entirely. - env.GetLayerProperties(0); -} - -// Stress test for a long, strictly acyclic chain of meta-layers: meta_0 -> meta_1 -> ... -> meta_{N-1} -> a -// real (non-meta) terminal layer. Neither loader_add_meta_layer nor verify_meta_layer_component_layers has a -// maximum-depth guard - only a cycle guard - so both recurse to a depth proportional to the chain length. This -// test does not assert a depth limit (there isn't one); it exists to make that unbounded-recursion risk area -// measurable, and to catch a regression if a future change makes the existing cycle guards ineffective (which -// would turn this bounded, acyclic chain into a crash/hang instead of a successful, if deep, CheckCreate()). -// Chain depths in the hundreds were observed to crash (stack overflow) on some CI platforms with smaller -// default thread stacks than Linux/x86_64, so a conservative depth is used here - enough to exercise several -// tens of levels of mutual recursion without depending on a platform-specific stack size. -TEST(MetaLayers, DeepAcyclicMetaLayerChainDoesNotCrash) { - FrameworkEnvironment env; - env.add_icd(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA); - - const int chain_depth = 50; - const char* real_layer_name = "VK_LAYER_TestLayer"; - env.add_explicit_layer( - {}, ManifestLayer{}.add_layer( - ManifestLayer::LayerDescription{}.set_name(real_layer_name).set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2))); - - std::vector meta_layer_names; - meta_layer_names.reserve(chain_depth); - for (int i = 0; i < chain_depth; i++) { - meta_layer_names.push_back(std::string("VK_LAYER_meta_chain_") + std::to_string(i)); - } - for (int i = 0; i < chain_depth; i++) { - const std::string& next_layer = (i + 1 < chain_depth) ? meta_layer_names[i + 1] : std::string(real_layer_name); - env.add_explicit_layer( - {}, ManifestLayer{}.set_file_format_version({1, 2, 0}).add_layer( - ManifestLayer::LayerDescription{}.set_name(meta_layer_names[i].c_str()).add_component_layer(next_layer))); - } - - InstWrapper inst{env.vulkan_functions}; - inst.create_info.add_layer(meta_layer_names[0].c_str()); - FillDebugUtilsCreateDetails(inst.create_info, env.debug_log); - inst.CheckCreate(); - - // The whole chain should have been found valid and expanded down to the real terminal layer. - env.GetLayerProperties(static_cast(chain_depth) + 1); -} - -TEST(MetaLayers, InstanceExtensionInComponentLayer) { - FrameworkEnvironment env; - env.add_icd(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA).add_physical_device({}); - - const char* meta_layer_name = "VK_LAYER_MetaTestLayer"; - const char* regular_layer_name = "VK_LAYER_TestLayer"; - const char* instance_ext_name = "VK_EXT_headless_surface"; - env.add_explicit_layer({}, ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} - .set_name(regular_layer_name) - .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) - .add_instance_extension({instance_ext_name}))); - env.add_explicit_layer( - {}, ManifestLayer{}.set_file_format_version({1, 1, 2}).add_layer( - ManifestLayer::LayerDescription{}.set_name(meta_layer_name).add_component_layers({regular_layer_name}))); - - auto extensions = env.GetInstanceExtensions(1, meta_layer_name); - EXPECT_TRUE(string_eq(extensions[0].extensionName, instance_ext_name)); -} - -TEST(MetaLayers, DeviceExtensionInComponentLayer) { - FrameworkEnvironment env; - env.add_icd(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA).add_physical_device({}); - - const char* meta_layer_name = "VK_LAYER_MetaTestLayer"; - const char* regular_layer_name = "VK_LAYER_TestLayer"; - const char* device_ext_name = "VK_EXT_fake_dev_ext"; - env.add_explicit_layer({}, ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} - .set_name(regular_layer_name) - .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) - .add_device_extension({device_ext_name}))); - env.add_explicit_layer( - {}, ManifestLayer{}.set_file_format_version({1, 1, 2}).add_layer( - ManifestLayer::LayerDescription{}.set_name(meta_layer_name).add_component_layers({regular_layer_name}))); - - ASSERT_NO_FATAL_FAILURE(env.GetInstanceExtensions(0, meta_layer_name)); - - { // layer is not enabled - InstWrapper inst{env.vulkan_functions}; - FillDebugUtilsCreateDetails(inst.create_info, env.debug_log); - inst.CheckCreate(); - ASSERT_TRUE(env.debug_log.find(std::string("Meta-layer ") + meta_layer_name + " component layer " + regular_layer_name + - " adding device extension " + device_ext_name)); - - auto extensions = inst.EnumerateLayerDeviceExtensions(inst.GetPhysDev(), meta_layer_name, 1); - EXPECT_TRUE(string_eq(extensions.at(0).extensionName, device_ext_name)); - } - { // layer is enabled - InstWrapper inst{env.vulkan_functions}; - inst.create_info.add_layer(meta_layer_name); - FillDebugUtilsCreateDetails(inst.create_info, env.debug_log); - inst.CheckCreate(); - ASSERT_TRUE(env.debug_log.find(std::string("Meta-layer ") + meta_layer_name + " component layer " + regular_layer_name + - " adding device extension " + device_ext_name)); - - auto extensions = inst.EnumerateLayerDeviceExtensions(inst.GetPhysDev(), meta_layer_name, 1); - EXPECT_TRUE(string_eq(extensions.at(0).extensionName, device_ext_name)); - } -} - -// Override meta layer missing disable environment variable still enables the layer -TEST(OverrideMetaLayer, InvalidDisableEnvironment) { - FrameworkEnvironment env; - env.add_icd(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA).add_physical_device({}); - - const char* regular_layer_name = "VK_LAYER_TestLayer"; - env.add_explicit_layer({}, ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} - .set_name(regular_layer_name) - .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) - .set_api_version(VK_MAKE_API_VERSION(0, 1, 1, 0)) - .add_device_extension({"NeverGonnaLetYouDown"}))); - - env.add_implicit_layer( - {}, ManifestLayer{}.set_file_format_version({1, 1, 2}).add_layer(ManifestLayer::LayerDescription{} - .set_name(lunarg_meta_layer_name) - .set_api_version(VK_MAKE_API_VERSION(0, 1, 1, 0)) - .add_component_layers({regular_layer_name}))); - - auto layer_props = env.GetLayerProperties(1); - EXPECT_TRUE(string_eq(layer_props[0].layerName, regular_layer_name)); - - InstWrapper inst{env.vulkan_functions}; - inst.CheckCreate(); -} - -// Override meta layer whose version is less than the api version of the instance -TEST(OverrideMetaLayer, OlderVersionThanInstance) { - FrameworkEnvironment env; - env.add_icd(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA).add_physical_device({}); - - const char* regular_layer_name = "VK_LAYER_TestLayer"; - env.add_explicit_layer({}, ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} - .set_name(regular_layer_name) - .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) - .set_api_version(VK_MAKE_API_VERSION(0, 1, 1, 0)) - .add_device_extension({"NeverGonnaLetYouDown"}))); - - env.add_implicit_layer( - {}, ManifestLayer{}.set_file_format_version({1, 1, 2}).add_layer(ManifestLayer::LayerDescription{} - .set_name(lunarg_meta_layer_name) - .set_api_version(VK_MAKE_API_VERSION(0, 1, 1, 0)) - .set_disable_environment("DisableMeIfYouCan") - .add_component_layers({regular_layer_name}))); - { // global functions - auto layer_props = env.GetLayerProperties(2); - EXPECT_TRUE(check_permutation({regular_layer_name, lunarg_meta_layer_name}, layer_props)); - } - { // 1.1 instance - InstWrapper inst{env.vulkan_functions}; - inst.create_info.api_version = VK_API_VERSION_1_1; - inst.CheckCreate(); - auto layer_props = inst.GetActiveLayers(inst.GetPhysDev(), 2); - ASSERT_TRUE(string_eq(layer_props[0].layerName, regular_layer_name)); - ASSERT_TRUE(string_eq(layer_props[1].layerName, lunarg_meta_layer_name)); - } - { // 1.3 instance - - InstWrapper inst{env.vulkan_functions}; - inst.create_info.api_version = VK_API_VERSION_1_3; - inst.CheckCreate(); - auto layer_props = inst.GetActiveLayers(inst.GetPhysDev(), 2); - - ASSERT_TRUE(string_eq(layer_props[0].layerName, regular_layer_name)); - ASSERT_TRUE(string_eq(layer_props[1].layerName, lunarg_meta_layer_name)); - } -} - -TEST(OverrideMetaLayer, OlderMetaLayerWithNewerInstanceVersion) { - FrameworkEnvironment env; - env.add_icd(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA).add_physical_device({}); - - const char* regular_layer_name = "VK_LAYER_TestLayer"; - env.add_explicit_layer( - {}, ManifestLayer{}.set_file_format_version({1, 2, 0}).add_layer(ManifestLayer::LayerDescription{} - .set_name(regular_layer_name) - .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) - .set_api_version(VK_MAKE_API_VERSION(0, 1, 1, 0)))); - - env.add_implicit_layer( - {}, ManifestLayer{}.set_file_format_version({1, 2, 0}).add_layer(ManifestLayer::LayerDescription{} - .set_name(lunarg_meta_layer_name) - .set_api_version(VK_MAKE_API_VERSION(0, 1, 1, 0)) - .add_component_layers({regular_layer_name}) - .set_disable_environment("DisableMeIfYouCan"))); - { // global functions - auto layer_props = env.GetLayerProperties(2); - EXPECT_TRUE(check_permutation({regular_layer_name, lunarg_meta_layer_name}, layer_props)); - } - { - // 1.1 instance - InstWrapper inst{env.vulkan_functions}; - inst.create_info.set_api_version(1, 1, 0); - inst.CheckCreate(); - auto layer_props = inst.GetActiveLayers(inst.GetPhysDev(), 2); - ASSERT_TRUE(string_eq(layer_props[0].layerName, regular_layer_name)); - ASSERT_TRUE(string_eq(layer_props[1].layerName, lunarg_meta_layer_name)); - } - - { - // 1.3 instance - InstWrapper inst{env.vulkan_functions}; - inst.create_info.set_api_version(1, 3, 0); - inst.CheckCreate(); - auto layer_props = inst.GetActiveLayers(inst.GetPhysDev(), 2); - ASSERT_TRUE(string_eq(layer_props[0].layerName, regular_layer_name)); - ASSERT_TRUE(string_eq(layer_props[1].layerName, lunarg_meta_layer_name)); - } -} - -TEST(OverrideMetaLayer, NewerComponentLayerInMetaLayer) { - FrameworkEnvironment env; - env.add_icd(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA).add_physical_device({}); - - const char* regular_layer_name = "VK_LAYER_TestLayer"; - env.add_explicit_layer( - {}, ManifestLayer{}.set_file_format_version({1, 2, 0}).add_layer(ManifestLayer::LayerDescription{} - .set_name(regular_layer_name) - .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) - .set_api_version(VK_API_VERSION_1_2))); - - env.add_implicit_layer( - {}, ManifestLayer{}.set_file_format_version({1, 2, 0}).add_layer(ManifestLayer::LayerDescription{} - .set_name(lunarg_meta_layer_name) - .set_api_version(VK_MAKE_API_VERSION(0, 1, 1, 0)) - .add_component_layers({regular_layer_name}) - .set_disable_environment("DisableMeIfYouCan"))); - - { // global functions - auto layer_props = env.GetLayerProperties(2); - // Expect the explicit layer to still be found - EXPECT_TRUE(check_permutation({regular_layer_name, lunarg_meta_layer_name}, layer_props)); - } - { - // 1.1 instance - InstWrapper inst{env.vulkan_functions}; - FillDebugUtilsCreateDetails(inst.create_info, env.debug_log); - inst.create_info.set_api_version(1, 1, 0); - inst.CheckCreate(); - // Newer component is allowed now - EXPECT_TRUE(env.debug_log.find(std::string("Insert instance layer \"") + regular_layer_name)); - auto layer_props = inst.GetActiveLayers(inst.GetPhysDev(), 2); - EXPECT_TRUE(check_permutation({regular_layer_name, lunarg_meta_layer_name}, layer_props)); - } - env.debug_log.clear(); - - { - // 1.3 instance - InstWrapper inst{env.vulkan_functions}; - FillDebugUtilsCreateDetails(inst.create_info, env.debug_log); - inst.create_info.set_api_version(1, 3, 0); - inst.CheckCreate(); - // Newer component is allowed now - EXPECT_TRUE(env.debug_log.find(std::string("Insert instance layer \"") + regular_layer_name)); - auto layer_props = inst.GetActiveLayers(inst.GetPhysDev(), 2); - - EXPECT_TRUE(check_permutation({regular_layer_name, lunarg_meta_layer_name}, layer_props)); - } -} - -TEST(OverrideMetaLayer, OlderComponentLayerInMetaLayer) { - FrameworkEnvironment env; - env.add_icd(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA).add_physical_device({}); - - const char* regular_layer_name = "VK_LAYER_TestLayer"; - env.add_explicit_layer( - {}, ManifestLayer{}.set_file_format_version({1, 2, 0}).add_layer(ManifestLayer::LayerDescription{} - .set_name(regular_layer_name) - .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) - .set_api_version(VK_MAKE_API_VERSION(0, 1, 0, 0)))); - - env.add_implicit_layer( - {}, ManifestLayer{}.set_file_format_version({1, 2, 0}).add_layer(ManifestLayer::LayerDescription{} - .set_name(lunarg_meta_layer_name) - .set_api_version(VK_MAKE_API_VERSION(0, 1, 1, 0)) - .add_component_layers({regular_layer_name}) - .set_disable_environment("DisableMeIfYouCan"))); - { // global functions - auto layer_props = env.GetLayerProperties(1); - EXPECT_TRUE(string_eq(layer_props[0].layerName, regular_layer_name)); - } - { - // 1.1 instance - InstWrapper inst{env.vulkan_functions}; - FillDebugUtilsCreateDetails(inst.create_info, env.debug_log); - inst.create_info.set_api_version(1, 1, 0); - inst.CheckCreate(); - EXPECT_TRUE( - env.debug_log.find("verify_meta_layer_component_layers: Meta-layer uses API version 1.1, but component layer 0 has API " - "version 1.0 that is lower. Skipping this layer.")); - env.debug_log.clear(); - ASSERT_NO_FATAL_FAILURE(inst.GetActiveLayers(inst.GetPhysDev(), 0)); - } - - { - // 1.2 instance - InstWrapper inst{env.vulkan_functions}; - FillDebugUtilsCreateDetails(inst.create_info, env.debug_log); - inst.create_info.set_api_version(1, 2, 0); - inst.CheckCreate(); - ASSERT_TRUE( - env.debug_log.find("verify_meta_layer_component_layers: Meta-layer uses API version 1.1, but component layer 0 has API " - "version 1.0 that is lower. Skipping this layer.")); - env.debug_log.clear(); - ASSERT_NO_FATAL_FAILURE(inst.GetActiveLayers(inst.GetPhysDev(), 0)); - } -} - -TEST(OverrideMetaLayer, ApplicationEnabledLayerInBlacklist) { - FrameworkEnvironment env; - env.add_icd(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA).add_physical_device({}); - - const char* automatic_regular_layer_name = "VK_LAYER_TestLayer_1"; - const char* manual_regular_layer_name = "VK_LAYER_TestLayer_2"; - env.add_explicit_layer({}, ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} - .set_name(automatic_regular_layer_name) - .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) - .set_api_version(VK_MAKE_API_VERSION(0, 1, 1, 0)))); - env.add_explicit_layer({}, ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} - .set_name(manual_regular_layer_name) - .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) - .set_api_version(VK_MAKE_API_VERSION(0, 1, 1, 0)))); - env.add_implicit_layer( - {}, ManifestLayer{}.set_file_format_version({1, 2, 0}).add_layer(ManifestLayer::LayerDescription{} - .set_name(lunarg_meta_layer_name) - .set_api_version(VK_MAKE_API_VERSION(0, 1, 1, 0)) - .add_component_layer(automatic_regular_layer_name) - .add_blacklisted_layer(manual_regular_layer_name) - .set_disable_environment("DisableMeIfYouCan"))); - { // Check that enumerating the layers returns only the non-blacklisted layers + override layer - auto layer_props = env.GetLayerProperties(2); - ASSERT_TRUE(check_permutation({automatic_regular_layer_name, lunarg_meta_layer_name}, layer_props)); - } - { - // enable the layer in the blacklist - InstWrapper inst{env.vulkan_functions}; - FillDebugUtilsCreateDetails(inst.create_info, env.debug_log); - inst.create_info.add_layer(manual_regular_layer_name); - inst.CheckCreate(VK_ERROR_LAYER_NOT_PRESENT); - ASSERT_TRUE(env.debug_log.find(std::string("loader_remove_layers_in_blacklist: Override layer is active and layer ") + - manual_regular_layer_name + - " is in the blacklist inside of it. Removing that layer from current layer list.")); - env.debug_log.clear(); - } - { // dont enable the layer in the blacklist - InstWrapper inst{env.vulkan_functions}; - FillDebugUtilsCreateDetails(inst.create_info, env.debug_log); - inst.CheckCreate(); - ASSERT_TRUE(env.debug_log.find(std::string("loader_remove_layers_in_blacklist: Override layer is active and layer ") + - manual_regular_layer_name + - " is in the blacklist inside of it. Removing that layer from current layer list.")); - env.debug_log.clear(); - auto layer_props = inst.GetActiveLayers(inst.GetPhysDev(), 2); - ASSERT_TRUE(check_permutation({automatic_regular_layer_name, lunarg_meta_layer_name}, layer_props)); - } -} - -TEST(OverrideMetaLayer, BasicOverridePaths) { - FrameworkEnvironment env; - env.add_icd(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA).add_physical_device({}); - - auto& override_layer_folder = env.get_folder(ManifestLocation::override_layer); - - const char* regular_layer_name = "VK_LAYER_TestLayer_1"; - override_layer_folder.write_manifest("regular_test_layer.json", - ManifestLayer{} - .add_layer(ManifestLayer::LayerDescription{} - .set_name(regular_layer_name) - .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) - .set_api_version(VK_MAKE_API_VERSION(0, 1, 1, 0))) - .get_manifest_str()); - env.add_implicit_layer( - {}, ManifestLayer{}.set_file_format_version({1, 2, 0}).add_layer(ManifestLayer::LayerDescription{} - .set_name(lunarg_meta_layer_name) - .set_api_version(VK_MAKE_API_VERSION(0, 1, 1, 0)) - .add_component_layer(regular_layer_name) - .set_disable_environment("DisableMeIfYouCan") - .add_override_path(override_layer_folder.location()))); - - InstWrapper inst{env.vulkan_functions}; - inst.create_info.set_api_version(1, 1, 0); - FillDebugUtilsCreateDetails(inst.create_info, env.debug_log); - inst.CheckCreate(); - ASSERT_TRUE(env.debug_log.find(std::string("Insert instance layer \"") + regular_layer_name)); - env.layers.clear(); -} - -TEST(OverrideMetaLayer, BasicOverridePathsIgnoreOtherLayers) { - FrameworkEnvironment env; - env.add_icd(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA).add_physical_device({}); - - auto& override_layer_folder = env.get_folder(ManifestLocation::override_layer); - - const char* regular_layer_name = "VK_LAYER_TestLayer"; - env.add_explicit_layer( - {}, ManifestLayer{}.set_file_format_version({1, 2, 0}).add_layer(ManifestLayer::LayerDescription{} - .set_name(regular_layer_name) - .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) - .set_api_version(VK_MAKE_API_VERSION(0, 1, 0, 0)))); - - const char* special_layer_name = "VK_LAYER_TestLayer_1"; - override_layer_folder.write_manifest("regular_test_layer.json", - ManifestLayer{} - .add_layer(ManifestLayer::LayerDescription{} - .set_name(special_layer_name) - .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) - .set_api_version(VK_MAKE_API_VERSION(0, 1, 1, 0))) - .get_manifest_str()); - env.add_implicit_layer( - {}, ManifestLayer{}.set_file_format_version({1, 2, 0}).add_layer(ManifestLayer::LayerDescription{} - .set_name(lunarg_meta_layer_name) - .set_api_version(VK_MAKE_API_VERSION(0, 1, 1, 0)) - .add_component_layer(special_layer_name) - .set_disable_environment("DisableMeIfYouCan") - .add_override_path(override_layer_folder.location()))); - - InstWrapper inst{env.vulkan_functions}; - inst.create_info.set_api_version(1, 1, 0); - inst.create_info.add_layer(regular_layer_name); - FillDebugUtilsCreateDetails(inst.create_info, env.debug_log); - inst.CheckCreate(VK_ERROR_LAYER_NOT_PRESENT); - ASSERT_FALSE(env.debug_log.find(std::string("Insert instance layer \"") + regular_layer_name)); - env.layers.clear(); -} - -TEST(OverrideMetaLayer, OverridePathsInteractionWithVK_LAYER_PATH) { - FrameworkEnvironment env; - env.add_icd(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA).add_physical_device({}); - - // add explicit layer to VK_LAYER_PATH folder - const char* env_var_layer_name = "VK_LAYER_env_var_set_path"; - env.add_explicit_layer( - ManifestOptions{}.set_discovery_type(ManifestDiscoveryType::env_var), - ManifestLayer{}.set_file_format_version({1, 2, 0}).add_layer(ManifestLayer::LayerDescription{} - .set_name(env_var_layer_name) - .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) - .set_api_version(VK_MAKE_API_VERSION(0, 1, 0, 0)))); - - // add layer to regular explicit layer folder - const char* regular_layer_name = "VK_LAYER_regular_layer_path"; - env.add_explicit_layer(ManifestOptions{}.set_discovery_type(ManifestDiscoveryType::override_folder), - ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} - .set_name(regular_layer_name) - .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) - .set_api_version(VK_MAKE_API_VERSION(0, 1, 1, 0)))); - - env.add_implicit_layer({}, ManifestLayer{}.set_file_format_version({1, 2, 0}).add_layer( - ManifestLayer::LayerDescription{} - .set_name(lunarg_meta_layer_name) - .set_api_version(VK_MAKE_API_VERSION(0, 1, 1, 0)) - .add_component_layer(regular_layer_name) - .set_disable_environment("DisableMeIfYouCan") - .add_override_path(env.get_folder(ManifestLocation::override_layer).location()))); - - auto meta_layer_path = env.get_folder(ManifestLocation::override_layer).location(); - - InstWrapper inst{env.vulkan_functions}; - inst.create_info.set_api_version(1, 1, 0); - inst.create_info.add_layer(env_var_layer_name); - FillDebugUtilsCreateDetails(inst.create_info, env.debug_log); - inst.CheckCreate(VK_ERROR_LAYER_NOT_PRESENT); - ASSERT_FALSE(env.debug_log.find(std::string("Insert instance layer \"") + env_var_layer_name)); - ASSERT_TRUE(env.debug_log.find( - std::string("Ignoring VK_LAYER_PATH. The Override layer is active and has override paths set, which takes priority. " - "VK_LAYER_PATH is set to ") + - env.env_var_vk_layer_paths.value())); - ASSERT_TRUE(env.debug_log.find("Override layer has override path " + meta_layer_path.string())); - - env.layers.clear(); -} - -// Make sure that implicit layers not in the override paths aren't found by mistake -TEST(OverrideMetaLayer, OverridePathsEnableImplicitLayerInDefaultPaths) { - FrameworkEnvironment env; - env.add_icd(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA).add_physical_device({}); - - auto& override_layer_folder = env.get_folder(ManifestLocation::override_layer); - - const char* implicit_layer_name = "VK_LAYER_ImplicitLayer"; - env.add_implicit_layer( - {}, ManifestLayer{}.set_file_format_version({1, 2, 0}).add_layer(ManifestLayer::LayerDescription{} - .set_name(implicit_layer_name) - .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) - .set_api_version(VK_MAKE_API_VERSION(0, 1, 0, 0)))); - - const char* regular_layer_name = "VK_LAYER_TestLayer_1"; - override_layer_folder.write_manifest("regular_test_layer.json", - ManifestLayer{} - .add_layer(ManifestLayer::LayerDescription{} - .set_name(regular_layer_name) - .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) - .set_api_version(VK_MAKE_API_VERSION(0, 1, 1, 0))) - .get_manifest_str()); - env.add_implicit_layer({}, ManifestLayer{}.set_file_format_version({1, 2, 0}).add_layer( - ManifestLayer::LayerDescription{} - .set_name(lunarg_meta_layer_name) - .set_api_version(VK_MAKE_API_VERSION(0, 1, 1, 0)) - .add_component_layers({regular_layer_name, implicit_layer_name}) - .set_disable_environment("DisableMeIfYouCan") - .add_override_path(override_layer_folder.location()))); - - InstWrapper inst{env.vulkan_functions}; - FillDebugUtilsCreateDetails(inst.create_info, env.debug_log); - inst.create_info.set_api_version(1, 1, 0); - inst.CheckCreate(); - ASSERT_FALSE(env.debug_log.find(std::string("Insert instance layer \"") + implicit_layer_name)); - ASSERT_TRUE( - env.debug_log.find("Removing meta-layer VK_LAYER_LUNARG_override from instance layer list since it appears invalid.")); - env.layers.clear(); -} - -TEST(OverrideMetaLayer, ManifestFileFormatVersionTooOld) { - FrameworkEnvironment env; - env.add_icd(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA).add_physical_device({}); - - auto& override_layer_folder = env.get_folder(ManifestLocation::override_layer); - - const char* regular_layer_name = "VK_LAYER_TestLayer_1"; - override_layer_folder.write_manifest("regular_test_layer.json", - ManifestLayer{} - .add_layer(ManifestLayer::LayerDescription{} - .set_name(regular_layer_name) - .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) - .set_api_version(VK_MAKE_API_VERSION(0, 1, 1, 0))) - .get_manifest_str()); - env.add_implicit_layer( - {}, ManifestLayer{}.set_file_format_version({1, 0, 0}).add_layer(ManifestLayer::LayerDescription{} - .set_name(lunarg_meta_layer_name) - .set_api_version(VK_MAKE_API_VERSION(0, 1, 1, 0)) - .add_component_layer(regular_layer_name) - .set_disable_environment("DisableMeIfYouCan") - .add_override_path(override_layer_folder.location()))); - - InstWrapper inst{env.vulkan_functions}; - inst.create_info.set_api_version(1, 1, 0); - FillDebugUtilsCreateDetails(inst.create_info, env.debug_log); - inst.CheckCreate(); - ASSERT_TRUE(env.debug_log.find(std::string("Insert instance layer \"") + regular_layer_name)); - ASSERT_TRUE(env.debug_log.find(std::string("Layer \"") + lunarg_meta_layer_name + - "\" contains meta-layer-specific override paths, but using older JSON file version.")); - env.layers.clear(); -} - -// app_key contains test executable name, should activate the override layer -TEST(OverrideMetaLayer, AppKeysDoesContainCurrentApplication) { - FrameworkEnvironment env; - env.add_icd(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA).add_physical_device({}); - - const char* regular_layer_name = "VK_LAYER_TestLayer"; - env.add_explicit_layer( - {}, ManifestLayer{}.set_file_format_version({1, 2, 0}).add_layer( - ManifestLayer::LayerDescription{}.set_name(regular_layer_name).set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2))); - - std::string cur_path = test_platform_executable_path(); - - env.add_implicit_layer( - {}, ManifestLayer{}.set_file_format_version({1, 2, 0}).add_layer(ManifestLayer::LayerDescription{} - .set_name(lunarg_meta_layer_name) - .add_component_layers({regular_layer_name}) - .set_disable_environment("DisableMeIfYouCan") - .add_app_key(cur_path))); - { // global functions - auto layer_props = env.GetLayerProperties(2); - EXPECT_TRUE(check_permutation({regular_layer_name, lunarg_meta_layer_name}, layer_props)); - } - { - // instance - InstWrapper inst{env.vulkan_functions}; - inst.CheckCreate(); - auto layer_props = inst.GetActiveLayers(inst.GetPhysDev(), 2); - EXPECT_TRUE(check_permutation({regular_layer_name, lunarg_meta_layer_name}, layer_props)); - } -} - -// app_key contains random strings, should not activate the override layer -TEST(OverrideMetaLayer, AppKeysDoesNotContainCurrentApplication) { - FrameworkEnvironment env; - env.add_icd(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA).add_physical_device({}); - - const char* regular_layer_name = "VK_LAYER_TestLayer"; - env.add_explicit_layer( - {}, ManifestLayer{}.set_file_format_version({1, 2, 0}).add_layer( - ManifestLayer::LayerDescription{}.set_name(regular_layer_name).set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2))); - - env.add_implicit_layer({}, ManifestLayer{}.set_file_format_version({1, 2, 0}).add_layer( - ManifestLayer::LayerDescription{} - .set_name(lunarg_meta_layer_name) - .add_component_layers({regular_layer_name}) - .set_disable_environment("DisableMeIfYouCan") - .add_app_keys({"/Hello", "Hi", "./../Uh-oh", "C:/Windows/Only"}))); - { // global functions - auto layer_props = env.GetLayerProperties(1); - EXPECT_TRUE(string_eq(layer_props[0].layerName, regular_layer_name)); - } - { - // instance - InstWrapper inst{env.vulkan_functions}; - inst.CheckCreate(); - ASSERT_NO_FATAL_FAILURE(inst.GetActiveLayers(inst.GetPhysDev(), 0)); - } -} - -TEST(OverrideMetaLayer, RunningWithRegularPrivilegesFromSecureLocation) { - FrameworkEnvironment env; - env.add_icd(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA).add_physical_device({}); - - auto& override_layer_folder = env.get_folder(ManifestLocation::override_layer); - - const char* regular_layer_name = "VK_LAYER_TestLayer_1"; - override_layer_folder.write_manifest("regular_test_layer.json", - ManifestLayer{} - .add_layer(ManifestLayer::LayerDescription{} - .set_name(regular_layer_name) - .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) - .set_api_version(VK_MAKE_API_VERSION(0, 1, 1, 0))) - .get_manifest_str()); - auto override_folder_location = override_layer_folder.location().string(); - env.add_implicit_layer( - {}, ManifestLayer{}.set_file_format_version({1, 2, 0}).add_layer(ManifestLayer::LayerDescription{} - .set_name(lunarg_meta_layer_name) - .set_api_version(VK_MAKE_API_VERSION(0, 1, 1, 0)) - .add_component_layer(regular_layer_name) - .set_disable_environment("DisableMeIfYouCan") - .add_override_path(override_layer_folder.location()))); - - // try with no elevated privileges - auto layer_props = env.GetLayerProperties(2); - EXPECT_TRUE(check_permutation({regular_layer_name, lunarg_meta_layer_name}, layer_props)); - - InstWrapper inst{env.vulkan_functions}; - inst.create_info.set_api_version(1, 1, 0); - FillDebugUtilsCreateDetails(inst.create_info, env.debug_log); - inst.CheckCreate(); - ASSERT_TRUE(env.debug_log.find(std::string("Insert instance layer \"") + regular_layer_name)); - auto active_layer_props = inst.GetActiveLayers(inst.GetPhysDev(), 2); - EXPECT_TRUE(check_permutation({regular_layer_name, lunarg_meta_layer_name}, layer_props)); -} - -TEST(OverrideMetaLayer, RunningWithElevatedPrivilegesFromSecureLocation) { - FrameworkEnvironment env{FrameworkSettings{}.set_run_as_if_with_elevated_privileges(true)}; - env.add_icd(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA).add_physical_device({}); - - auto& override_layer_folder = env.get_folder(ManifestLocation::override_layer); - - const char* regular_layer_name = "VK_LAYER_TestLayer_1"; - override_layer_folder.write_manifest("regular_test_layer.json", - ManifestLayer{} - .add_layer(ManifestLayer::LayerDescription{} - .set_name(regular_layer_name) - .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) - .set_api_version(VK_MAKE_API_VERSION(0, 1, 1, 0))) - .get_manifest_str()); - auto override_folder_location = override_layer_folder.location().string(); - env.add_implicit_layer( - {}, ManifestLayer{}.set_file_format_version({1, 2, 0}).add_layer(ManifestLayer::LayerDescription{} - .set_name(lunarg_meta_layer_name) - .set_api_version(VK_MAKE_API_VERSION(0, 1, 1, 0)) - .add_component_layer(regular_layer_name) - .set_disable_environment("DisableMeIfYouCan") - .add_override_path(override_layer_folder.location()))); - - // try with elevated privileges - auto layer_props = env.GetLayerProperties(2); - EXPECT_TRUE(check_permutation({regular_layer_name, lunarg_meta_layer_name}, layer_props)); + EnvVarWrapper inst_layers_env_var{"VK_INSTANCE_LAYERS"}; + inst_layers_env_var.add_to_list(layer_name); InstWrapper inst{env.vulkan_functions}; - inst.create_info.set_api_version(1, 1, 0); - FillDebugUtilsCreateDetails(inst.create_info, env.debug_log); inst.CheckCreate(); - ASSERT_TRUE(env.debug_log.find(std::string("Insert instance layer \"") + regular_layer_name)); - auto active_layer_props = inst.GetActiveLayers(inst.GetPhysDev(), 2); - EXPECT_TRUE(check_permutation({regular_layer_name, lunarg_meta_layer_name}, active_layer_props)); + + // Expect the first layer added to be found + auto enabled_layer_props = inst.GetActiveLayers(inst.GetPhysDev(), 1); + ASSERT_TRUE(string_eq(layer_name, enabled_layer_props[0].layerName)); + ASSERT_TRUE(string_eq(layer1.description.c_str(), enabled_layer_props[0].description)); } -// Override layer should not be found and thus not loaded when running with elevated privileges -TEST(OverrideMetaLayer, RunningWithRegularPrivilegesFromUnsecureLocation) { +TEST(ImplicitLayers, DuplicateLayersInVK_ADD_IMPLICIT_LAYER_PATH) { FrameworkEnvironment env; env.add_icd(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA).add_physical_device({}); - auto& override_layer_folder = env.get_folder(ManifestLocation::override_layer); + const char* same_layer_name_1 = "VK_LAYER_RegularLayer1"; + env.add_implicit_layer(ManifestOptions{} + // use override folder as just a folder and manually set the VK_ADD_IMPLICIT_LAYER_PATH env-var to it + .set_discovery_type(ManifestDiscoveryType::overflow_folder), + ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} + .set_name(same_layer_name_1) + .set_description("actually_layer_1") + .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) + .set_disable_environment("Red"))); + auto& layer1 = env.get_test_layer(0); + layer1.set_description("actually_layer_1"); + layer1.set_make_spurious_log_in_create_instance("actually_layer_1"); + env.add_env_var_vk_implicit_layer_paths.add_to_list(env.get_folder(ManifestLocation::overflow).location()); - const char* regular_layer_name = "VK_LAYER_TestLayer_1"; - override_layer_folder.write_manifest("regular_test_layer.json", - ManifestLayer{} - .add_layer(ManifestLayer::LayerDescription{} - .set_name(regular_layer_name) - .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) - .set_api_version(VK_MAKE_API_VERSION(0, 1, 1, 0))) - .get_manifest_str()); - env.add_implicit_layer( - ManifestOptions{}.set_discovery_type(ManifestDiscoveryType::unsecured_generic), - ManifestLayer{}.set_file_format_version({1, 2, 0}).add_layer(ManifestLayer::LayerDescription{} - .set_name(lunarg_meta_layer_name) - .set_api_version(VK_MAKE_API_VERSION(0, 1, 1, 0)) - .add_component_layer(regular_layer_name) - .set_disable_environment("DisableMeIfYouCan") - .add_override_path(override_layer_folder.location()))); + env.add_implicit_layer(ManifestOptions{}.set_discovery_type(ManifestDiscoveryType::add_env_var).set_is_dir(true), + ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} + .set_name(same_layer_name_1) + .set_description("actually_layer_2") + .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) + .set_disable_environment("Blue"))); + auto& layer2 = env.get_test_layer(1); + layer2.set_description("actually_layer_2"); + layer2.set_make_spurious_log_in_create_instance("actually_layer_2"); - auto layer_props = env.GetLayerProperties(2); - EXPECT_TRUE(check_permutation({regular_layer_name, lunarg_meta_layer_name}, layer_props)); + auto layer_props = env.GetLayerProperties(1); + ASSERT_TRUE(string_eq(same_layer_name_1, layer_props[0].layerName)); + ASSERT_TRUE(string_eq(layer1.description.c_str(), layer_props[0].description)); InstWrapper inst{env.vulkan_functions}; - inst.create_info.set_api_version(1, 1, 0); FillDebugUtilsCreateDetails(inst.create_info, env.debug_log); inst.CheckCreate(); - ASSERT_TRUE(env.debug_log.find(std::string("Insert instance layer \"") + regular_layer_name)); - env.debug_log.clear(); - auto active_layer_props = inst.GetActiveLayers(inst.GetPhysDev(), 2); - EXPECT_TRUE(check_permutation({regular_layer_name, lunarg_meta_layer_name}, active_layer_props)); + auto enabled_layer_props = inst.GetActiveLayers(inst.GetPhysDev(), 1); + ASSERT_TRUE(string_eq(same_layer_name_1, enabled_layer_props.at(0).layerName)); + ASSERT_TRUE(string_eq(layer1.description.c_str(), enabled_layer_props.at(0).description)); + ASSERT_TRUE(env.debug_log.find("actually_layer_1")); + ASSERT_FALSE(env.debug_log.find("actually_layer_2")); } -TEST(OverrideMetaLayer, RunningWithElevatedPrivilegesFromUnsecureLocation) { - FrameworkEnvironment env{FrameworkSettings{}.set_run_as_if_with_elevated_privileges(true)}; +TEST(ImplicitLayers, OrderedByVK_INSTANCE_LAYERS) { + FrameworkEnvironment env; env.add_icd(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA).add_physical_device({}); + const char* implicit_layer_name = "VK_LAYER_implicit"; + env.add_implicit_layer({}, ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} + .set_name(implicit_layer_name) - auto& override_layer_folder = env.get_folder(ManifestLocation::override_layer); - - const char* regular_layer_name = "VK_LAYER_TestLayer_1"; - override_layer_folder.write_manifest("regular_test_layer.json", - ManifestLayer{} - .add_layer(ManifestLayer::LayerDescription{} - .set_name(regular_layer_name) - .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) - .set_api_version(VK_MAKE_API_VERSION(0, 1, 1, 0))) - .get_manifest_str()); - env.add_implicit_layer( - ManifestOptions{}.set_discovery_type(ManifestDiscoveryType::unsecured_generic), - ManifestLayer{}.set_file_format_version({1, 2, 0}).add_layer(ManifestLayer::LayerDescription{} - .set_name(lunarg_meta_layer_name) - .set_api_version(VK_MAKE_API_VERSION(0, 1, 1, 0)) - .add_component_layer(regular_layer_name) - .set_disable_environment("DisableMeIfYouCan") - .add_override_path(override_layer_folder.location()))); - - ASSERT_NO_FATAL_FAILURE(env.GetLayerProperties(0)); - - InstWrapper inst{env.vulkan_functions}; - inst.create_info.set_api_version(1, 1, 0); - FillDebugUtilsCreateDetails(inst.create_info, env.debug_log); - inst.CheckCreate(); - ASSERT_FALSE(env.debug_log.find(std::string("Insert instance layer \"") + regular_layer_name)); - ASSERT_NO_FATAL_FAILURE(inst.GetActiveLayers(inst.GetPhysDev(), 0)); + .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) + .set_disable_environment("foo"))); + const char* explicit_layer_name = "VK_LAYER_explicit"; + env.add_explicit_layer( + {}, ManifestLayer{}.add_layer( + ManifestLayer::LayerDescription{}.set_name(explicit_layer_name).set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2))); + // Only enable the explicit layer through the env-var + { + EnvVarWrapper env_var("VK_INSTANCE_LAYERS"); + env_var.add_to_list(explicit_layer_name); + InstWrapper inst{env.vulkan_functions}; + inst.CheckCreate(); + auto active_layers = inst.GetActiveLayers(inst.GetPhysDev(), 2); + ASSERT_TRUE(string_eq(active_layers.at(0).layerName, implicit_layer_name)); + ASSERT_TRUE(string_eq(active_layers.at(1).layerName, explicit_layer_name)); + } + // Enable both layers, implicit then explicit + { + EnvVarWrapper env_var("VK_INSTANCE_LAYERS"); + env_var.add_to_list(implicit_layer_name); + env_var.add_to_list(explicit_layer_name); + InstWrapper inst{env.vulkan_functions}; + inst.CheckCreate(); + auto active_layers = inst.GetActiveLayers(inst.GetPhysDev(), 2); + ASSERT_TRUE(string_eq(active_layers.at(0).layerName, implicit_layer_name)); + ASSERT_TRUE(string_eq(active_layers.at(1).layerName, explicit_layer_name)); + } + // Enable both layers, explicit then implicit + { + EnvVarWrapper env_var("VK_INSTANCE_LAYERS"); + env_var.add_to_list(explicit_layer_name); + env_var.add_to_list(implicit_layer_name); + InstWrapper inst{env.vulkan_functions}; + inst.CheckCreate(); + auto active_layers = inst.GetActiveLayers(inst.GetPhysDev(), 2); + ASSERT_TRUE(string_eq(active_layers.at(0).layerName, explicit_layer_name)); + ASSERT_TRUE(string_eq(active_layers.at(1).layerName, implicit_layer_name)); + } } -// Makes sure explicit layers can't override pre-instance functions even if enabled by the override layer +// Makes sure explicit layers can't override pre-instance functions even if enabled by an env-var TEST(ExplicitLayers, OverridePreInstanceFunctions) { FrameworkEnvironment env; env.add_icd(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA).add_physical_device({}); - const char* explicit_layer_name = "VK_LAYER_enabled_by_override"; - const char* disable_env_var = "DISABLE_ME"; + const char* explicit_layer_name = "VK_LAYER_enabled_by_env_var"; env.add_explicit_layer( {}, ManifestLayer{}.set_file_format_version({1, 1, 2}).add_layer( @@ -2192,15 +1272,11 @@ TEST(ExplicitLayers, OverridePreInstanceFunctions) { layer.set_reported_extension_props(22); layer.set_reported_instance_version(VK_MAKE_API_VERSION(1, 0, 0, 1)); - env.add_implicit_layer( - {}, ManifestLayer{}.set_file_format_version({1, 1, 2}).add_layer(ManifestLayer::LayerDescription{} - .set_name(lunarg_meta_layer_name) - .add_component_layers({explicit_layer_name}) - .set_disable_environment(disable_env_var))); + EnvVarWrapper layers_enable_env_var{"VK_INSTANCE_LAYERS", explicit_layer_name}; uint32_t count = 0; ASSERT_EQ(VK_SUCCESS, env.vulkan_functions.vkEnumerateInstanceLayerProperties(&count, nullptr)); - ASSERT_EQ(count, 2U); + ASSERT_EQ(count, 1U); count = 0; ASSERT_EQ(VK_SUCCESS, env.vulkan_functions.vkEnumerateInstanceExtensionProperties(nullptr, &count, nullptr)); ASSERT_EQ(count, 4U); @@ -2212,15 +1288,14 @@ TEST(ExplicitLayers, OverridePreInstanceFunctions) { InstWrapper inst{env.vulkan_functions}; inst.CheckCreate(); - auto layers = inst.GetActiveLayers(inst.GetPhysDev(), 2); + auto layers = inst.GetActiveLayers(inst.GetPhysDev(), 1); ASSERT_TRUE(string_eq(layers.at(0).layerName, explicit_layer_name)); - ASSERT_TRUE(string_eq(layers.at(1).layerName, lunarg_meta_layer_name)); } TEST(ExplicitLayers, LayerSettingsPreInstanceFunctions) { FrameworkEnvironment env; env.add_icd(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA).add_physical_device({}); - const char* explicit_layer_name = "VK_LAYER_enabled_by_override"; + const char* explicit_layer_name = "VK_LAYER_enabled_by_settings"; env.add_explicit_layer( {}, ManifestLayer{}.set_file_format_version({1, 1, 2}).add_layer( @@ -2271,7 +1346,7 @@ TEST(ExplicitLayers, LayerSettingsPreInstanceFunctions) { TEST(ExplicitLayers, ContainsPreInstanceFunctions) { FrameworkEnvironment env; env.add_icd(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA).add_physical_device({}); - const char* explicit_layer_name = "VK_LAYER_enabled_by_override"; + const char* explicit_layer_name = "VK_LAYER_enabled_by_app"; env.add_explicit_layer( {}, ManifestLayer{}.set_file_format_version({1, 1, 2}).add_layer( @@ -2315,7 +1390,7 @@ TEST(ExplicitLayers, ContainsPreInstanceFunctions) { TEST(ExplicitLayers, CallsPreInstanceFunctionsInCreateInstance) { FrameworkEnvironment env; env.add_icd(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA).add_physical_device({}); - const char* explicit_layer_name = "VK_LAYER_enabled_by_override"; + const char* explicit_layer_name = "VK_LAYER_enabled_by_app"; env.add_explicit_layer( {}, ManifestLayer{}.set_file_format_version({1, 1, 2}).add_layer( @@ -2561,7 +1636,7 @@ TEST(ExplicitLayers, DuplicateLayersInVK_LAYER_PATH) { const char* same_layer_name_1 = "VK_LAYER_RegularLayer1"; env.add_explicit_layer(ManifestOptions{} // use override folder as just a folder and manually set the VK_LAYER_PATH env-var to it - .set_discovery_type(ManifestDiscoveryType::override_folder) + .set_discovery_type(ManifestDiscoveryType::overflow_folder) .set_is_dir(true), ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} .set_name(same_layer_name_1) @@ -2570,7 +1645,7 @@ TEST(ExplicitLayers, DuplicateLayersInVK_LAYER_PATH) { auto& layer1 = env.get_test_layer(0); layer1.set_description("actually_layer_1"); layer1.set_make_spurious_log_in_create_instance("actually_layer_1"); - env.env_var_vk_layer_paths.add_to_list(env.get_folder(ManifestLocation::override_layer).location()); + env.env_var_vk_layer_paths.add_to_list(env.get_folder(ManifestLocation::overflow).location()); env.add_explicit_layer(ManifestOptions{}.set_discovery_type(ManifestDiscoveryType::env_var).set_is_dir(true), ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} @@ -2631,7 +1706,7 @@ TEST(ExplicitLayers, DuplicateLayersInVK_ADD_LAYER_PATH) { const char* same_layer_name_1 = "VK_LAYER_RegularLayer1"; env.add_explicit_layer(ManifestOptions{} // use override folder as just a folder and manually set the VK_ADD_LAYER_PATH env-var to it - .set_discovery_type(ManifestDiscoveryType::override_folder), + .set_discovery_type(ManifestDiscoveryType::overflow_folder), ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} .set_name(same_layer_name_1) .set_description("actually_layer_1") @@ -2639,7 +1714,7 @@ TEST(ExplicitLayers, DuplicateLayersInVK_ADD_LAYER_PATH) { auto& layer1 = env.get_test_layer(0); layer1.set_description("actually_layer_1"); layer1.set_make_spurious_log_in_create_instance("actually_layer_1"); - env.add_env_var_vk_layer_paths.add_to_list(env.get_folder(ManifestLocation::override_layer).location()); + env.add_env_var_vk_layer_paths.add_to_list(env.get_folder(ManifestLocation::overflow).location()); env.add_explicit_layer(ManifestOptions{}.set_discovery_type(ManifestDiscoveryType::add_env_var).set_is_dir(true), ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} @@ -2768,7 +1843,7 @@ TEST(ExplicitLayers, DuplicateLayersInVkLayerPath) { layer1.set_description("actually_layer_1"); env.add_explicit_layer(ManifestOptions{} // putting it in a separate folder then manually adding the folder to VK_LAYER_PATH - .set_discovery_type(ManifestDiscoveryType::override_folder) + .set_discovery_type(ManifestDiscoveryType::overflow_folder) .set_is_dir(true), ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} .set_name(layer_name) @@ -2776,7 +1851,7 @@ TEST(ExplicitLayers, DuplicateLayersInVkLayerPath) { .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2))); auto& layer2 = env.get_test_layer(1); layer2.set_description("actually_layer_2"); - env.env_var_vk_layer_paths.add_to_list(env.get_folder(ManifestLocation::override_layer).location().string()); + env.env_var_vk_layer_paths.add_to_list(env.get_folder(ManifestLocation::overflow).location().string()); auto layer_props = env.GetLayerProperties(1); ASSERT_TRUE(string_eq(layer_name, layer_props[0].layerName)); @@ -4597,153 +3672,6 @@ TEST(TestLayers, AppEnabledExplicitLayerFails) { ASSERT_TRUE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_1, "disabled because name matches filter of env var")); } -TEST(TestLayers, OverrideEnabledExplicitLayerWithDisableFilter) { - FrameworkEnvironment env; - env.add_icd(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA, {}, ManifestICD{}.set_api_version(VK_API_VERSION_1_2)) - .set_icd_api_version(VK_API_VERSION_1_2); - - const char* explicit_layer_name_1 = "VK_LAYER_LUNARG_First_layer"; - const char* explicit_json_name_1 = "First_layer.json"; - env.add_explicit_layer(ManifestOptions{}.set_json_name(explicit_json_name_1), - ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} - .set_name(explicit_layer_name_1) - .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) - .set_api_version(VK_MAKE_API_VERSION(0, 1, 1, 0)))); - - env.add_implicit_layer( - {}, ManifestLayer{}.set_file_format_version({1, 2, 0}).add_layer(ManifestLayer::LayerDescription{} - .set_name(lunarg_meta_layer_name) - .set_api_version(VK_MAKE_API_VERSION(0, 1, 1, 0)) - .add_component_layer(explicit_layer_name_1) - .set_disable_environment("DisableMeIfYouCan"))); - - env.debug_log.clear(); - EnvVarWrapper layers_disable_env_var{"VK_LOADER_LAYERS_DISABLE", explicit_layer_name_1}; - - auto layers = env.GetLayerProperties(1); - EXPECT_TRUE(string_eq(lunarg_meta_layer_name, layers[0].layerName)); - - { // both override layer and Disable env var - InstWrapper inst{env.vulkan_functions}; - FillDebugUtilsCreateDetails(inst.create_info, env.debug_log); - inst.CheckCreate(); - ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", explicit_json_name_1)); - ASSERT_FALSE(env.debug_log.find_prefix_then_postfix("Insert instance layer ", explicit_layer_name_1)); - ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_1, "forced enabled due to env var")); - ASSERT_TRUE( - env.debug_log.find_prefix_then_postfix(explicit_layer_name_1, "disabled because name matches filter of env var")); - } - env.debug_log.clear(); - { // Now try to enable the explicit layer as well - InstWrapper inst{env.vulkan_functions}; - inst.create_info.add_layer(explicit_layer_name_1); - FillDebugUtilsCreateDetails(inst.create_info, env.debug_log); - inst.CheckCreate(VK_ERROR_LAYER_NOT_PRESENT); - ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", explicit_json_name_1)); - ASSERT_FALSE(env.debug_log.find_prefix_then_postfix("Insert instance layer ", explicit_layer_name_1)); - ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_1, "forced enabled due to env var")); - ASSERT_TRUE( - env.debug_log.find_prefix_then_postfix(explicit_layer_name_1, "disabled because name matches filter of env var")); - } -} - -TEST(TestLayers, OverrideEnabledExplicitLayerWithDisableFilterForOverrideLayer) { - FrameworkEnvironment env; - env.add_icd(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA, {}, ManifestICD{}.set_api_version(VK_API_VERSION_1_2)) - .set_icd_api_version(VK_API_VERSION_1_2); - - const char* explicit_layer_name_1 = "VK_LAYER_LUNARG_First_layer"; - const char* explicit_json_name_1 = "First_layer.json"; - env.add_explicit_layer(ManifestOptions{}.set_json_name(explicit_json_name_1), - ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} - .set_name(explicit_layer_name_1) - .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) - .set_api_version(VK_MAKE_API_VERSION(0, 1, 1, 0)))); - env.add_implicit_layer( - {}, ManifestLayer{}.set_file_format_version({1, 2, 0}).add_layer(ManifestLayer::LayerDescription{} - .set_name(lunarg_meta_layer_name) - .set_api_version(VK_MAKE_API_VERSION(0, 1, 1, 0)) - .add_component_layer(explicit_layer_name_1) - .set_disable_environment("DisableMeIfYouCan"))); - - env.debug_log.clear(); - EnvVarWrapper layers_disable_env_var{"VK_LOADER_LAYERS_DISABLE", lunarg_meta_layer_name}; - - auto layers = env.GetLayerProperties(1); - EXPECT_TRUE(string_eq(explicit_layer_name_1, layers[0].layerName)); - - { // both override layer and Disable env var - InstWrapper inst{env.vulkan_functions}; - FillDebugUtilsCreateDetails(inst.create_info, env.debug_log); - inst.CheckCreate(); - ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", explicit_json_name_1)); - ASSERT_FALSE(env.debug_log.find_prefix_then_postfix("Insert instance layer ", explicit_layer_name_1)); - ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_1, "forced enabled due to env var")); - ASSERT_TRUE( - env.debug_log.find_prefix_then_postfix(lunarg_meta_layer_name, "disabled because name matches filter of env var")); - } - env.debug_log.clear(); - { // Now try to enable the explicit layer as well - InstWrapper inst{env.vulkan_functions}; - inst.create_info.add_layer(explicit_layer_name_1); - FillDebugUtilsCreateDetails(inst.create_info, env.debug_log); - inst.CheckCreate(); - ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", explicit_json_name_1)); - ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Insert instance layer ", explicit_layer_name_1)); - ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_1, "forced enabled due to env var")); - ASSERT_TRUE( - env.debug_log.find_prefix_then_postfix(lunarg_meta_layer_name, "disabled because name matches filter of env var")); - } -} - -TEST(TestLayers, OverrideBlacklistedLayerWithEnableFilter) { - FrameworkEnvironment env; - env.add_icd(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA, {}, ManifestICD{}.set_api_version(VK_API_VERSION_1_2)) - .set_icd_api_version(VK_API_VERSION_1_2); - - const char* explicit_layer_name_1 = "VK_LAYER_LUNARG_First_layer"; - const char* explicit_json_name_1 = "First_layer.json"; - env.add_explicit_layer(ManifestOptions{}.set_json_name(explicit_json_name_1), - ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} - .set_name(explicit_layer_name_1) - .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) - .set_api_version(VK_MAKE_API_VERSION(0, 1, 1, 0)))); - env.add_implicit_layer( - {}, ManifestLayer{}.set_file_format_version({1, 2, 0}).add_layer(ManifestLayer::LayerDescription{} - .set_name(lunarg_meta_layer_name) - .set_api_version(VK_MAKE_API_VERSION(0, 1, 1, 0)) - .add_blacklisted_layer(explicit_layer_name_1) - .set_disable_environment("DisableMeIfYouCan"))); - - env.debug_log.clear(); - EnvVarWrapper layers_enable_env_var{"VK_LOADER_LAYERS_ENABLE", explicit_layer_name_1}; - - auto layers = env.GetLayerProperties(1); - EXPECT_TRUE(string_eq(explicit_layer_name_1, layers[0].layerName)); - { - InstWrapper inst{env.vulkan_functions}; - FillDebugUtilsCreateDetails(inst.create_info, env.debug_log); - ASSERT_NO_FATAL_FAILURE(inst.CheckCreate()); - ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Insert instance layer ", explicit_layer_name_1)); - ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", explicit_json_name_1)); - ASSERT_TRUE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_1, "forced enabled due to env var")); - ASSERT_FALSE( - env.debug_log.find_prefix_then_postfix(explicit_layer_name_1, "disabled because name matches filter of env var")); - } - env.debug_log.clear(); - { // Try to enable a blacklisted layer - InstWrapper inst{env.vulkan_functions}; - inst.create_info.add_layer(explicit_layer_name_1); - FillDebugUtilsCreateDetails(inst.create_info, env.debug_log); - ASSERT_NO_FATAL_FAILURE(inst.CheckCreate()); - ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Insert instance layer ", explicit_layer_name_1)); - ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", explicit_json_name_1)); - ASSERT_TRUE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_1, "forced enabled due to env var")); - ASSERT_FALSE( - env.debug_log.find_prefix_then_postfix(explicit_layer_name_1, "disabled because name matches filter of env var")); - } -} - // Add a device layer, should not work TEST(TestLayers, DoNotUseDeviceLayer) { FrameworkEnvironment env; @@ -5735,102 +4663,6 @@ TEST(TestLayers, AllowFilterWithConditionallyImplicitLayer) { } } -TEST(TestLayers, AllowFilterWithConditionallyImplicitLayerWithOverrideLayer) { - FrameworkEnvironment env; - env.add_icd(TEST_ICD_PATH_VERSION_2).add_physical_device({}); - const char* layer_name = "VK_LAYER_test_layer"; - const char* enable_env_var = "TEST_ENABLE_ENV_VAR"; - env.add_implicit_layer(ManifestOptions{}.set_discovery_type(ManifestDiscoveryType::override_folder), - ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} - .set_name(layer_name) - .set_api_version(VK_API_VERSION_1_1) - .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) - .set_disable_environment("TEST_DISABLE_ENV_VAR") - .set_enable_environment(enable_env_var))); - - env.add_implicit_layer({}, ManifestLayer{}.set_file_format_version({1, 2, 0}).add_layer( - ManifestLayer::LayerDescription{} - .set_name(lunarg_meta_layer_name) - .set_api_version(VK_MAKE_API_VERSION(0, 1, 1, 0)) - .add_component_layer(layer_name) - .set_disable_environment("DisableMeIfYouCan") - .add_override_path(env.get_folder(ManifestLocation::override_layer).location().string()))); - - EnvVarWrapper allow{"VK_LOADER_LAYERS_ALLOW", layer_name}; - - { - InstWrapper inst{env.vulkan_functions}; - inst.CheckCreate(); - - auto layers = inst.GetActiveLayers(inst.GetPhysDev(), 2); - ASSERT_TRUE(string_eq(layers.at(0).layerName, layer_name)); - ASSERT_TRUE(string_eq(layers.at(1).layerName, lunarg_meta_layer_name)); - } - { - EnvVarWrapper disable{"VK_LOADER_LAYERS_DISABLE", layer_name}; - - InstWrapper inst{env.vulkan_functions}; - inst.CheckCreate(); - - auto layers = inst.GetActiveLayers(inst.GetPhysDev(), 2); - ASSERT_TRUE(string_eq(layers.at(0).layerName, layer_name)); - ASSERT_TRUE(string_eq(layers.at(1).layerName, lunarg_meta_layer_name)); - } - { - EnvVarWrapper disable{"VK_LOADER_LAYERS_DISABLE", layer_name}; - EnvVarWrapper enable{"VK_LOADER_LAYERS_ENABLE", layer_name}; - - InstWrapper inst{env.vulkan_functions}; - inst.CheckCreate(); - - auto layers = inst.GetActiveLayers(inst.GetPhysDev(), 2); - ASSERT_TRUE(string_eq(layers.at(0).layerName, layer_name)); - ASSERT_TRUE(string_eq(layers.at(1).layerName, lunarg_meta_layer_name)); - } - { - InstWrapper inst{env.vulkan_functions}; - inst.create_info.add_layer(layer_name); - inst.CheckCreate(); - - auto layers = inst.GetActiveLayers(inst.GetPhysDev(), 2); - ASSERT_TRUE(string_eq(layers.at(0).layerName, layer_name)); - ASSERT_TRUE(string_eq(layers.at(1).layerName, lunarg_meta_layer_name)); - } - { - env.loader_settings.add_app_specific_setting(AppSpecificSettings{}.add_stderr_log_filter("all").add_layer_configuration( - LoaderSettingsLayerConfiguration{} - .set_name(layer_name) - .set_control("on") - .set_path(env.get_shimmed_layer_manifest_path(0)) - .set_treat_as_implicit_manifest(true))); - env.update_loader_settings(env.loader_settings); - - InstWrapper inst{env.vulkan_functions}; - inst.CheckCreate(); - - auto layers = inst.GetActiveLayers(inst.GetPhysDev(), 1); - ASSERT_TRUE(string_eq(layers.at(0).layerName, layer_name)); - } - { - env.loader_settings.app_specific_settings.at(0).layer_configurations.at(0).set_control("off"); - env.update_loader_settings(env.loader_settings); - - InstWrapper inst{env.vulkan_functions}; - inst.CheckCreate(); - - ASSERT_NO_FATAL_FAILURE(inst.GetActiveLayers(inst.GetPhysDev(), 0)); - } - { - env.loader_settings.app_specific_settings.at(0).layer_configurations.at(0).set_control("auto"); - env.update_loader_settings(env.loader_settings); - - InstWrapper inst{env.vulkan_functions}; - inst.CheckCreate(); - - ASSERT_NO_FATAL_FAILURE(inst.GetActiveLayers(inst.GetPhysDev(), 0)); - } -} - TEST(TestLayers, LayerFailsNegotiateLoaderLayerInterfaceVersion) { FrameworkEnvironment env; env.add_icd(TEST_ICD_PATH_VERSION_2).add_physical_device({}); diff --git a/tests/loader_regression_tests.cpp b/tests/loader_regression_tests.cpp index b7a3cbd46..d7eb75360 100644 --- a/tests/loader_regression_tests.cpp +++ b/tests/loader_regression_tests.cpp @@ -4527,7 +4527,7 @@ TEST(LibraryLoading, SystemLocations) { TEST(ManifestDiscovery, ValidSymlinkInUnsecureLocation) { FrameworkEnvironment env; env.add_icd(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA, - ManifestOptions{}.set_discovery_type(ManifestDiscoveryType::override_folder)) + ManifestOptions{}.set_discovery_type(ManifestDiscoveryType::overflow_folder)) .add_physical_device({}); env.add_symlink(ManifestLocation::unsecured_driver, env.get_icd_manifest_path(0), "symlink_to_driver.json"); @@ -4541,7 +4541,7 @@ TEST(ManifestDiscovery, ValidSymlinkInUnsecureLocation) { TEST(ManifestDiscovery, ValidSymlink) { FrameworkEnvironment env{FrameworkSettings{}}; env.add_icd(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA, - ManifestOptions{}.set_discovery_type(ManifestDiscoveryType::override_folder)) + ManifestOptions{}.set_discovery_type(ManifestDiscoveryType::overflow_folder)) .add_physical_device({}); env.add_symlink(ManifestLocation::driver, env.get_icd_manifest_path(0), "symlink_to_driver.json"); diff --git a/tests/loader_settings_tests.cpp b/tests/loader_settings_tests.cpp index cb49435e8..b9ab5a0d9 100644 --- a/tests/loader_settings_tests.cpp +++ b/tests/loader_settings_tests.cpp @@ -141,7 +141,7 @@ TEST(SettingsFile, SettingsInUnsecuredLocation) { env.add_icd(TEST_ICD_PATH_VERSION_2).add_physical_device({}); const char* regular_layer_name = "VK_LAYER_TestLayer_0"; env.add_explicit_layer( - ManifestOptions{}.set_discovery_type(ManifestDiscoveryType::override_folder), + ManifestOptions{}.set_discovery_type(ManifestDiscoveryType::overflow_folder), ManifestLayer{}.add_layer( ManifestLayer::LayerDescription{}.set_name(regular_layer_name).set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2))); env.update_loader_settings( @@ -170,7 +170,7 @@ TEST(SettingsFile, SettingsInUnsecuredLocationRunningWithElevatedPrivileges) { env.add_icd(TEST_ICD_PATH_VERSION_2).add_physical_device({}); const char* regular_layer_name = "VK_LAYER_TestLayer_0"; env.add_explicit_layer( - ManifestOptions{}.set_discovery_type(ManifestDiscoveryType::override_folder), + ManifestOptions{}.set_discovery_type(ManifestDiscoveryType::overflow_folder), ManifestLayer{}.add_layer( ManifestLayer::LayerDescription{}.set_name(regular_layer_name).set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2))); env.update_loader_settings( @@ -197,7 +197,7 @@ TEST(SettingsFile, SettingsInSecuredLocation) { env.add_icd(TEST_ICD_PATH_VERSION_2); const char* regular_layer_name = "VK_LAYER_TestLayer_0"; env.add_explicit_layer( - ManifestOptions{}.set_discovery_type(ManifestDiscoveryType::override_folder), + ManifestOptions{}.set_discovery_type(ManifestDiscoveryType::overflow_folder), ManifestLayer{}.add_layer( ManifestLayer::LayerDescription{}.set_name(regular_layer_name).set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2))); env.update_loader_settings(env.loader_settings.set_file_format_version({1, 0, 0}).add_app_specific_setting( @@ -224,13 +224,13 @@ TEST(SettingsFile, SupportsMultipleSettingsSimultaneously) { FrameworkEnvironment env{}; const char* app_specific_layer_name = "VK_LAYER_TestLayer_0"; env.add_explicit_layer( - ManifestOptions{}.set_discovery_type(ManifestDiscoveryType::override_folder), + ManifestOptions{}.set_discovery_type(ManifestDiscoveryType::overflow_folder), ManifestLayer{}.add_layer( ManifestLayer::LayerDescription{}.set_name(app_specific_layer_name).set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2))); const char* global_layer_name = "VK_LAYER_TestLayer_1"; env.add_explicit_layer( - ManifestOptions{}.set_discovery_type(ManifestDiscoveryType::override_folder), + ManifestOptions{}.set_discovery_type(ManifestDiscoveryType::overflow_folder), ManifestLayer{}.add_layer( ManifestLayer::LayerDescription{}.set_name(global_layer_name).set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2))); @@ -300,7 +300,7 @@ TEST(SettingsFile, LayerAutoEnabledByEnvVars) { const char* layer_name = "VK_LAYER_automatic"; env.add_explicit_layer( - ManifestOptions{}.set_discovery_type(ManifestDiscoveryType::override_folder), + ManifestOptions{}.set_discovery_type(ManifestDiscoveryType::overflow_folder), ManifestLayer{}.add_layer( ManifestLayer::LayerDescription{}.set_name(layer_name).set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2))); @@ -775,267 +775,6 @@ TEST(SettingsFile, MismatchedLayerNameAndManifestPath) { ASSERT_NO_FATAL_FAILURE(inst.GetActiveLayers(inst.GetPhysDev(), 0)); } -// Settings file should take precedence over the meta layer, if present -TEST(SettingsFile, ImplicitLayerWithEnableEnvironment) { - FrameworkEnvironment env{}; - env.add_icd(TEST_ICD_PATH_VERSION_2).add_physical_device({}); - - const char* explicit_layer_1 = "VK_LAYER_Regular_TestLayer"; - env.add_explicit_layer( - {}, ManifestLayer{}.add_layer( - ManifestLayer::LayerDescription{}.set_name(explicit_layer_1).set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2))); - - const char* implicit_layer_1 = "VK_LAYER_RegularImplicit_TestLayer"; - env.add_implicit_layer({}, ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} - .set_name(implicit_layer_1) - .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) - .set_disable_environment("AndISaidHey") - .set_enable_environment("WhatsGoingOn"))); - - const char* explicit_layer_2 = "VK_LAYER_Regular_TestLayer1"; - env.add_explicit_layer( - {}, ManifestLayer{}.add_layer( - ManifestLayer::LayerDescription{}.set_name(explicit_layer_2).set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2))); - - const char* implicit_layer_2 = "VK_LAYER_RegularImplicit_TestLayer2"; - env.add_explicit_layer({}, ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} - .set_name(implicit_layer_2) - .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) - .set_disable_environment("HeyHeyHeyyaya") - .set_enable_environment("HeyHeyHeyhey"))); - - const char* explicit_layer_3 = "VK_LAYER_Regular_TestLayer3"; - env.add_explicit_layer( - {}, ManifestLayer{}.add_layer( - ManifestLayer::LayerDescription{}.set_name(explicit_layer_3).set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2))); - - env.update_loader_settings(env.loader_settings.set_file_format_version({1, 0, 0}).add_app_specific_setting( - AppSpecificSettings{} - .add_stderr_log_filter("all") - .add_layer_configuration(LoaderSettingsLayerConfiguration{} - .set_name(explicit_layer_1) - .set_path(env.get_shimmed_layer_manifest_path(0)) - .set_control("auto") - .set_treat_as_implicit_manifest(false)) - .add_layer_configuration(LoaderSettingsLayerConfiguration{}.set_control("unordered_layer_location")) - .add_layer_configuration(LoaderSettingsLayerConfiguration{} - .set_name(implicit_layer_1) - .set_path(env.get_shimmed_layer_manifest_path(1)) - .set_control("auto") - .set_treat_as_implicit_manifest(true)) - .add_layer_configuration(LoaderSettingsLayerConfiguration{} - .set_name(explicit_layer_2) - .set_path(env.get_shimmed_layer_manifest_path(2)) - .set_control("auto") - .set_treat_as_implicit_manifest(false)) - .add_layer_configuration(LoaderSettingsLayerConfiguration{} - .set_name(implicit_layer_2) - .set_path(env.get_shimmed_layer_manifest_path(3)) - .set_control("auto") - .set_treat_as_implicit_manifest(true)) - .add_layer_configuration(LoaderSettingsLayerConfiguration{} - .set_name(explicit_layer_3) - .set_path(env.get_shimmed_layer_manifest_path(4)) - .set_control("on") - .set_treat_as_implicit_manifest(false)))); - { - auto layer_props = env.GetLayerProperties(5); - ASSERT_TRUE(string_eq(layer_props.at(0).layerName, explicit_layer_1)); - ASSERT_TRUE(string_eq(layer_props.at(1).layerName, implicit_layer_1)); - ASSERT_TRUE(string_eq(layer_props.at(2).layerName, explicit_layer_2)); - ASSERT_TRUE(string_eq(layer_props.at(3).layerName, implicit_layer_2)); - ASSERT_TRUE(string_eq(layer_props.at(4).layerName, explicit_layer_3)); - - InstWrapper inst{env.vulkan_functions}; - FillDebugUtilsCreateDetails(inst.create_info, env.debug_log); - inst.CheckCreate(); - ASSERT_TRUE(env.debug_log.find(get_settings_location_log_message(env))); - auto layers = inst.GetActiveLayers(inst.GetPhysDev(), 1); - ASSERT_TRUE(string_eq(layers.at(0).layerName, explicit_layer_3)); - } - { - EnvVarWrapper enable_meta_layer{"WhatsGoingOn", "1"}; - auto layer_props = env.GetLayerProperties(5); - ASSERT_TRUE(string_eq(layer_props.at(0).layerName, explicit_layer_1)); - ASSERT_TRUE(string_eq(layer_props.at(1).layerName, implicit_layer_1)); - ASSERT_TRUE(string_eq(layer_props.at(2).layerName, explicit_layer_2)); - ASSERT_TRUE(string_eq(layer_props.at(3).layerName, implicit_layer_2)); - ASSERT_TRUE(string_eq(layer_props.at(4).layerName, explicit_layer_3)); - - InstWrapper inst{env.vulkan_functions}; - FillDebugUtilsCreateDetails(inst.create_info, env.debug_log); - inst.CheckCreate(); - ASSERT_TRUE(env.debug_log.find(get_settings_location_log_message(env))); - auto layers = inst.GetActiveLayers(inst.GetPhysDev(), 2); - ASSERT_TRUE(string_eq(layers.at(0).layerName, implicit_layer_1)); - ASSERT_TRUE(string_eq(layers.at(1).layerName, explicit_layer_3)); - } - { - EnvVarWrapper enable_meta_layer{"HeyHeyHeyhey", "1"}; - auto layer_props = env.GetLayerProperties(5); - ASSERT_TRUE(string_eq(layer_props.at(0).layerName, explicit_layer_1)); - ASSERT_TRUE(string_eq(layer_props.at(1).layerName, implicit_layer_1)); - ASSERT_TRUE(string_eq(layer_props.at(2).layerName, explicit_layer_2)); - ASSERT_TRUE(string_eq(layer_props.at(3).layerName, implicit_layer_2)); - ASSERT_TRUE(string_eq(layer_props.at(4).layerName, explicit_layer_3)); - - InstWrapper inst{env.vulkan_functions}; - FillDebugUtilsCreateDetails(inst.create_info, env.debug_log); - inst.CheckCreate(); - ASSERT_TRUE(env.debug_log.find(get_settings_location_log_message(env))); - auto layers = inst.GetActiveLayers(inst.GetPhysDev(), 2); - ASSERT_TRUE(string_eq(layers.at(0).layerName, implicit_layer_2)); - ASSERT_TRUE(string_eq(layers.at(1).layerName, explicit_layer_3)); - } -} - -// Settings file should take precedence over the meta layer, if present -TEST(SettingsFile, MetaLayerAlsoActivates) { - FrameworkEnvironment env{}; - env.add_icd(TEST_ICD_PATH_VERSION_2).add_physical_device({}); - - const char* settings_explicit_layer_name = "VK_LAYER_Regular_TestLayer"; - env.add_explicit_layer({}, ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} - .set_name(settings_explicit_layer_name) - .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2))); - - const char* settings_implicit_layer_name = "VK_LAYER_RegularImplicit_TestLayer"; - env.add_implicit_layer({}, ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} - .set_name(settings_implicit_layer_name) - .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) - .set_disable_environment("AndISaidHey") - .set_enable_environment("WhatsGoingOn"))); - - const char* component_explicit_layer_name1 = "VK_LAYER_Component_TestLayer1"; - env.add_explicit_layer({}, ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} - .set_name(component_explicit_layer_name1) - .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2))); - - const char* component_explicit_layer_name2 = "VK_LAYER_Component_TestLayer2"; - env.add_explicit_layer({}, ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} - .set_name(component_explicit_layer_name2) - .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2))); - - const char* meta_layer_name1 = "VK_LAYER_meta_layer1"; - env.add_implicit_layer( - {}, ManifestLayer{}.set_file_format_version({1, 1, 2}).add_layer(ManifestLayer::LayerDescription{} - .set_name(meta_layer_name1) - .add_component_layer(component_explicit_layer_name2) - .add_component_layer(component_explicit_layer_name1) - .set_disable_environment("NotGonnaWork"))); - - const char* meta_layer_name2 = "VK_LAYER_meta_layer2"; - env.add_implicit_layer( - {}, ManifestLayer{}.set_file_format_version({1, 1, 2}).add_layer(ManifestLayer::LayerDescription{} - .set_name(meta_layer_name2) - .add_component_layer(component_explicit_layer_name1) - .set_disable_environment("ILikeTrains") - .set_enable_environment("BakedBeans"))); - - env.update_loader_settings(env.loader_settings.set_file_format_version({1, 0, 0}).add_app_specific_setting( - AppSpecificSettings{} - .add_stderr_log_filter("all") - .add_layer_configuration(LoaderSettingsLayerConfiguration{} - .set_name(settings_explicit_layer_name) - .set_path(env.get_shimmed_layer_manifest_path(0)) - .set_control("on") - .set_treat_as_implicit_manifest(false)) - .add_layer_configuration(LoaderSettingsLayerConfiguration{}.set_control("unordered_layer_location")) - .add_layer_configuration(LoaderSettingsLayerConfiguration{} - .set_name(settings_implicit_layer_name) - .set_path(env.get_shimmed_layer_manifest_path(1)) - .set_control("auto") - .set_treat_as_implicit_manifest(true)))); - { - EnvVarWrapper enable_meta_layer{"WhatsGoingOn", "1"}; - auto layer_props = env.GetLayerProperties(6); - ASSERT_TRUE(string_eq(layer_props.at(0).layerName, settings_explicit_layer_name)); - ASSERT_TRUE(string_eq(layer_props.at(1).layerName, meta_layer_name1)); - ASSERT_TRUE(string_eq(layer_props.at(2).layerName, meta_layer_name2)); - ASSERT_TRUE(string_eq(layer_props.at(3).layerName, component_explicit_layer_name1)); - ASSERT_TRUE(string_eq(layer_props.at(4).layerName, component_explicit_layer_name2)); - ASSERT_TRUE(string_eq(layer_props.at(5).layerName, settings_implicit_layer_name)); - - InstWrapper inst{env.vulkan_functions}; - FillDebugUtilsCreateDetails(inst.create_info, env.debug_log); - inst.CheckCreate(); - ASSERT_TRUE(env.debug_log.find(get_settings_location_log_message(env))); - auto layers = inst.GetActiveLayers(inst.GetPhysDev(), 5); - ASSERT_TRUE(string_eq(layers.at(0).layerName, settings_explicit_layer_name)); - ASSERT_TRUE(string_eq(layers.at(1).layerName, component_explicit_layer_name2)); - ASSERT_TRUE(string_eq(layers.at(2).layerName, component_explicit_layer_name1)); - ASSERT_TRUE(string_eq(layers.at(3).layerName, meta_layer_name1)); - ASSERT_TRUE(string_eq(layers.at(4).layerName, settings_implicit_layer_name)); - } - { - EnvVarWrapper enable_meta_layer{"BakedBeans", "1"}; - auto layer_props = env.GetLayerProperties(6); - ASSERT_TRUE(string_eq(layer_props.at(0).layerName, settings_explicit_layer_name)); - ASSERT_TRUE(string_eq(layer_props.at(1).layerName, meta_layer_name1)); - ASSERT_TRUE(string_eq(layer_props.at(2).layerName, meta_layer_name2)); - ASSERT_TRUE(string_eq(layer_props.at(3).layerName, component_explicit_layer_name1)); - ASSERT_TRUE(string_eq(layer_props.at(4).layerName, component_explicit_layer_name2)); - ASSERT_TRUE(string_eq(layer_props.at(5).layerName, settings_implicit_layer_name)); - - InstWrapper inst{env.vulkan_functions}; - FillDebugUtilsCreateDetails(inst.create_info, env.debug_log); - inst.CheckCreate(); - ASSERT_TRUE(env.debug_log.find(get_settings_location_log_message(env))); - auto layers = inst.GetActiveLayers(inst.GetPhysDev(), 5); - ASSERT_TRUE(string_eq(layers.at(0).layerName, settings_explicit_layer_name)); - ASSERT_TRUE(string_eq(layers.at(1).layerName, component_explicit_layer_name2)); - ASSERT_TRUE(string_eq(layers.at(2).layerName, component_explicit_layer_name1)); - ASSERT_TRUE(string_eq(layers.at(3).layerName, meta_layer_name1)); - ASSERT_TRUE(string_eq(layers.at(4).layerName, meta_layer_name2)); - } -} - -TEST(SettingsFile, DuplicateMetaLayers) { - FrameworkEnvironment env{}; - env.add_icd(TEST_ICD_PATH_VERSION_2).add_physical_device({}); - - const char* explicit_layer_name = "VK_LAYER_Regular_TestLayer"; - env.add_explicit_layer( - {}, ManifestLayer{}.add_layer( - ManifestLayer::LayerDescription{}.set_name(explicit_layer_name).set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2))); - // Add an implicit layer and a meta layer that share a name - const char* meta_layer_name = "VK_LAYER_meta_layer"; - env.add_implicit_layer({}, ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} - .set_name(meta_layer_name) - .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) - .set_disable_environment("NotGonnaWork"))); - env.add_implicit_layer( - {}, ManifestLayer{}.set_file_format_version({1, 1, 2}).add_layer(ManifestLayer::LayerDescription{} - .set_name(meta_layer_name) - .add_component_layer(explicit_layer_name) - .set_disable_environment("NotGonnaWork"))); - - env.update_loader_settings(env.loader_settings.set_file_format_version({1, 0, 0}).add_app_specific_setting( - AppSpecificSettings{} - .add_stderr_log_filter("all") - .add_layer_configuration(LoaderSettingsLayerConfiguration{} - .set_name(explicit_layer_name) - .set_path(env.get_shimmed_layer_manifest_path(0)) - .set_control("auto") - .set_treat_as_implicit_manifest(false)) - .add_layer_configuration(LoaderSettingsLayerConfiguration{}.set_control("unordered_layer_location")) - .add_layer_configuration( - LoaderSettingsLayerConfiguration{} - .set_name(meta_layer_name) - .set_path(env.get_folder(ManifestLocation::implicit_layer).location() / "meta_test_layer.json") - .set_control("auto") - .set_treat_as_implicit_manifest(true)) - .add_layer_configuration(LoaderSettingsLayerConfiguration{} - .set_name(meta_layer_name) - .set_path(env.get_shimmed_layer_manifest_path(1)) - .set_control("auto") - .set_treat_as_implicit_manifest(true)) - - )); - InstWrapper inst{env.vulkan_functions}; - inst.CheckCreate(); -} - // Layers are correctly ordered by settings file. TEST(SettingsFile, LayerOrdering) { FrameworkEnvironment env{}; @@ -1799,7 +1538,7 @@ TEST(SettingsFile, MultipleKeysInRegistryInUnsecureLocation) { const char* regular_layer_name = "VK_LAYER_TestLayer_0"; env.add_explicit_layer( - ManifestOptions{}.set_discovery_type(ManifestDiscoveryType::override_folder), + ManifestOptions{}.set_discovery_type(ManifestDiscoveryType::overflow_folder), ManifestLayer{}.add_layer( ManifestLayer::LayerDescription{}.set_name(regular_layer_name).set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2))); @@ -1832,7 +1571,7 @@ TEST(SettingsFile, MultipleKeysInRegistryInSecureLocation) { const char* regular_layer_name = "VK_LAYER_TestLayer_0"; env.add_explicit_layer( - ManifestOptions{}.set_discovery_type(ManifestDiscoveryType::override_folder), + ManifestOptions{}.set_discovery_type(ManifestDiscoveryType::overflow_folder), ManifestLayer{}.add_layer( ManifestLayer::LayerDescription{}.set_name(regular_layer_name).set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2))); @@ -2797,7 +2536,7 @@ TEST(SettingsFile, TooManyLayers) { for (uint32_t i = 0; i < layer_count; i++) { env.add_explicit_layer(ManifestOptions{} .set_json_name(layer_name + std::to_string(i) + ".json") - .set_discovery_type(ManifestDiscoveryType::override_folder), + .set_discovery_type(ManifestDiscoveryType::overflow_folder), ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} .set_name(layer_name + std::to_string(i)) .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2))); @@ -3048,7 +2787,7 @@ TEST(SettingsFile, DontAllowDuplicatesBetweenSettingsLayersAndDefaultLayers) { ManifestLayer::LayerDescription{}.set_name(explicit_layer_name1).set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2))); env.add_explicit_layer( - ManifestOptions{}.set_discovery_type(ManifestDiscoveryType::override_folder), + ManifestOptions{}.set_discovery_type(ManifestDiscoveryType::overflow_folder), ManifestLayer{}.add_layer( ManifestLayer::LayerDescription{}.set_name(explicit_layer_name1).set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2))); @@ -3077,7 +2816,7 @@ TEST(SettingsFile, AdditionalDrivers) { const char* regular_driver_name = "regular"; const char* settings_driver_name = "settings"; env.add_icd(TEST_ICD_PATH_VERSION_2).add_physical_device(PhysicalDevice{}.set_deviceName(regular_driver_name)); - env.add_icd(TEST_ICD_PATH_VERSION_2, ManifestOptions{}.set_discovery_type(ManifestDiscoveryType::override_folder)) + env.add_icd(TEST_ICD_PATH_VERSION_2, ManifestOptions{}.set_discovery_type(ManifestDiscoveryType::overflow_folder)) .add_physical_device(PhysicalDevice{}.set_deviceName(settings_driver_name)); env.loader_settings.set_file_format_version({1, 0, 0}).add_app_specific_setting( @@ -3116,7 +2855,7 @@ TEST(SettingsFile, AdditionalDriverNotManifestFile) { const char* regular_driver_name = "regular"; const char* settings_driver_name = "settings"; env.add_icd(TEST_ICD_PATH_VERSION_2).add_physical_device(PhysicalDevice{}.set_deviceName(regular_driver_name)); - env.add_icd(TEST_ICD_PATH_VERSION_2, ManifestOptions{}.set_discovery_type(ManifestDiscoveryType::override_folder)) + env.add_icd(TEST_ICD_PATH_VERSION_2, ManifestOptions{}.set_discovery_type(ManifestDiscoveryType::overflow_folder)) .add_physical_device(PhysicalDevice{}.set_deviceName(settings_driver_name)); env.loader_settings.set_file_format_version({1, 0, 0}).add_app_specific_setting( @@ -3142,7 +2881,7 @@ TEST(SettingsFile, ExclusiveAdditionalDrivers) { const char* regular_driver_name = "regular"; const char* settings_driver_name = "settings"; env.add_icd(TEST_ICD_PATH_VERSION_2).add_physical_device(PhysicalDevice{}.set_deviceName(regular_driver_name)); - env.add_icd(TEST_ICD_PATH_VERSION_2, ManifestOptions{}.set_discovery_type(ManifestDiscoveryType::override_folder)) + env.add_icd(TEST_ICD_PATH_VERSION_2, ManifestOptions{}.set_discovery_type(ManifestDiscoveryType::overflow_folder)) .add_physical_device(PhysicalDevice{}.set_deviceName(settings_driver_name)); env.loader_settings.set_file_format_version({1, 0, 0}).add_app_specific_setting( @@ -3164,7 +2903,7 @@ TEST(SettingsFile, AdditionalDriversReplacesVK_LOADER_DRIVERS_SELECT) { const char* regular_driver_name = "regular"; const char* settings_driver_name = "settings"; env.add_icd(TEST_ICD_PATH_VERSION_2).add_physical_device(PhysicalDevice{}.set_deviceName(regular_driver_name)); - env.add_icd(TEST_ICD_PATH_VERSION_2, ManifestOptions{}.set_discovery_type(ManifestDiscoveryType::override_folder)) + env.add_icd(TEST_ICD_PATH_VERSION_2, ManifestOptions{}.set_discovery_type(ManifestDiscoveryType::overflow_folder)) .add_physical_device(PhysicalDevice{}.set_deviceName(settings_driver_name)); env.loader_settings.set_file_format_version({1, 0, 0}).add_app_specific_setting( @@ -3224,12 +2963,12 @@ TEST(SettingsFile, InvalidAdditionalDriversField) { const char* layer_name = "VK_LAYER_layer"; const char* driver_name = "driver"; const char* settings_driver_name = "settings_driver"; - env.add_icd(TEST_ICD_PATH_VERSION_2, ManifestOptions{}.set_discovery_type(ManifestDiscoveryType::override_folder)) + env.add_icd(TEST_ICD_PATH_VERSION_2, ManifestOptions{}.set_discovery_type(ManifestDiscoveryType::overflow_folder)) .add_physical_device(PhysicalDevice{}.set_deviceName(settings_driver_name)); env.add_icd(TEST_ICD_PATH_VERSION_2).add_physical_device(PhysicalDevice{}.set_deviceName(driver_name)); env.add_explicit_layer( - ManifestOptions{}.set_discovery_type(ManifestDiscoveryType::override_folder), + ManifestOptions{}.set_discovery_type(ManifestDiscoveryType::overflow_folder), ManifestLayer{}.add_layer( ManifestLayer::LayerDescription{}.set_name("VK_LAYER_layer").set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2))); @@ -3746,7 +3485,7 @@ TEST(SettingsFile, DriverConfigurationsAndAdditionalDrivers) { count++; } - env.add_icd(TEST_ICD_PATH_VERSION_2, ManifestOptions{}.set_discovery_type(ManifestDiscoveryType::override_folder)) + env.add_icd(TEST_ICD_PATH_VERSION_2, ManifestOptions{}.set_discovery_type(ManifestDiscoveryType::overflow_folder)) .add_physical_device( PhysicalDevice{}.set_api_version(VK_API_VERSION_1_1).set_deviceName("additional_device").set_deviceUUID(uuids[0])); @@ -3795,7 +3534,7 @@ TEST(SettingsFile, InvalidDriverConfigurations) { .add_physical_device( PhysicalDevice{}.set_api_version(VK_API_VERSION_1_1).set_deviceName("regular_driver").set_deviceUUID(uuids[0])); - env.add_icd(TEST_ICD_PATH_VERSION_2, ManifestOptions{}.set_discovery_type(ManifestDiscoveryType::override_folder)) + env.add_icd(TEST_ICD_PATH_VERSION_2, ManifestOptions{}.set_discovery_type(ManifestDiscoveryType::overflow_folder)) .add_physical_device( PhysicalDevice{}.set_api_version(VK_API_VERSION_1_1).set_deviceName("additional_device").set_deviceUUID(uuids[2])); @@ -3831,7 +3570,7 @@ TEST(SettingsFile, DeviceConfigurationReordersAdditionalDrivers) { .add_physical_device( PhysicalDevice{}.set_api_version(VK_API_VERSION_1_1).set_deviceName("regular_driverB").set_deviceUUID(uuids[1])); - env.add_icd(TEST_ICD_PATH_VERSION_2, ManifestOptions{}.set_discovery_type(ManifestDiscoveryType::override_folder)) + env.add_icd(TEST_ICD_PATH_VERSION_2, ManifestOptions{}.set_discovery_type(ManifestDiscoveryType::overflow_folder)) .set_icd_api_version(VK_API_VERSION_1_1) .add_physical_device( PhysicalDevice{}.set_api_version(VK_API_VERSION_1_1).set_deviceName("additional_device").set_deviceUUID(uuids[2])); @@ -3891,7 +3630,7 @@ TEST(SettingsFile, DeviceConfigurationReordersExclusiveAdditionalDrivers) { .add_physical_device( PhysicalDevice{}.set_api_version(VK_API_VERSION_1_1).set_deviceName("regular_driverB").set_deviceUUID(uuids[1])); - env.add_icd(TEST_ICD_PATH_VERSION_2, ManifestOptions{}.set_discovery_type(ManifestDiscoveryType::override_folder)) + env.add_icd(TEST_ICD_PATH_VERSION_2, ManifestOptions{}.set_discovery_type(ManifestDiscoveryType::overflow_folder)) .set_icd_api_version(VK_API_VERSION_1_1) .add_physical_device( PhysicalDevice{}.set_api_version(VK_API_VERSION_1_1).set_deviceName("additional_device").set_deviceUUID(uuids[2])); @@ -3938,49 +3677,3 @@ TEST(SettingsFile, DeviceConfigurationPreservesLayerEnumeration) { auto layer_props = env.GetLayerProperties(1); EXPECT_TRUE(string_eq(layer_props.at(0).layerName, layer_name)); } - -// A meta-layer whose component chain loops back to itself is normally rejected by -// verify_all_meta_layers, but layers pulled in from the settings file skip that pass. Without a -// recursion guard in loader_add_meta_layer this cyclic reference recurses until the stack overflows. -TEST(SettingsFile, CyclicMetaLayerComponentDoesNotRecurse) { - FrameworkEnvironment env{}; - env.add_icd(TEST_ICD_PATH_VERSION_2).add_physical_device({}); - - const char* meta_a = "VK_LAYER_meta_A"; - const char* meta_b = "VK_LAYER_meta_B"; - env.add_implicit_layer( - ManifestOptions{}.set_json_name("meta_a.json"), - ManifestLayer{}.set_file_format_version({1, 2, 0}).add_layer(ManifestLayer::LayerDescription{} - .set_name(meta_a) - .set_api_version(VK_MAKE_API_VERSION(0, 1, 1, 0)) - .add_component_layer(meta_b) - .set_disable_environment("DISABLE_A"))); - env.add_implicit_layer( - ManifestOptions{}.set_json_name("meta_b.json"), - ManifestLayer{}.set_file_format_version({1, 2, 0}).add_layer(ManifestLayer::LayerDescription{} - .set_name(meta_b) - .set_api_version(VK_MAKE_API_VERSION(0, 1, 1, 0)) - .add_component_layer(meta_a) - .set_disable_environment("DISABLE_B"))); - - std::filesystem::path folder = env.get_folder(ManifestLocation::implicit_layer).location(); - env.update_loader_settings(env.loader_settings.set_file_format_version({1, 0, 0}).add_app_specific_setting( - AppSpecificSettings{} - .add_stderr_log_filter("all") - .add_layer_configuration(LoaderSettingsLayerConfiguration{} - .set_name(meta_a) - .set_path(folder / "meta_a.json") - .set_control("on") - .set_treat_as_implicit_manifest(true)) - .add_layer_configuration(LoaderSettingsLayerConfiguration{} - .set_name(meta_b) - .set_path(folder / "meta_b.json") - .set_control("on") - .set_treat_as_implicit_manifest(true)))); - - InstWrapper inst{env.vulkan_functions}; - FillDebugUtilsCreateDetails(inst.create_info, env.debug_log); - // Before the recursion guard this call never returned - it recursed until the stack overflowed. - inst.CheckCreate(); - ASSERT_TRUE(env.debug_log.find("recursively references itself through its component layers")); -}
Yes vkEnumerateInstanceLayerProperties
"app_keys"List of paths to executables that the meta-layer applies to. - Meta-layers Only"layer"/"layers"NoN/A
"blacklisted_layers"List of explicit layer names that should not be loaded even if - requested by the application. - Meta-layers Only"layer"/"layers"NoN/A
"component_layers"Indicates the component layer names that are - part of a meta-layer. - The names listed must be the "name" identified in each of the component - layer's Mainfest file "name" tag (this is the same as the name of the - layer that is passed to the `vkCreateInstance` command). - All component layers must be present on the system and found by the - loader in order for this meta-layer to be available and activated.
- This field must not be present if "library_path" is defined. -
Meta-layers Only"layer"/"layers"NoN/A
"description" A high-level description of the layer and its intended use.
"library_path"Specifies either a filename, a relative pathname, or a full pathname to + REQUIRED: Specifies either a filename, a relative pathname, or a full pathname to a layer shared library file. If "library_path" specifies a relative pathname, it is relative to the path of the JSON manifest file (e.g. for cases when an application @@ -1906,11 +1750,10 @@ Here's an example of a meta-layer manifest file: There are no rules about the name of the layer shared library files other than it should end with the appropriate suffix (".DLL" on Windows, ".so" on Linux, and ".dylib" on macOS).
- This field must not be present if "component_layers" is defined.
Not Valid For Meta-layersNone "layer"/"layers"Yes for Non-Meta layersYes N/A
"library_arch"Yes vkEnumerateInstanceLayerProperties
"override_paths"List of paths which will be used as the search location for component - layers. - Meta-layers Only"layer"/"layers"NoN/A
"pre_instance_functions" OPTIONAL: Indicates which functions the layer wishes to @@ -1985,6 +1818,16 @@ Here's an example of a meta-layer manifest file: The current highest supported Layer Manifest file format supported is 1.2.0. Information about each version is detailed in the following sub-sections: +### Layer Manifest File Version 1.2.2 + +Deprecates Meta Layers and the following fields in the layer manifest file: +* "app\_keys" +* "blacklisted\_layers" +* "component\_layers" +* "override\_paths" + +The "library_path" field is now mandatory. + ### Layer Manifest File Version 1.2.1 Added the "library\_arch" field to the layer manifest to allow the loader to @@ -2310,7 +2153,7 @@ Android Vulkan documentation.
LLP_LAYER_7If a layer is a Meta-layer, each component layer in its manifest file + DEPRECATED: If a layer is a Meta-layer, each component layer in its manifest file must be present on the system. The layer will not be loaded.
LLP_LAYER_8If a layer is a Meta-layer, each component layer in its manifest file + DEPRECATED: If a layer is a Meta-layer, each component layer in its manifest file must report the same or a newer Vulkan API major and minor version than the meta-layer.
LLP_LOADER_10A loader must verify that all meta-layers contain valid + DEPRECATED: A loader must verify that all meta-layers contain valid component layers that the loader can find on the system and that also report the same Vulkan API version as the meta-layer itself before it loads the meta-layer. @@ -2729,7 +2572,7 @@ Android Vulkan documentation.
LLP_LOADER_11If the override meta-layer is present, a loader must load it + DEPRECATED: If the override meta-layer is present, a loader must load it and corresponding component layers after all other implicit layers have been added to the call chain.
LLP_LOADER_12If the override meta-layer is present and has a blacklist of layers to + DEPRECATED: If the override meta-layer is present and has a blacklist of layers to remove, a loader must disable all layers listed in the blacklist. The behavior is undefined and may result in crashes or corruption.