Skip to content

Commit 002a13d

Browse files
Fix devices in the settings file removing layers
The settings file supports multiple different kind of settings, layers, devices, and drivers, mixing and matching each kind. This didn't work when there was only a single boolean to determine if the settings are active. Adding a separate boolean for layers and devices in the settings allows for only running settings file logic when the relevant parts of the settings file are present, so that a settings file with only devices doesn't interfere with the layer enumeration and vice versa. Additionally, using booleans instead of just checking if the list of layer/device settings are non-empty allows the user to specify "no layers" and "no devices" on the system.
1 parent 128e7d4 commit 002a13d

File tree

4 files changed

+56
-27
lines changed

4 files changed

+56
-27
lines changed

loader/loader.c

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4710,7 +4710,7 @@ VkResult loader_enable_instance_layers(struct loader_instance *inst, const VkIns
47104710
goto out;
47114711
}
47124712

4713-
if (inst->settings.settings_active) {
4713+
if (inst->settings.settings_active && inst->settings.layer_configurations_active) {
47144714
res = enable_correct_layers_from_settings(inst, layer_filters, pCreateInfo->enabledLayerCount,
47154715
pCreateInfo->ppEnabledLayerNames, &inst->instance_layer_list,
47164716
&inst->app_activated_layer_list, &inst->expanded_activated_layer_list);
@@ -5571,7 +5571,8 @@ VkResult loader_validate_layers(const struct loader_instance *inst, const uint32
55715571
"loader_validate_layers: Layer %d does not exist in the list of available layers", i);
55725572
return VK_ERROR_LAYER_NOT_PRESENT;
55735573
}
5574-
if (inst->settings.settings_active && prop->settings_control_value != LOADER_SETTINGS_LAYER_CONTROL_ON &&
5574+
if (inst->settings.settings_active && inst->settings.layer_configurations_active &&
5575+
prop->settings_control_value != LOADER_SETTINGS_LAYER_CONTROL_ON &&
55755576
prop->settings_control_value != LOADER_SETTINGS_LAYER_CONTROL_DEFAULT) {
55765577
loader_log(inst, VULKAN_LOADER_ERROR_BIT, 0,
55775578
"loader_validate_layers: Layer %d was explicitly prevented from being enabled by the loader settings file",
@@ -5610,7 +5611,7 @@ VkResult loader_validate_instance_extensions(struct loader_instance *inst, const
56105611
goto out;
56115612
}
56125613

5613-
if (inst->settings.settings_active) {
5614+
if (inst->settings.settings_active && inst->settings.layer_configurations_active) {
56145615
res = enable_correct_layers_from_settings(inst, layer_filters, pCreateInfo->enabledLayerCount,
56155616
pCreateInfo->ppEnabledLayerNames, instance_layers, &active_layers,
56165617
&expanded_layers);
@@ -5986,8 +5987,9 @@ VKAPI_ATTR VkResult VKAPI_CALL terminator_CreateInstance(const VkInstanceCreateI
59865987
// If the settings file has device_configurations, we need to raise the ApiVersion drivers use to 1.1 if the driver
59875988
// supports 1.1 or higher. This allows 1.0 apps to use the device_configurations without the app having to set its own
59885989
// ApiVersion to 1.1 on its own.
5989-
if (ptr_instance->settings.settings_active && ptr_instance->settings.device_configuration_count > 0 &&
5990-
icd_version >= VK_API_VERSION_1_1 && requested_version < VK_API_VERSION_1_1) {
5990+
if (ptr_instance->settings.settings_active && ptr_instance->settings.device_configurations_active &&
5991+
ptr_instance->settings.device_configuration_count > 0 && icd_version >= VK_API_VERSION_1_1 &&
5992+
requested_version < VK_API_VERSION_1_1) {
59915993
if (NULL != pCreateInfo->pApplicationInfo) {
59925994
memcpy(&icd_app_info, pCreateInfo->pApplicationInfo, sizeof(VkApplicationInfo));
59935995
}
@@ -7114,7 +7116,7 @@ VKAPI_ATTR VkResult VKAPI_CALL terminator_EnumeratePhysicalDevices(VkInstance in
71147116
goto out;
71157117
}
71167118

7117-
if (inst->settings.settings_active && inst->settings.device_configuration_count > 0) {
7119+
if (inst->settings.settings_active && inst->settings.device_configurations_active) {
71187120
// Use settings file device_configurations if present
71197121
if (NULL == pPhysicalDevices) {
71207122
// take the minimum of the settings configurations count and number of terminators

loader/settings.c

Lines changed: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,7 @@ VkResult parse_layer_configurations(const struct loader_instance* inst, cJSON* s
190190

191191
uint32_t layer_configurations_count = loader_cJSON_GetArraySize(layer_configurations);
192192
if (layer_configurations_count == 0) {
193+
loader_settings->layer_configurations_active = true;
193194
return VK_SUCCESS;
194195
}
195196

@@ -214,6 +215,7 @@ VkResult parse_layer_configurations(const struct loader_instance* inst, cJSON* s
214215
goto out;
215216
}
216217
}
218+
loader_settings->layer_configurations_active = true;
217219
out:
218220
if (res != VK_SUCCESS) {
219221
if (loader_settings->layer_configurations) {
@@ -380,6 +382,7 @@ VkResult parse_device_configurations(const struct loader_instance* inst, cJSON*
380382

381383
uint32_t device_configuration_count = loader_cJSON_GetArraySize(device_configurations);
382384
if (device_configuration_count == 0) {
385+
loader_settings->device_configurations_active = true;
383386
return VK_SUCCESS;
384387
}
385388

@@ -407,6 +410,7 @@ VkResult parse_device_configurations(const struct loader_instance* inst, cJSON*
407410
}
408411
i++;
409412
}
413+
loader_settings->device_configurations_active = true;
410414
out:
411415
if (res != VK_SUCCESS) {
412416
if (loader_settings->device_configurations) {
@@ -582,8 +586,10 @@ bool check_if_settings_are_equal(loader_settings* a, loader_settings* b) {
582586
are_equal &= a->settings_active == b->settings_active;
583587
are_equal &= a->has_unordered_layer_location == b->has_unordered_layer_location;
584588
are_equal &= a->debug_level == b->debug_level;
589+
are_equal &= a->layer_configurations_active == b->layer_configurations_active;
585590
are_equal &= a->layer_configuration_count == b->layer_configuration_count;
586591
are_equal &= a->additional_driver_count == b->additional_driver_count;
592+
are_equal &= a->device_configurations_active == b->device_configurations_active;
587593
are_equal &= a->device_configuration_count == b->device_configuration_count;
588594
if (!are_equal) return false;
589595
for (uint32_t i = 0; i < a->layer_configuration_count && i < b->layer_configuration_count; i++) {
@@ -614,18 +620,19 @@ void log_settings(const struct loader_instance* inst, loader_settings* settings)
614620
if (strlen(cmd_line_msg)) {
615621
loader_log(inst, VULKAN_LOADER_DEBUG_BIT, 0, "Loader Settings Filters for Logging to Standard Error: %s", cmd_line_msg);
616622
}
617-
618-
loader_log(inst, VULKAN_LOADER_DEBUG_BIT, 0, "Layer Configurations count = %d", settings->layer_configuration_count);
619-
for (uint32_t i = 0; i < settings->layer_configuration_count; i++) {
620-
loader_log(inst, VULKAN_LOADER_DEBUG_BIT, 0, "---- Layer Configuration [%d] ----", i);
621-
if (settings->layer_configurations[i].control != LOADER_SETTINGS_LAYER_UNORDERED_LAYER_LOCATION) {
622-
loader_log(inst, VULKAN_LOADER_DEBUG_BIT, 0, "Name: %s", settings->layer_configurations[i].name);
623-
loader_log(inst, VULKAN_LOADER_DEBUG_BIT, 0, "Path: %s", settings->layer_configurations[i].path);
624-
loader_log(inst, VULKAN_LOADER_DEBUG_BIT, 0, "Layer Type: %s",
625-
settings->layer_configurations[i].treat_as_implicit_manifest ? "Implicit" : "Explicit");
623+
if (settings->layer_configurations_active) {
624+
loader_log(inst, VULKAN_LOADER_DEBUG_BIT, 0, "Layer Configurations count = %d", settings->layer_configuration_count);
625+
for (uint32_t i = 0; i < settings->layer_configuration_count; i++) {
626+
loader_log(inst, VULKAN_LOADER_DEBUG_BIT, 0, "---- Layer Configuration [%d] ----", i);
627+
if (settings->layer_configurations[i].control != LOADER_SETTINGS_LAYER_UNORDERED_LAYER_LOCATION) {
628+
loader_log(inst, VULKAN_LOADER_DEBUG_BIT, 0, "Name: %s", settings->layer_configurations[i].name);
629+
loader_log(inst, VULKAN_LOADER_DEBUG_BIT, 0, "Path: %s", settings->layer_configurations[i].path);
630+
loader_log(inst, VULKAN_LOADER_DEBUG_BIT, 0, "Layer Type: %s",
631+
settings->layer_configurations[i].treat_as_implicit_manifest ? "Implicit" : "Explicit");
632+
}
633+
loader_log(inst, VULKAN_LOADER_DEBUG_BIT, 0, "Control: %s",
634+
loader_settings_layer_control_to_string(settings->layer_configurations[i].control));
626635
}
627-
loader_log(inst, VULKAN_LOADER_DEBUG_BIT, 0, "Control: %s",
628-
loader_settings_layer_control_to_string(settings->layer_configurations[i].control));
629636
}
630637
if (settings->additional_driver_count > 0) {
631638
loader_log(inst, VULKAN_LOADER_DEBUG_BIT, 0, "----");
@@ -638,7 +645,7 @@ void log_settings(const struct loader_instance* inst, loader_settings* settings)
638645
loader_log(inst, VULKAN_LOADER_DEBUG_BIT, 0, "Path: %s", settings->additional_drivers[i].path);
639646
}
640647
}
641-
if (settings->device_configuration_count > 0) {
648+
if (settings->device_configurations_active) {
642649
loader_log(inst, VULKAN_LOADER_DEBUG_BIT, 0, "----");
643650
loader_log(inst, VULKAN_LOADER_DEBUG_BIT, 0, "Device Configurations count = %d", settings->device_configuration_count);
644651
for (uint32_t i = 0; i < settings->device_configuration_count; i++) {
@@ -844,8 +851,8 @@ VkResult get_loader_settings(const struct loader_instance* inst, loader_settings
844851

845852
// Only consider the settings active if there is at least one "setting" active.
846853
// Those are either logging, layers, additional_drivers, or device_configurations.
847-
if (loader_settings->debug_level != 0 || loader_settings->layer_configuration_count != 0 ||
848-
loader_settings->additional_driver_count != 0 || loader_settings->device_configuration_count != 0) {
854+
if (loader_settings->debug_level != 0 || loader_settings->layer_configurations_active ||
855+
loader_settings->additional_driver_count != 0 || loader_settings->device_configurations_active) {
849856
loader_settings->settings_file_path = settings_file_path;
850857
settings_file_path = NULL;
851858
loader_settings->settings_active = true;
@@ -925,7 +932,7 @@ TEST_FUNCTION_EXPORT VkResult get_settings_layers(const struct loader_instance*
925932

926933
const loader_settings* settings = get_current_settings_and_lock(inst);
927934

928-
if (NULL == settings || !settings->settings_active) {
935+
if (NULL == settings || !settings->settings_active || !settings->layer_configurations_active) {
929936
goto out;
930937
}
931938

@@ -1275,7 +1282,7 @@ bool loader_settings_should_use_driver_environment_variables(const struct loader
12751282
if (NULL == settings || !settings->settings_active) {
12761283
goto out;
12771284
}
1278-
if (settings->device_configuration_count > 0) {
1285+
if (settings->device_configurations_active) {
12791286
should_use = false;
12801287
}
12811288
out:

loader/settings.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,13 +79,15 @@ typedef struct loader_settings {
7979
bool has_unordered_layer_location;
8080
enum vulkan_loader_debug_flags debug_level;
8181

82+
bool layer_configurations_active;
8283
uint32_t layer_configuration_count;
8384
loader_settings_layer_configuration* layer_configurations;
8485

8586
bool additional_drivers_use_exclusively;
8687
uint32_t additional_driver_count;
8788
loader_settings_driver_configuration* additional_drivers;
8889

90+
bool device_configurations_active;
8991
uint32_t device_configuration_count;
9092
loader_settings_device_configuration* device_configurations;
9193

tests/loader_settings_tests.cpp

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -491,6 +491,7 @@ TEST(SettingsFile, ApplicationEnablesIgnored) {
491491
}
492492
}
493493

494+
// If the layer list is empty, we want no layers found or loaded
494495
TEST(SettingsFile, LayerListIsEmpty) {
495496
FrameworkEnvironment env{};
496497
env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2)).add_physical_device({});
@@ -511,15 +512,13 @@ TEST(SettingsFile, LayerListIsEmpty) {
511512
writer.EndObject();
512513
env.write_settings_file(writer.output, true);
513514

514-
auto layer_props = env.GetLayerProperties(1);
515-
ASSERT_TRUE(string_eq(layer_props.at(0).layerName, implicit_layer_name));
515+
ASSERT_NO_FATAL_FAILURE(env.GetLayerProperties(0));
516516

517517
InstWrapper inst{env.vulkan_functions};
518518
FillDebugUtilsCreateDetails(inst.create_info, env.debug_log);
519519
inst.CheckCreate();
520-
ASSERT_TRUE(env.debug_log.find(get_settings_not_in_use_log_message(env, true)));
521-
auto actice_layer_props = inst.GetActiveLayers(inst.GetPhysDev(), 1);
522-
ASSERT_TRUE(string_eq(actice_layer_props.at(0).layerName, implicit_layer_name));
520+
ASSERT_TRUE(env.debug_log.find(get_settings_location_log_message(env, true)));
521+
ASSERT_NO_FATAL_FAILURE(inst.GetActiveLayers(inst.GetPhysDev(), 0));
523522
}
524523

525524
// If a settings file exists but contains no valid settings - don't consider it
@@ -3663,3 +3662,22 @@ TEST(SettingsFile, DeviceConfigurationReordersExclusiveAdditionalDrivers) {
36633662

36643663
ASSERT_TRUE(0 == memcmp(vulkan_11_props.deviceUUID, uuids[2].data(), VK_UUID_SIZE * sizeof(uint8_t)));
36653664
}
3665+
TEST(SettingsFile, DeviceConfigurationPreservesLayerEnumeration) {
3666+
FrameworkEnvironment env{};
3667+
VulkanUUID uuid{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
3668+
3669+
const char* layer_name = "VK_LAYER_layer";
3670+
env.add_explicit_layer(
3671+
ManifestLayer{}.add_layer(
3672+
ManifestLayer::LayerDescription{}.set_name(layer_name).set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)),
3673+
"regular_test_layer.json");
3674+
3675+
env.loader_settings.set_file_format_version({1, 0, 0}).add_app_specific_setting(
3676+
AppSpecificSettings{}
3677+
.add_driver_configuration(LoaderSettingsDriverConfiguration{}.set_path("Shouldn't matter"))
3678+
.add_device_configuration(LoaderSettingsDeviceConfiguration{}.set_deviceUUID(uuid)));
3679+
env.update_loader_settings(env.loader_settings);
3680+
3681+
auto layer_props = env.GetLayerProperties(1);
3682+
EXPECT_TRUE(string_eq(layer_props.at(0).layerName, layer_name));
3683+
}

0 commit comments

Comments
 (0)