@@ -730,6 +730,123 @@ TEST(SettingsFile, MismatchedLayerNameAndManifestPath) {
730730 ASSERT_NO_FATAL_FAILURE (inst.GetActiveLayers (inst.GetPhysDev (), 0 ));
731731}
732732
733+ // Settings file should take precedence over the meta layer, if present
734+ TEST (SettingsFile, ImplicitLayerWithEnableEnvironment) {
735+ FrameworkEnvironment env{};
736+ env.add_icd (TestICDDetails (TEST_ICD_PATH_VERSION_2)).add_physical_device ({});
737+
738+ const char * explicit_layer_1 = " VK_LAYER_Regular_TestLayer" ;
739+ env.add_explicit_layer (
740+ ManifestLayer{}.add_layer (
741+ ManifestLayer::LayerDescription{}.set_name (explicit_layer_1).set_lib_path (TEST_LAYER_PATH_EXPORT_VERSION_2)),
742+ " explicit_test_layer1.json" );
743+
744+ const char * implicit_layer_1 = " VK_LAYER_RegularImplicit_TestLayer" ;
745+ env.add_implicit_layer (ManifestLayer{}.add_layer (ManifestLayer::LayerDescription{}
746+ .set_name (implicit_layer_1)
747+ .set_lib_path (TEST_LAYER_PATH_EXPORT_VERSION_2)
748+ .set_disable_environment (" AndISaidHey" )
749+ .set_enable_environment (" WhatsGoingOn" )),
750+ " implicit_layer1.json" );
751+
752+ const char * explicit_layer_2 = " VK_LAYER_Regular_TestLayer1" ;
753+ env.add_explicit_layer (TestLayerDetails (
754+ ManifestLayer{}.add_layer (
755+ ManifestLayer::LayerDescription{}.set_name (explicit_layer_2).set_lib_path (TEST_LAYER_PATH_EXPORT_VERSION_2)),
756+ " explicit_test_layer2.json" ));
757+
758+ const char * implicit_layer_2 = " VK_LAYER_RegularImplicit_TestLayer2" ;
759+ env.add_explicit_layer (TestLayerDetails (ManifestLayer{}.add_layer (ManifestLayer::LayerDescription{}
760+ .set_name (implicit_layer_2)
761+ .set_lib_path (TEST_LAYER_PATH_EXPORT_VERSION_2)
762+ .set_disable_environment (" HeyHeyHeyyaya" )
763+ .set_enable_environment (" HeyHeyHeyhey" )),
764+ " implicit_layer2.json" ));
765+ const char * explicit_layer_3 = " VK_LAYER_Regular_TestLayer3" ;
766+ env.add_explicit_layer (TestLayerDetails (
767+ ManifestLayer{}.add_layer (
768+ ManifestLayer::LayerDescription{}.set_name (explicit_layer_3).set_lib_path (TEST_LAYER_PATH_EXPORT_VERSION_2)),
769+ " explicit_test_layer3.json" ));
770+ env.update_loader_settings (env.loader_settings .set_file_format_version ({1 , 0 , 0 }).add_app_specific_setting (
771+ AppSpecificSettings{}
772+ .add_stderr_log_filter (" all" )
773+ .add_layer_configuration (LoaderSettingsLayerConfiguration{}
774+ .set_name (explicit_layer_1)
775+ .set_path (env.get_shimmed_layer_manifest_path (0 ))
776+ .set_control (" auto" )
777+ .set_treat_as_implicit_manifest (false ))
778+ .add_layer_configuration (LoaderSettingsLayerConfiguration{}.set_control (" unordered_layer_location" ))
779+ .add_layer_configuration (LoaderSettingsLayerConfiguration{}
780+ .set_name (implicit_layer_1)
781+ .set_path (env.get_shimmed_layer_manifest_path (1 ))
782+ .set_control (" auto" )
783+ .set_treat_as_implicit_manifest (true ))
784+ .add_layer_configuration (LoaderSettingsLayerConfiguration{}
785+ .set_name (explicit_layer_2)
786+ .set_path (env.get_shimmed_layer_manifest_path (2 ))
787+ .set_control (" auto" )
788+ .set_treat_as_implicit_manifest (false ))
789+ .add_layer_configuration (LoaderSettingsLayerConfiguration{}
790+ .set_name (implicit_layer_2)
791+ .set_path (env.get_shimmed_layer_manifest_path (3 ))
792+ .set_control (" auto" )
793+ .set_treat_as_implicit_manifest (true ))
794+ .add_layer_configuration (LoaderSettingsLayerConfiguration{}
795+ .set_name (explicit_layer_3)
796+ .set_path (env.get_shimmed_layer_manifest_path (4 ))
797+ .set_control (" on" )
798+ .set_treat_as_implicit_manifest (false ))));
799+ {
800+ auto layer_props = env.GetLayerProperties (5 );
801+ ASSERT_TRUE (string_eq (layer_props.at (0 ).layerName , explicit_layer_1));
802+ ASSERT_TRUE (string_eq (layer_props.at (1 ).layerName , implicit_layer_1));
803+ ASSERT_TRUE (string_eq (layer_props.at (2 ).layerName , explicit_layer_2));
804+ ASSERT_TRUE (string_eq (layer_props.at (3 ).layerName , implicit_layer_2));
805+ ASSERT_TRUE (string_eq (layer_props.at (4 ).layerName , explicit_layer_3));
806+
807+ InstWrapper inst{env.vulkan_functions };
808+ FillDebugUtilsCreateDetails (inst.create_info , env.debug_log );
809+ inst.CheckCreate ();
810+ ASSERT_TRUE (env.debug_log .find (get_settings_location_log_message (env)));
811+ auto layers = inst.GetActiveLayers (inst.GetPhysDev (), 1 );
812+ ASSERT_TRUE (string_eq (layers.at (0 ).layerName , explicit_layer_3));
813+ }
814+ {
815+ EnvVarWrapper enable_meta_layer{" WhatsGoingOn" , " 1" };
816+ auto layer_props = env.GetLayerProperties (5 );
817+ ASSERT_TRUE (string_eq (layer_props.at (0 ).layerName , explicit_layer_1));
818+ ASSERT_TRUE (string_eq (layer_props.at (1 ).layerName , implicit_layer_1));
819+ ASSERT_TRUE (string_eq (layer_props.at (2 ).layerName , explicit_layer_2));
820+ ASSERT_TRUE (string_eq (layer_props.at (3 ).layerName , implicit_layer_2));
821+ ASSERT_TRUE (string_eq (layer_props.at (4 ).layerName , explicit_layer_3));
822+
823+ InstWrapper inst{env.vulkan_functions };
824+ FillDebugUtilsCreateDetails (inst.create_info , env.debug_log );
825+ inst.CheckCreate ();
826+ ASSERT_TRUE (env.debug_log .find (get_settings_location_log_message (env)));
827+ auto layers = inst.GetActiveLayers (inst.GetPhysDev (), 2 );
828+ ASSERT_TRUE (string_eq (layers.at (0 ).layerName , implicit_layer_1));
829+ ASSERT_TRUE (string_eq (layers.at (1 ).layerName , explicit_layer_3));
830+ }
831+ {
832+ EnvVarWrapper enable_meta_layer{" HeyHeyHeyhey" , " 1" };
833+ auto layer_props = env.GetLayerProperties (5 );
834+ ASSERT_TRUE (string_eq (layer_props.at (0 ).layerName , explicit_layer_1));
835+ ASSERT_TRUE (string_eq (layer_props.at (1 ).layerName , implicit_layer_1));
836+ ASSERT_TRUE (string_eq (layer_props.at (2 ).layerName , explicit_layer_2));
837+ ASSERT_TRUE (string_eq (layer_props.at (3 ).layerName , implicit_layer_2));
838+ ASSERT_TRUE (string_eq (layer_props.at (4 ).layerName , explicit_layer_3));
839+
840+ InstWrapper inst{env.vulkan_functions };
841+ FillDebugUtilsCreateDetails (inst.create_info , env.debug_log );
842+ inst.CheckCreate ();
843+ ASSERT_TRUE (env.debug_log .find (get_settings_location_log_message (env)));
844+ auto layers = inst.GetActiveLayers (inst.GetPhysDev (), 2 );
845+ ASSERT_TRUE (string_eq (layers.at (0 ).layerName , implicit_layer_2));
846+ ASSERT_TRUE (string_eq (layers.at (1 ).layerName , explicit_layer_3));
847+ }
848+ }
849+
733850// Settings file should take precedence over the meta layer, if present
734851TEST (SettingsFile, MetaLayerAlsoActivates) {
735852 FrameworkEnvironment env{};
0 commit comments