Skip to content

Commit 7a20aa9

Browse files
Add test which enables most layer env-vars at once
Makes sure the various combinations of environment variables and settings file interacts according to expectations.
1 parent b7d2562 commit 7a20aa9

File tree

1 file changed

+162
-0
lines changed

1 file changed

+162
-0
lines changed

tests/loader_settings_tests.cpp

Lines changed: 162 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2825,3 +2825,165 @@ TEST(SettingsFile, TooManyLayers) {
28252825
}
28262826
}
28272827
}
2828+
2829+
TEST(SettingsFile, EnvVarsWorkTogether) {
2830+
FrameworkEnvironment env{};
2831+
env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2)).add_physical_device(PhysicalDevice{}.set_deviceName("regular").finish());
2832+
env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2).set_discovery_type(ManifestDiscoveryType::env_var))
2833+
.add_physical_device(PhysicalDevice{}.set_deviceName("env_var").finish());
2834+
env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2).set_discovery_type(ManifestDiscoveryType::add_env_var))
2835+
.add_physical_device(PhysicalDevice{}.set_deviceName("add_env_var").finish());
2836+
2837+
const char* regular_explicit_layer = "VK_LAYER_regular_explicit_layer";
2838+
env.add_explicit_layer(TestLayerDetails{
2839+
ManifestLayer{}.add_layer(
2840+
ManifestLayer::LayerDescription{}.set_name(regular_explicit_layer).set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)),
2841+
"regular_explicit_layer.json"});
2842+
const char* regular_explicit_layer_settings_file_set_on = "VK_LAYER_regular_explicit_layer_settings_file_set_on";
2843+
env.add_explicit_layer(TestLayerDetails{ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{}
2844+
.set_name(regular_explicit_layer_settings_file_set_on)
2845+
.set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)),
2846+
"regular_explicit_layer_settings_file_set_on.json"});
2847+
2848+
const char* env_var_explicit_layer = "VK_LAYER_env_var_explicit_layer";
2849+
env.add_explicit_layer(TestLayerDetails{
2850+
ManifestLayer{}.add_layer(
2851+
ManifestLayer::LayerDescription{}.set_name(env_var_explicit_layer).set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)),
2852+
"env_var_explicit_layer.json"}
2853+
.set_discovery_type(ManifestDiscoveryType::env_var));
2854+
2855+
const char* add_env_var_explicit_layer = "VK_LAYER_add_env_var_explicit_layer";
2856+
env.add_explicit_layer(TestLayerDetails{
2857+
ManifestLayer{}.add_layer(
2858+
ManifestLayer::LayerDescription{}.set_name(add_env_var_explicit_layer).set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)),
2859+
"add_env_var_explicit_layer.json"}
2860+
.set_discovery_type(ManifestDiscoveryType::add_env_var));
2861+
2862+
const char* regular_implicit_layer = "VK_LAYER_regular_implicit_layer";
2863+
env.add_implicit_layer(TestLayerDetails{ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{}
2864+
.set_disable_environment("A")
2865+
.set_name(regular_implicit_layer)
2866+
.set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)),
2867+
"regular_implicit_layer.json"});
2868+
2869+
const char* env_var_implicit_layer = "VK_LAYER_env_var_implicit_layer";
2870+
env.add_implicit_layer(TestLayerDetails{ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{}
2871+
.set_disable_environment("B")
2872+
.set_name(env_var_implicit_layer)
2873+
.set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)),
2874+
"env_var_implicit_layer.json"}
2875+
.set_discovery_type(ManifestDiscoveryType::env_var));
2876+
2877+
const char* add_env_var_implicit_layer = "VK_LAYER_add_env_var_implicit_layer";
2878+
env.add_implicit_layer(TestLayerDetails{ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{}
2879+
.set_disable_environment("C")
2880+
.set_name(add_env_var_implicit_layer)
2881+
.set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)),
2882+
"add_env_var_implicit_layer.json"}
2883+
.set_discovery_type(ManifestDiscoveryType::add_env_var));
2884+
2885+
// Settings file only contains the one layer it wants enabled
2886+
env.loader_settings.set_file_format_version({1, 0, 0}).add_app_specific_setting(
2887+
AppSpecificSettings{}
2888+
.add_layer_configuration(LoaderSettingsLayerConfiguration{}
2889+
.set_name(regular_implicit_layer)
2890+
.set_path(env.get_shimmed_layer_manifest_path(4))
2891+
.set_control("auto")
2892+
.set_treat_as_implicit_manifest(true))
2893+
.add_layer_configuration(LoaderSettingsLayerConfiguration{}
2894+
.set_name(regular_explicit_layer)
2895+
.set_path(env.get_shimmed_layer_manifest_path(0))
2896+
.set_control("auto"))
2897+
.add_layer_configuration(LoaderSettingsLayerConfiguration{}
2898+
.set_name(regular_explicit_layer_settings_file_set_on)
2899+
.set_path(env.get_shimmed_layer_manifest_path(1))
2900+
.set_control("on"))
2901+
.add_layer_configuration(LoaderSettingsLayerConfiguration{}.set_control("unordered_layer_location")));
2902+
env.update_loader_settings(env.loader_settings);
2903+
2904+
{ // VK_INSTANCE_LAYERS
2905+
EnvVarWrapper instance_layers{"VK_INSTANCE_LAYERS", regular_explicit_layer};
2906+
InstWrapper inst{env.vulkan_functions};
2907+
inst.CheckCreate();
2908+
auto layers = inst.GetActiveLayers(inst.GetPhysDev(), 4);
2909+
EXPECT_TRUE(string_eq(layers.at(0).layerName, regular_implicit_layer));
2910+
EXPECT_TRUE(string_eq(layers.at(1).layerName, regular_explicit_layer));
2911+
EXPECT_TRUE(string_eq(layers.at(2).layerName, regular_explicit_layer_settings_file_set_on));
2912+
EXPECT_TRUE(string_eq(layers.at(3).layerName, env_var_implicit_layer));
2913+
}
2914+
{ // VK_LOADER_LAYERS_ENABLE
2915+
EnvVarWrapper env_var_enable{"VK_LOADER_LAYERS_ENABLE", regular_explicit_layer};
2916+
InstWrapper inst{env.vulkan_functions};
2917+
inst.CheckCreate();
2918+
auto layers = inst.GetActiveLayers(inst.GetPhysDev(), 4);
2919+
EXPECT_TRUE(string_eq(layers.at(0).layerName, regular_implicit_layer));
2920+
EXPECT_TRUE(string_eq(layers.at(1).layerName, regular_explicit_layer));
2921+
EXPECT_TRUE(string_eq(layers.at(2).layerName, regular_explicit_layer_settings_file_set_on));
2922+
EXPECT_TRUE(string_eq(layers.at(3).layerName, env_var_implicit_layer));
2923+
}
2924+
{ // VK_LOADER_LAYERS_DISABLE
2925+
EnvVarWrapper env_var_disable{"VK_LOADER_LAYERS_DISABLE", "~all~"}; // ignored by settings file
2926+
InstWrapper inst{env.vulkan_functions};
2927+
inst.CheckCreate();
2928+
auto layers = inst.GetActiveLayers(inst.GetPhysDev(), 1);
2929+
EXPECT_TRUE(string_eq(layers.at(0).layerName, regular_explicit_layer_settings_file_set_on));
2930+
}
2931+
{ // VK_LOADER_LAYERS_ALLOW
2932+
EnvVarWrapper env_var_allow{"VK_LOADER_LAYERS_ALLOW", regular_implicit_layer};
2933+
// Allow only makes sense when the disable env-var is also set
2934+
EnvVarWrapper env_var_disable{"VK_LOADER_LAYERS_DISABLE", "~implicit~"};
2935+
2936+
InstWrapper inst{env.vulkan_functions};
2937+
inst.CheckCreate();
2938+
auto layers = inst.GetActiveLayers(inst.GetPhysDev(), 2);
2939+
// The regular_implicit_layer is set to "auto" so is affected by environment variables
2940+
EXPECT_TRUE(string_eq(layers.at(0).layerName, regular_implicit_layer));
2941+
EXPECT_TRUE(string_eq(layers.at(1).layerName, regular_explicit_layer_settings_file_set_on));
2942+
}
2943+
{ // VK_LAYER_PATH
2944+
// VK_LAYER_PATH is set by add_explicit_layer()
2945+
InstWrapper inst{env.vulkan_functions};
2946+
inst.create_info.add_layer(env_var_explicit_layer);
2947+
inst.CheckCreate();
2948+
auto layers = inst.GetActiveLayers(inst.GetPhysDev(), 4);
2949+
EXPECT_TRUE(string_eq(layers.at(0).layerName, regular_implicit_layer));
2950+
EXPECT_TRUE(string_eq(layers.at(1).layerName, regular_explicit_layer_settings_file_set_on));
2951+
EXPECT_TRUE(string_eq(layers.at(2).layerName, env_var_implicit_layer));
2952+
EXPECT_TRUE(string_eq(layers.at(3).layerName, env_var_explicit_layer));
2953+
}
2954+
{ // VK_IMPLICIT_LAYER_PATH
2955+
// VK_IMPLICIT_LAYER_PATH is set by add_implicit_layer()
2956+
InstWrapper inst{env.vulkan_functions};
2957+
inst.CheckCreate();
2958+
auto layers = inst.GetActiveLayers(inst.GetPhysDev(), 3);
2959+
EXPECT_TRUE(string_eq(layers.at(0).layerName, regular_implicit_layer));
2960+
EXPECT_TRUE(string_eq(layers.at(1).layerName, regular_explicit_layer_settings_file_set_on));
2961+
EXPECT_TRUE(string_eq(layers.at(2).layerName, env_var_implicit_layer));
2962+
}
2963+
{ // VK_ADD_LAYER_PATH
2964+
// VK_ADD_LAYER_PATH is set by add_explicit_layer(), but we need to disable VK_LAYER_PATH
2965+
// since VK_LAYER_PATH overrides VK_ADD_LAYER_PATH
2966+
EnvVarWrapper env_var_vk_layer_path{"VK_LAYER_PATH", ""};
2967+
env_var_vk_layer_path.remove_value();
2968+
InstWrapper inst{env.vulkan_functions};
2969+
inst.create_info.add_layer(add_env_var_explicit_layer);
2970+
inst.CheckCreate();
2971+
auto layers = inst.GetActiveLayers(inst.GetPhysDev(), 4);
2972+
EXPECT_TRUE(string_eq(layers.at(0).layerName, regular_implicit_layer));
2973+
EXPECT_TRUE(string_eq(layers.at(1).layerName, regular_explicit_layer_settings_file_set_on));
2974+
EXPECT_TRUE(string_eq(layers.at(2).layerName, env_var_implicit_layer));
2975+
EXPECT_TRUE(string_eq(layers.at(3).layerName, add_env_var_explicit_layer));
2976+
}
2977+
{ // VK_ADD_IMPLICIT_LAYER_PATH
2978+
// VK_ADD_IMPLICIT_LAYER_PATH is set by add_explicit_layer(), but we need to disable VK_LAYER_PATH
2979+
// since VK_IMPLICIT_LAYER_PATH overrides VK_ADD_IMPLICIT_LAYER_PATH
2980+
EnvVarWrapper env_var_vk_layer_path{"VK_IMPLICIT_LAYER_PATH", ""};
2981+
env_var_vk_layer_path.remove_value();
2982+
InstWrapper inst{env.vulkan_functions};
2983+
inst.CheckCreate();
2984+
auto layers = inst.GetActiveLayers(inst.GetPhysDev(), 3);
2985+
EXPECT_TRUE(string_eq(layers.at(0).layerName, regular_implicit_layer));
2986+
EXPECT_TRUE(string_eq(layers.at(1).layerName, regular_explicit_layer_settings_file_set_on));
2987+
EXPECT_TRUE(string_eq(layers.at(2).layerName, add_env_var_implicit_layer));
2988+
}
2989+
}

0 commit comments

Comments
 (0)