Skip to content

Commit 142b4ed

Browse files
Fix layers with pre-inst funcs from being loaded erroneously
The loader_scan_for_implicit_layers function was not removing inactive layers from the list of layers gotten from the loader settings file. This caused layers with pre-instance functions to loaded and executed. For example, layers with an enable-environment field shouldn't be loaded unless their respective env-var was set. This lack of filtering didn't change the list of layers active during vkCreateInstance, but does cause adverse side effects during pre-instance API function calls.
1 parent 90a3ab1 commit 142b4ed

File tree

2 files changed

+225
-0
lines changed

2 files changed

+225
-0
lines changed

loader/loader.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3979,6 +3979,17 @@ VkResult loader_scan_for_implicit_layers(struct loader_instance *inst, struct lo
39793979
goto out;
39803980
}
39813981

3982+
// Remove layers from settings file that are off, are implicit, or are implicit layers that aren't active
3983+
for (uint32_t i = 0; i < settings_layers.count; ++i) {
3984+
if (settings_layers.list[i].settings_control_value == LOADER_SETTINGS_LAYER_CONTROL_OFF ||
3985+
settings_layers.list[i].settings_control_value == LOADER_SETTINGS_LAYER_UNORDERED_LAYER_LOCATION ||
3986+
(settings_layers.list[i].type_flags & VK_LAYER_TYPE_FLAG_EXPLICIT_LAYER) == VK_LAYER_TYPE_FLAG_EXPLICIT_LAYER ||
3987+
!loader_implicit_layer_is_enabled(inst, layer_filters, &settings_layers.list[i])) {
3988+
loader_remove_layer_in_list(inst, &settings_layers, i);
3989+
i--;
3990+
}
3991+
}
3992+
39823993
// If we should not look for layers using other mechanisms, assign settings_layers to instance_layers and jump to the
39833994
// output
39843995
if (!should_search_for_other_layers) {

tests/loader_settings_tests.cpp

Lines changed: 214 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2143,6 +2143,220 @@ TEST(SettingsFile, ImplicitLayersNotAccidentallyEnabled) {
21432143
ASSERT_TRUE(string_eq(layers.at(0).layerName, layer_names.at(9)));
21442144
}
21452145
}
2146+
2147+
TEST(SettingsFile, ImplicitLayersPreInstanceEnumInstLayerProps) {
2148+
FrameworkEnvironment env;
2149+
env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA));
2150+
const char* implicit_layer_name = "VK_LAYER_ImplicitTestLayer";
2151+
2152+
env.add_implicit_layer(
2153+
ManifestLayer{}.set_file_format_version({1, 1, 2}).add_layer(
2154+
ManifestLayer::LayerDescription{}
2155+
.set_name(implicit_layer_name)
2156+
.set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)
2157+
.set_disable_environment("DISABLE_ME")
2158+
.add_pre_instance_function(ManifestLayer::LayerDescription::FunctionOverride{}
2159+
.set_vk_func("vkEnumerateInstanceLayerProperties")
2160+
.set_override_name("test_preinst_vkEnumerateInstanceLayerProperties"))),
2161+
"implicit_test_layer.json");
2162+
2163+
env.update_loader_settings(
2164+
env.loader_settings.add_app_specific_setting(AppSpecificSettings{}.add_stderr_log_filter("all").add_layer_configuration(
2165+
LoaderSettingsLayerConfiguration{}
2166+
.set_name(implicit_layer_name)
2167+
.set_path(env.get_shimmed_layer_manifest_path(0))
2168+
.set_control("auto")
2169+
.set_treat_as_implicit_manifest(true))));
2170+
2171+
uint32_t layer_props = 43;
2172+
auto& layer = env.get_test_layer(0);
2173+
layer.set_reported_layer_props(layer_props);
2174+
2175+
uint32_t count = 0;
2176+
ASSERT_EQ(VK_SUCCESS, env.vulkan_functions.vkEnumerateInstanceLayerProperties(&count, nullptr));
2177+
ASSERT_EQ(count, layer_props);
2178+
}
2179+
2180+
TEST(SettingsFile, EnableEnvironmentImplicitLayersPreInstanceEnumInstLayerProps) {
2181+
FrameworkEnvironment env;
2182+
env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA));
2183+
const char* implicit_layer_name = "VK_LAYER_ImplicitTestLayer";
2184+
2185+
env.add_implicit_layer(
2186+
ManifestLayer{}.set_file_format_version({1, 1, 2}).add_layer(
2187+
ManifestLayer::LayerDescription{}
2188+
.set_name(implicit_layer_name)
2189+
.set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)
2190+
.set_disable_environment("DISABLE_ME")
2191+
.set_enable_environment("ENABLE_ME")
2192+
.add_pre_instance_function(ManifestLayer::LayerDescription::FunctionOverride{}
2193+
.set_vk_func("vkEnumerateInstanceLayerProperties")
2194+
.set_override_name("test_preinst_vkEnumerateInstanceLayerProperties"))),
2195+
"implicit_test_layer.json");
2196+
2197+
env.update_loader_settings(
2198+
env.loader_settings.add_app_specific_setting(AppSpecificSettings{}.add_stderr_log_filter("all").add_layer_configuration(
2199+
LoaderSettingsLayerConfiguration{}
2200+
.set_name(implicit_layer_name)
2201+
.set_path(env.get_shimmed_layer_manifest_path(0))
2202+
.set_control("auto")
2203+
.set_treat_as_implicit_manifest(true))));
2204+
2205+
uint32_t layer_props = 43;
2206+
auto& layer = env.get_test_layer(0);
2207+
layer.set_reported_layer_props(layer_props);
2208+
2209+
uint32_t count = 0;
2210+
ASSERT_EQ(VK_SUCCESS, env.vulkan_functions.vkEnumerateInstanceLayerProperties(&count, nullptr));
2211+
ASSERT_EQ(count, 1U);
2212+
std::array<VkLayerProperties, 1> layers{};
2213+
ASSERT_EQ(VK_SUCCESS, env.vulkan_functions.vkEnumerateInstanceLayerProperties(&count, layers.data()));
2214+
ASSERT_EQ(count, 1U);
2215+
ASSERT_TRUE(string_eq(layers.at(0).layerName, implicit_layer_name));
2216+
}
2217+
2218+
TEST(SettingsFile, ImplicitLayersPreInstanceEnumInstExtProps) {
2219+
FrameworkEnvironment env;
2220+
env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA));
2221+
const char* implicit_layer_name = "VK_LAYER_ImplicitTestLayer";
2222+
2223+
env.add_implicit_layer(
2224+
ManifestLayer{}.set_file_format_version({1, 1, 2}).add_layer(
2225+
ManifestLayer::LayerDescription{}
2226+
.set_name(implicit_layer_name)
2227+
.set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)
2228+
.set_disable_environment("DISABLE_ME")
2229+
.add_pre_instance_function(ManifestLayer::LayerDescription::FunctionOverride{}
2230+
.set_vk_func("vkEnumerateInstanceExtensionProperties")
2231+
.set_override_name("test_preinst_vkEnumerateInstanceExtensionProperties"))),
2232+
"implicit_test_layer.json");
2233+
2234+
env.update_loader_settings(
2235+
env.loader_settings.add_app_specific_setting(AppSpecificSettings{}.add_stderr_log_filter("all").add_layer_configuration(
2236+
LoaderSettingsLayerConfiguration{}
2237+
.set_name(implicit_layer_name)
2238+
.set_path(env.get_shimmed_layer_manifest_path(0))
2239+
.set_control("auto")
2240+
.set_treat_as_implicit_manifest(true))));
2241+
2242+
uint32_t ext_props = 52;
2243+
auto& layer = env.get_test_layer(0);
2244+
layer.set_reported_extension_props(ext_props);
2245+
2246+
uint32_t count = 0;
2247+
ASSERT_EQ(VK_SUCCESS, env.vulkan_functions.vkEnumerateInstanceExtensionProperties(nullptr, &count, nullptr));
2248+
ASSERT_EQ(count, ext_props);
2249+
}
2250+
2251+
TEST(SettingsFile, EnableEnvironmentImplicitLayersPreInstanceEnumInstExtProps) {
2252+
FrameworkEnvironment env;
2253+
env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA));
2254+
const char* implicit_layer_name = "VK_LAYER_ImplicitTestLayer";
2255+
2256+
env.add_implicit_layer(
2257+
ManifestLayer{}.set_file_format_version({1, 1, 2}).add_layer(
2258+
ManifestLayer::LayerDescription{}
2259+
.set_name(implicit_layer_name)
2260+
.set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)
2261+
.set_disable_environment("DISABLE_ME")
2262+
.set_enable_environment("ENABLE_ME")
2263+
.add_pre_instance_function(ManifestLayer::LayerDescription::FunctionOverride{}
2264+
.set_vk_func("vkEnumerateInstanceExtensionProperties")
2265+
.set_override_name("test_preinst_vkEnumerateInstanceExtensionProperties"))),
2266+
"implicit_test_layer.json");
2267+
2268+
env.update_loader_settings(
2269+
env.loader_settings.add_app_specific_setting(AppSpecificSettings{}.add_stderr_log_filter("all").add_layer_configuration(
2270+
LoaderSettingsLayerConfiguration{}
2271+
.set_name(implicit_layer_name)
2272+
.set_path(env.get_shimmed_layer_manifest_path(0))
2273+
.set_control("auto")
2274+
.set_treat_as_implicit_manifest(true))));
2275+
2276+
uint32_t ext_props = 52;
2277+
auto& layer = env.get_test_layer(0);
2278+
layer.set_reported_extension_props(ext_props);
2279+
2280+
auto extensions = env.GetInstanceExtensions(4);
2281+
EXPECT_TRUE(string_eq(extensions.at(0).extensionName, VK_EXT_DEBUG_REPORT_EXTENSION_NAME));
2282+
EXPECT_TRUE(string_eq(extensions.at(1).extensionName, VK_EXT_DEBUG_UTILS_EXTENSION_NAME));
2283+
EXPECT_TRUE(string_eq(extensions.at(2).extensionName, VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME));
2284+
EXPECT_TRUE(string_eq(extensions.at(3).extensionName, VK_LUNARG_DIRECT_DRIVER_LOADING_EXTENSION_NAME));
2285+
}
2286+
2287+
TEST(SettingsFile, ImplicitLayersPreInstanceVersion) {
2288+
FrameworkEnvironment env;
2289+
env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA))
2290+
.add_physical_device({})
2291+
.set_icd_api_version(VK_MAKE_API_VERSION(0, 1, 2, 3));
2292+
2293+
const char* implicit_layer_name = "VK_LAYER_ImplicitTestLayer";
2294+
2295+
env.add_implicit_layer(ManifestLayer{}.set_file_format_version({1, 1, 2}).add_layer(
2296+
ManifestLayer::LayerDescription{}
2297+
.set_name(implicit_layer_name)
2298+
.set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)
2299+
.set_api_version(VK_MAKE_API_VERSION(0, 1, 2, 3))
2300+
.set_disable_environment("DISABLE_ME")
2301+
.add_pre_instance_function(ManifestLayer::LayerDescription::FunctionOverride{}
2302+
.set_vk_func("vkEnumerateInstanceVersion")
2303+
.set_override_name("test_preinst_vkEnumerateInstanceVersion"))),
2304+
"implicit_test_layer.json");
2305+
2306+
env.update_loader_settings(
2307+
env.loader_settings.add_app_specific_setting(AppSpecificSettings{}.add_stderr_log_filter("all").add_layer_configuration(
2308+
LoaderSettingsLayerConfiguration{}
2309+
.set_name(implicit_layer_name)
2310+
.set_path(env.get_shimmed_layer_manifest_path(0))
2311+
.set_control("auto")
2312+
.set_treat_as_implicit_manifest(true))));
2313+
2314+
uint32_t layer_version = VK_MAKE_API_VERSION(1, 2, 3, 4);
2315+
auto& layer = env.get_test_layer(0);
2316+
layer.set_reported_instance_version(layer_version);
2317+
2318+
uint32_t version = 0;
2319+
ASSERT_EQ(VK_SUCCESS, env.vulkan_functions.vkEnumerateInstanceVersion(&version));
2320+
ASSERT_EQ(version, layer_version);
2321+
}
2322+
2323+
TEST(SettingsFile, EnableEnvironmentImplicitLayersPreInstanceVersion) {
2324+
FrameworkEnvironment env;
2325+
env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA))
2326+
.add_physical_device({})
2327+
.set_icd_api_version(VK_MAKE_API_VERSION(0, 1, 2, 3));
2328+
2329+
const char* implicit_layer_name = "VK_LAYER_ImplicitTestLayer";
2330+
2331+
env.add_implicit_layer(ManifestLayer{}.set_file_format_version({1, 1, 2}).add_layer(
2332+
ManifestLayer::LayerDescription{}
2333+
.set_name(implicit_layer_name)
2334+
.set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)
2335+
.set_api_version(VK_MAKE_API_VERSION(0, 1, 2, 3))
2336+
.set_disable_environment("DISABLE_ME")
2337+
.set_enable_environment("ENABLE_ME")
2338+
.add_pre_instance_function(ManifestLayer::LayerDescription::FunctionOverride{}
2339+
.set_vk_func("vkEnumerateInstanceVersion")
2340+
.set_override_name("test_preinst_vkEnumerateInstanceVersion"))),
2341+
"implicit_test_layer.json");
2342+
2343+
env.update_loader_settings(
2344+
env.loader_settings.add_app_specific_setting(AppSpecificSettings{}.add_stderr_log_filter("all").add_layer_configuration(
2345+
LoaderSettingsLayerConfiguration{}
2346+
.set_name(implicit_layer_name)
2347+
.set_path(env.get_shimmed_layer_manifest_path(0))
2348+
.set_control("auto")
2349+
.set_treat_as_implicit_manifest(true))));
2350+
2351+
uint32_t layer_version = VK_MAKE_API_VERSION(1, 2, 3, 4);
2352+
auto& layer = env.get_test_layer(0);
2353+
layer.set_reported_instance_version(layer_version);
2354+
2355+
uint32_t version = 0;
2356+
ASSERT_EQ(VK_SUCCESS, env.vulkan_functions.vkEnumerateInstanceVersion(&version));
2357+
ASSERT_EQ(version, VK_HEADER_VERSION_COMPLETE);
2358+
}
2359+
21462360
// Settings can say which filters to use - make sure those are propagated & treated correctly
21472361
TEST(SettingsFile, StderrLogFilters) {
21482362
FrameworkEnvironment env{FrameworkSettings{}.set_log_filter("")};

0 commit comments

Comments
 (0)