Skip to content

Commit b032143

Browse files
Add ImplicitLayersNotAccidentallyEnabled test
Checks that env-var enabled implicit layers aren't turned on by being in the settings layer by accident.
1 parent bc3e4d3 commit b032143

File tree

1 file changed

+100
-34
lines changed

1 file changed

+100
-34
lines changed

tests/loader_settings_tests.cpp

Lines changed: 100 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -41,25 +41,40 @@ std::string get_settings_location_log_message([[maybe_unused]] FrameworkEnvironm
4141
return s + "/home/fake_home/.local/share/vulkan/loader_settings.d/vk_loader_settings.json";
4242
#endif
4343
}
44-
45-
const char* add_layer_and_settings(FrameworkEnvironment& env, const char* layer_name, bool implicit_layer, const char* control) {
46-
if (implicit_layer) {
47-
env.add_implicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{}
48-
.set_name(layer_name)
49-
.set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)
50-
.set_disable_environment("BADGER")),
51-
std::string(layer_name) + std::to_string(env.layers.size()) + ".json");
52-
} else {
44+
enum class LayerType {
45+
exp,
46+
imp,
47+
imp_with_enable_env,
48+
};
49+
const char* add_layer_and_settings(FrameworkEnvironment& env, const char* layer_name, LayerType layer_type, const char* control) {
50+
if (layer_type == LayerType::imp) {
51+
env.add_implicit_layer(
52+
ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{}
53+
.set_name(layer_name)
54+
.set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)
55+
.set_disable_environment("BADGER" + std::to_string(env.layers.size()))),
56+
std::string(layer_name) + std::to_string(env.layers.size()) + ".json");
57+
} else if (layer_type == LayerType::imp_with_enable_env) {
58+
env.add_implicit_layer(
59+
ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{}
60+
.set_name(layer_name)
61+
.set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)
62+
.set_disable_environment("BADGER" + std::to_string(env.layers.size()))
63+
.set_enable_environment("MUSHROOM" + std::to_string(env.layers.size()))),
64+
std::string(layer_name) + std::to_string(env.layers.size()) + ".json");
65+
} else if (layer_type == LayerType::exp) {
5366
env.add_explicit_layer(TestLayerDetails{
5467
ManifestLayer{}.add_layer(
5568
ManifestLayer::LayerDescription{}.set_name(layer_name).set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)),
5669
std::string(layer_name) + std::to_string(env.layers.size()) + ".json"});
70+
} else {
71+
abort();
5772
}
5873
env.loader_settings.app_specific_settings.back().add_layer_configuration(
5974
LoaderSettingsLayerConfiguration{}
6075
.set_name(layer_name)
6176
.set_control(control)
62-
.set_treat_as_implicit_manifest(implicit_layer)
77+
.set_treat_as_implicit_manifest(layer_type != LayerType::exp)
6378
.set_path(env.get_shimmed_layer_manifest_path(env.layers.size() - 1)));
6479
return layer_name;
6580
}
@@ -69,7 +84,7 @@ TEST(SettingsFile, FileExist) {
6984
FrameworkEnvironment env{};
7085
env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2)).add_physical_device({});
7186
env.loader_settings.add_app_specific_setting(AppSpecificSettings{}.add_stderr_log_filter("all"));
72-
const char* regular_layer_name = add_layer_and_settings(env, "VK_LAYER_TestLayer_0", false, "on");
87+
const char* regular_layer_name = add_layer_and_settings(env, "VK_LAYER_TestLayer_0", LayerType::exp, "on");
7388
env.update_loader_settings(env.loader_settings);
7489
{
7590
auto layer_props = env.GetLayerProperties(1);
@@ -453,7 +468,6 @@ TEST(SettingsFile, ApplicationEnablesIgnored) {
453468
{
454469
ASSERT_NO_FATAL_FAILURE(env.GetLayerProperties(0));
455470
InstWrapper inst{env.vulkan_functions};
456-
FillDebugUtilsCreateDetails(inst.create_info, env.debug_log);
457471
inst.create_info.add_layer(explicit_layer_name);
458472
ASSERT_NO_FATAL_FAILURE(inst.CheckCreate(VK_ERROR_LAYER_NOT_PRESENT));
459473
}
@@ -1480,7 +1494,6 @@ TEST(SettingsFile, EnvVarsWork_VK_INSTANCE_LAYERS) {
14801494
ASSERT_TRUE(string_eq(layer_props.at(1).layerName, explicit_layer_name));
14811495

14821496
InstWrapper inst{env.vulkan_functions};
1483-
FillDebugUtilsCreateDetails(inst.create_info, env.debug_log);
14841497
inst.CheckCreate();
14851498
auto layers = inst.GetActiveLayers(inst.GetPhysDev(), 1);
14861499
ASSERT_TRUE(string_eq(layers.at(0).layerName, explicit_layer_name));
@@ -1572,7 +1585,6 @@ TEST(SettingsFile, EnvVarsWork_VK_INSTANCE_LAYERS_multiple_layers) {
15721585
ASSERT_TRUE(string_eq(layer_props.at(1).layerName, explicit_layer_name3));
15731586

15741587
InstWrapper inst{env.vulkan_functions};
1575-
FillDebugUtilsCreateDetails(inst.create_info, env.debug_log);
15761588
inst.CheckCreate();
15771589
auto layers = inst.GetActiveLayers(inst.GetPhysDev(), 1);
15781590
ASSERT_TRUE(string_eq(layers.at(0).layerName, explicit_layer_name1));
@@ -1600,7 +1612,6 @@ TEST(SettingsFile, EnvVarsWork_VK_INSTANCE_LAYERS_multiple_layers) {
16001612
ASSERT_TRUE(string_eq(layer_props.at(1).layerName, explicit_layer_name3));
16011613

16021614
InstWrapper inst{env.vulkan_functions};
1603-
FillDebugUtilsCreateDetails(inst.create_info, env.debug_log);
16041615
inst.CheckCreate();
16051616
auto layers = inst.GetActiveLayers(inst.GetPhysDev(), 1);
16061617
ASSERT_TRUE(string_eq(layers.at(0).layerName, explicit_layer_name2));
@@ -1613,7 +1624,6 @@ TEST(SettingsFile, EnvVarsWork_VK_INSTANCE_LAYERS_multiple_layers) {
16131624
ASSERT_TRUE(string_eq(layer_props.at(1).layerName, explicit_layer_name3));
16141625

16151626
InstWrapper inst{env.vulkan_functions};
1616-
FillDebugUtilsCreateDetails(inst.create_info, env.debug_log);
16171627
inst.CheckCreate();
16181628
auto layers = inst.GetActiveLayers(inst.GetPhysDev(), 1);
16191629
ASSERT_TRUE(string_eq(layers.at(0).layerName, explicit_layer_name2));
@@ -1627,7 +1637,6 @@ TEST(SettingsFile, EnvVarsWork_VK_INSTANCE_LAYERS_multiple_layers) {
16271637
ASSERT_TRUE(string_eq(layer_props.at(2).layerName, explicit_layer_name3));
16281638

16291639
InstWrapper inst{env.vulkan_functions};
1630-
FillDebugUtilsCreateDetails(inst.create_info, env.debug_log);
16311640
inst.CheckCreate();
16321641
auto layers = inst.GetActiveLayers(inst.GetPhysDev(), 2);
16331642
ASSERT_TRUE(string_eq(layers.at(0).layerName, explicit_layer_name1));
@@ -1641,7 +1650,7 @@ TEST(SettingsFile, EnvVarsWork_VK_LOADER_LAYERS_ENABLE) {
16411650
env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2)).add_physical_device({});
16421651

16431652
env.loader_settings.add_app_specific_setting(AppSpecificSettings{}.add_stderr_log_filter("all"));
1644-
const char* explicit_layer_name = add_layer_and_settings(env, "VK_LAYER_Regular_TestLayer1", false, "off");
1653+
const char* explicit_layer_name = add_layer_and_settings(env, "VK_LAYER_Regular_TestLayer1", LayerType::exp, "off");
16451654
env.update_loader_settings(env.loader_settings);
16461655

16471656
EnvVarWrapper vk_instance_layers{"VK_LOADER_LAYERS_ENABLE", explicit_layer_name};
@@ -1659,20 +1668,20 @@ TEST(SettingsFile, settings_disable_layer_enabled_by_env_vars) {
16591668
env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2)).add_physical_device({});
16601669
env.loader_settings.add_app_specific_setting(AppSpecificSettings{}.add_stderr_log_filter("all"));
16611670
std::vector<const char*> layer_names;
1662-
layer_names.push_back(add_layer_and_settings(env, "VK_LAYER_alpha", true, "auto"));
1663-
layer_names.push_back(add_layer_and_settings(env, "VK_LAYER_bravo", true, "auto"));
1664-
layer_names.push_back(add_layer_and_settings(env, "VK_LAYER_charlie", true, "auto"));
1671+
layer_names.push_back(add_layer_and_settings(env, "VK_LAYER_alpha", LayerType::imp, "auto"));
1672+
layer_names.push_back(add_layer_and_settings(env, "VK_LAYER_bravo", LayerType::imp, "auto"));
1673+
layer_names.push_back(add_layer_and_settings(env, "VK_LAYER_charlie", LayerType::imp, "auto"));
16651674
env.loader_settings.app_specific_settings.back().add_layer_configuration(
16661675
LoaderSettingsLayerConfiguration{}.set_control("unordered_layer_location"));
1667-
layer_names.push_back(add_layer_and_settings(env, "VK_LAYER_delta", false, "auto"));
1668-
layer_names.push_back(add_layer_and_settings(env, "VK_LAYER_echo", false, "auto"));
1669-
layer_names.push_back(add_layer_and_settings(env, "VK_LAYER_foxtrot", false, "auto"));
1670-
layer_names.push_back(add_layer_and_settings(env, "VK_LAYER_gamma", false, "auto"));
1671-
layer_names.push_back(add_layer_and_settings(env, "VK_LAYER_indigo", false, "auto"));
1672-
auto disable_layer_name = add_layer_and_settings(env, "VK_LAYER_juniper", false, "off");
1673-
layer_names.push_back(add_layer_and_settings(env, "VK_LAYER_kangaroo", false, "on"));
1674-
layer_names.push_back(add_layer_and_settings(env, "VK_LAYER_lima", false, "auto"));
1675-
layer_names.push_back(add_layer_and_settings(env, "VK_LAYER_mango", false, "auto"));
1676+
layer_names.push_back(add_layer_and_settings(env, "VK_LAYER_delta", LayerType::exp, "auto"));
1677+
layer_names.push_back(add_layer_and_settings(env, "VK_LAYER_echo", LayerType::exp, "auto"));
1678+
layer_names.push_back(add_layer_and_settings(env, "VK_LAYER_foxtrot", LayerType::exp, "auto"));
1679+
layer_names.push_back(add_layer_and_settings(env, "VK_LAYER_gamma", LayerType::exp, "auto"));
1680+
layer_names.push_back(add_layer_and_settings(env, "VK_LAYER_indigo", LayerType::exp, "auto"));
1681+
auto disable_layer_name = add_layer_and_settings(env, "VK_LAYER_juniper", LayerType::exp, "off");
1682+
layer_names.push_back(add_layer_and_settings(env, "VK_LAYER_kangaroo", LayerType::exp, "on"));
1683+
layer_names.push_back(add_layer_and_settings(env, "VK_LAYER_lima", LayerType::exp, "auto"));
1684+
layer_names.push_back(add_layer_and_settings(env, "VK_LAYER_mango", LayerType::exp, "auto"));
16761685

16771686
env.update_loader_settings(env.loader_settings);
16781687
{
@@ -1682,7 +1691,6 @@ TEST(SettingsFile, settings_disable_layer_enabled_by_env_vars) {
16821691
ASSERT_TRUE(string_eq(layer_names.at(i), layer_props.at(i).layerName));
16831692
}
16841693
InstWrapper inst{env.vulkan_functions};
1685-
FillDebugUtilsCreateDetails(inst.create_info, env.debug_log);
16861694
inst.CheckCreate();
16871695
auto layers = inst.GetActiveLayers(inst.GetPhysDev(), 4);
16881696
ASSERT_TRUE(string_eq(layer_names.at(0), layers.at(0).layerName));
@@ -1697,7 +1705,6 @@ TEST(SettingsFile, settings_disable_layer_enabled_by_env_vars) {
16971705
ASSERT_TRUE(string_eq(layer_names.at(i), layer_props.at(i).layerName));
16981706
}
16991707
InstWrapper inst{env.vulkan_functions};
1700-
FillDebugUtilsCreateDetails(inst.create_info, env.debug_log);
17011708
inst.CheckCreate();
17021709
auto layers = inst.GetActiveLayers(inst.GetPhysDev(), 4);
17031710
ASSERT_TRUE(string_eq(layer_names.at(0), layers.at(0).layerName));
@@ -1712,7 +1719,6 @@ TEST(SettingsFile, settings_disable_layer_enabled_by_env_vars) {
17121719
}
17131720
InstWrapper inst{env.vulkan_functions};
17141721
inst.create_info.add_layer(disable_layer_name);
1715-
FillDebugUtilsCreateDetails(inst.create_info, env.debug_log);
17161722
inst.CheckCreate(VK_ERROR_LAYER_NOT_PRESENT);
17171723
}
17181724
}
@@ -2076,6 +2082,67 @@ TEST(SettingsFile, ImplicitLayerDisableEnvironmentVariableOverriden) {
20762082
}
20772083
}
20782084

2085+
TEST(SettingsFile, ImplicitLayersNotAccidentallyEnabled) {
2086+
FrameworkEnvironment env{};
2087+
env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2)).add_physical_device({});
2088+
env.loader_settings.add_app_specific_setting(AppSpecificSettings{}.add_stderr_log_filter("all"));
2089+
std::vector<const char*> layer_names;
2090+
2091+
layer_names.push_back(add_layer_and_settings(env, "VK_LAYER_alpha", LayerType::imp, "auto"));
2092+
layer_names.push_back(add_layer_and_settings(env, "VK_LAYER_bravo", LayerType::imp_with_enable_env, "auto"));
2093+
layer_names.push_back(add_layer_and_settings(env, "VK_LAYER_charlie", LayerType::imp_with_enable_env, "auto"));
2094+
layer_names.push_back(add_layer_and_settings(env, "VK_LAYER_delta", LayerType::imp_with_enable_env, "auto"));
2095+
2096+
layer_names.push_back(add_layer_and_settings(env, "VK_LAYER_echo", LayerType::exp, "auto"));
2097+
layer_names.push_back(add_layer_and_settings(env, "VK_LAYER_foxtrot", LayerType::exp, "auto"));
2098+
layer_names.push_back(add_layer_and_settings(env, "VK_LAYER_gamma", LayerType::exp, "auto"));
2099+
layer_names.push_back(add_layer_and_settings(env, "VK_LAYER_indigo", LayerType::exp, "auto"));
2100+
layer_names.push_back(add_layer_and_settings(env, "VK_LAYER_juniper", LayerType::exp, "auto"));
2101+
2102+
layer_names.push_back(add_layer_and_settings(env, "VK_LAYER_kangaroo", LayerType::exp, "on"));
2103+
2104+
layer_names.push_back(add_layer_and_settings(env, "VK_LAYER_lima", LayerType::exp, "auto"));
2105+
layer_names.push_back(add_layer_and_settings(env, "VK_LAYER_mango", LayerType::exp, "auto"));
2106+
layer_names.push_back(add_layer_and_settings(env, "VK_LAYER_niagara", LayerType::exp, "auto"));
2107+
2108+
env.update_loader_settings(env.loader_settings);
2109+
{
2110+
auto layer_props = env.GetLayerProperties(13);
2111+
for (size_t i = 0; i < layer_props.size(); i++) {
2112+
ASSERT_TRUE(string_eq(layer_names.at(i), layer_props.at(i).layerName));
2113+
}
2114+
InstWrapper inst{env.vulkan_functions};
2115+
inst.CheckCreate();
2116+
auto layers = inst.GetActiveLayers(inst.GetPhysDev(), 2);
2117+
ASSERT_TRUE(string_eq(layers.at(0).layerName, layer_names.at(0)));
2118+
ASSERT_TRUE(string_eq(layers.at(1).layerName, layer_names.at(9)));
2119+
}
2120+
2121+
{
2122+
EnvVarWrapper env_var{"MUSHROOM1", "1"};
2123+
auto layer_props = env.GetLayerProperties(13);
2124+
for (size_t i = 0; i < layer_props.size(); i++) {
2125+
ASSERT_TRUE(string_eq(layer_names.at(i), layer_props.at(i).layerName));
2126+
}
2127+
InstWrapper inst{env.vulkan_functions};
2128+
inst.CheckCreate();
2129+
auto layers = inst.GetActiveLayers(inst.GetPhysDev(), 3);
2130+
ASSERT_TRUE(string_eq(layers.at(0).layerName, layer_names.at(0)));
2131+
ASSERT_TRUE(string_eq(layers.at(1).layerName, layer_names.at(1)));
2132+
ASSERT_TRUE(string_eq(layers.at(2).layerName, layer_names.at(9)));
2133+
}
2134+
{
2135+
EnvVarWrapper env_var{"BADGER0", "1"};
2136+
auto layer_props = env.GetLayerProperties(13);
2137+
for (size_t i = 0; i < layer_props.size(); i++) {
2138+
ASSERT_TRUE(string_eq(layer_names.at(i), layer_props.at(i).layerName));
2139+
}
2140+
InstWrapper inst{env.vulkan_functions};
2141+
inst.CheckCreate();
2142+
auto layers = inst.GetActiveLayers(inst.GetPhysDev(), 1);
2143+
ASSERT_TRUE(string_eq(layers.at(0).layerName, layer_names.at(9)));
2144+
}
2145+
}
20792146
// Settings can say which filters to use - make sure those are propagated & treated correctly
20802147
TEST(SettingsFile, StderrLogFilters) {
20812148
FrameworkEnvironment env{FrameworkSettings{}.set_log_filter("")};
@@ -2444,7 +2511,6 @@ TEST(SettingsFile, ManyLayersEnabledInManyWays) {
24442511
ASSERT_TRUE(string_eq(layers[4].layerName, layer5));
24452512

24462513
InstWrapper inst{env.vulkan_functions};
2447-
FillDebugUtilsCreateDetails(inst.create_info, env.debug_log);
24482514
inst.CheckCreate();
24492515

24502516
auto active_layer_props = inst.GetActiveLayers(inst.GetPhysDev(), 3);

0 commit comments

Comments
 (0)