@@ -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