15db71995Sopenharmony_ci/* 25db71995Sopenharmony_ci * Copyright (c) 2021-2023 The Khronos Group Inc. 35db71995Sopenharmony_ci * Copyright (c) 2021-2023 Valve Corporation 45db71995Sopenharmony_ci * Copyright (c) 2021-2023 LunarG, Inc. 55db71995Sopenharmony_ci * 65db71995Sopenharmony_ci * Permission is hereby granted, free of charge, to any person obtaining a copy 75db71995Sopenharmony_ci * of this software and/or associated documentation files (the "Materials"), to 85db71995Sopenharmony_ci * deal in the Materials without restriction, including without limitation the 95db71995Sopenharmony_ci * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 105db71995Sopenharmony_ci * sell copies of the Materials, and to permit persons to whom the Materials are 115db71995Sopenharmony_ci * furnished to do so, subject to the following conditions: 125db71995Sopenharmony_ci * 135db71995Sopenharmony_ci * The above copyright notice(s) and this permission notice shall be included in 145db71995Sopenharmony_ci * all copies or substantial portions of the Materials. 155db71995Sopenharmony_ci * 165db71995Sopenharmony_ci * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 175db71995Sopenharmony_ci * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 185db71995Sopenharmony_ci * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 195db71995Sopenharmony_ci * 205db71995Sopenharmony_ci * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, 215db71995Sopenharmony_ci * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 225db71995Sopenharmony_ci * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE 235db71995Sopenharmony_ci * USE OR OTHER DEALINGS IN THE MATERIALS. 245db71995Sopenharmony_ci * 255db71995Sopenharmony_ci * Author: Charles Giessen <charles@lunarg.com> 265db71995Sopenharmony_ci */ 275db71995Sopenharmony_ci 285db71995Sopenharmony_ci#include "test_environment.h" 295db71995Sopenharmony_ci 305db71995Sopenharmony_civoid CheckLogForLayerString(FrameworkEnvironment& env, const char* implicit_layer_name, bool check_for_enable) { 315db71995Sopenharmony_ci { 325db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 335db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst.create_info, env.debug_log); 345db71995Sopenharmony_ci inst.CheckCreate(VK_SUCCESS); 355db71995Sopenharmony_ci if (check_for_enable) { 365db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find(std::string("Insert instance layer \"") + implicit_layer_name)); 375db71995Sopenharmony_ci } else { 385db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find(std::string("Insert instance layer \"") + implicit_layer_name)); 395db71995Sopenharmony_ci } 405db71995Sopenharmony_ci } 415db71995Sopenharmony_ci env.debug_log.clear(); 425db71995Sopenharmony_ci} 435db71995Sopenharmony_ci 445db71995Sopenharmony_ciconst char* lunarg_meta_layer_name = "VK_LAYER_LUNARG_override"; 455db71995Sopenharmony_ci 465db71995Sopenharmony_ciTEST(ImplicitLayers, WithEnableAndDisableEnvVar) { 475db71995Sopenharmony_ci FrameworkEnvironment env; 485db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA)); 495db71995Sopenharmony_ci const char* implicit_layer_name = "VK_LAYER_ImplicitTestLayer"; 505db71995Sopenharmony_ci 515db71995Sopenharmony_ci EnvVarWrapper enable_env_var{"ENABLE_ME"}; 525db71995Sopenharmony_ci EnvVarWrapper disable_env_var{"DISABLE_ME"}; 535db71995Sopenharmony_ci 545db71995Sopenharmony_ci env.add_implicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} 555db71995Sopenharmony_ci .set_name(implicit_layer_name) 565db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) 575db71995Sopenharmony_ci .set_disable_environment(disable_env_var.get()) 585db71995Sopenharmony_ci .set_enable_environment(enable_env_var.get())), 595db71995Sopenharmony_ci "implicit_test_layer.json"); 605db71995Sopenharmony_ci 615db71995Sopenharmony_ci auto layers = env.GetLayerProperties(1); 625db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layers[0].layerName, implicit_layer_name)); 635db71995Sopenharmony_ci 645db71995Sopenharmony_ci // didn't set enable env-var, layer should not load 655db71995Sopenharmony_ci CheckLogForLayerString(env, implicit_layer_name, false); 665db71995Sopenharmony_ci 675db71995Sopenharmony_ci // set enable env-var to 0, no layer should be found 685db71995Sopenharmony_ci enable_env_var.set_new_value("0"); 695db71995Sopenharmony_ci CheckLogForLayerString(env, implicit_layer_name, false); 705db71995Sopenharmony_ci 715db71995Sopenharmony_ci // set enable env-var, layer should load 725db71995Sopenharmony_ci enable_env_var.set_new_value("1"); 735db71995Sopenharmony_ci CheckLogForLayerString(env, implicit_layer_name, true); 745db71995Sopenharmony_ci 755db71995Sopenharmony_ci // remove enable env var, so we can check what happens when only disable is present 765db71995Sopenharmony_ci enable_env_var.remove_value(); 775db71995Sopenharmony_ci 785db71995Sopenharmony_ci // set disable env-var to 0, layer should not load 795db71995Sopenharmony_ci disable_env_var.set_new_value("0"); 805db71995Sopenharmony_ci CheckLogForLayerString(env, implicit_layer_name, false); 815db71995Sopenharmony_ci 825db71995Sopenharmony_ci // set disable env-var to 1, layer should not load 835db71995Sopenharmony_ci disable_env_var.set_new_value("1"); 845db71995Sopenharmony_ci CheckLogForLayerString(env, implicit_layer_name, false); 855db71995Sopenharmony_ci 865db71995Sopenharmony_ci // set both enable and disable env-var, layer should not load 875db71995Sopenharmony_ci enable_env_var.set_new_value("1"); 885db71995Sopenharmony_ci disable_env_var.set_new_value("1"); 895db71995Sopenharmony_ci CheckLogForLayerString(env, implicit_layer_name, false); 905db71995Sopenharmony_ci} 915db71995Sopenharmony_ci 925db71995Sopenharmony_ciTEST(ImplicitLayers, OnlyDisableEnvVar) { 935db71995Sopenharmony_ci FrameworkEnvironment env; 945db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA)); 955db71995Sopenharmony_ci const char* implicit_layer_name = "VK_LAYER_ImplicitTestLayer"; 965db71995Sopenharmony_ci EnvVarWrapper disable_env_var{"DISABLE_ME"}; 975db71995Sopenharmony_ci 985db71995Sopenharmony_ci env.add_implicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} 995db71995Sopenharmony_ci .set_name(implicit_layer_name) 1005db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) 1015db71995Sopenharmony_ci .set_disable_environment(disable_env_var.get())), 1025db71995Sopenharmony_ci "implicit_test_layer.json"); 1035db71995Sopenharmony_ci 1045db71995Sopenharmony_ci auto layers = env.GetLayerProperties(1); 1055db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layers[0].layerName, implicit_layer_name)); 1065db71995Sopenharmony_ci 1075db71995Sopenharmony_ci // don't set disable env-var, layer should load 1085db71995Sopenharmony_ci CheckLogForLayerString(env, implicit_layer_name, true); 1095db71995Sopenharmony_ci 1105db71995Sopenharmony_ci // set disable env-var to 0, layer should load 1115db71995Sopenharmony_ci disable_env_var.set_new_value("0"); 1125db71995Sopenharmony_ci CheckLogForLayerString(env, implicit_layer_name, false); 1135db71995Sopenharmony_ci 1145db71995Sopenharmony_ci // set disable env-var to 1, layer should not load 1155db71995Sopenharmony_ci disable_env_var.set_new_value("1"); 1165db71995Sopenharmony_ci CheckLogForLayerString(env, implicit_layer_name, false); 1175db71995Sopenharmony_ci 1185db71995Sopenharmony_ci { 1195db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 1205db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst.create_info, env.debug_log); 1215db71995Sopenharmony_ci inst.create_info.add_layer(implicit_layer_name); 1225db71995Sopenharmony_ci inst.CheckCreate(VK_SUCCESS); 1235db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find(std::string("Insert instance layer \"") + implicit_layer_name)); 1245db71995Sopenharmony_ci } 1255db71995Sopenharmony_ci} 1265db71995Sopenharmony_ci 1275db71995Sopenharmony_ciTEST(ImplicitLayers, PreInstanceEnumInstLayerProps) { 1285db71995Sopenharmony_ci FrameworkEnvironment env; 1295db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA)); 1305db71995Sopenharmony_ci const char* implicit_layer_name = "VK_LAYER_ImplicitTestLayer"; 1315db71995Sopenharmony_ci EnvVarWrapper disable_env_var{"DISABLE_ME"}; 1325db71995Sopenharmony_ci 1335db71995Sopenharmony_ci env.add_implicit_layer( 1345db71995Sopenharmony_ci ManifestLayer{}.set_file_format_version({1, 1, 2}).add_layer( 1355db71995Sopenharmony_ci ManifestLayer::LayerDescription{} 1365db71995Sopenharmony_ci .set_name(implicit_layer_name) 1375db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) 1385db71995Sopenharmony_ci .set_disable_environment(disable_env_var.get()) 1395db71995Sopenharmony_ci .add_pre_instance_function(ManifestLayer::LayerDescription::FunctionOverride{} 1405db71995Sopenharmony_ci .set_vk_func("vkEnumerateInstanceLayerProperties") 1415db71995Sopenharmony_ci .set_override_name("test_preinst_vkEnumerateInstanceLayerProperties"))), 1425db71995Sopenharmony_ci "implicit_test_layer.json"); 1435db71995Sopenharmony_ci 1445db71995Sopenharmony_ci uint32_t layer_props = 43; 1455db71995Sopenharmony_ci auto& layer = env.get_test_layer(0); 1465db71995Sopenharmony_ci layer.set_reported_layer_props(layer_props); 1475db71995Sopenharmony_ci 1485db71995Sopenharmony_ci uint32_t count = 0; 1495db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, env.vulkan_functions.vkEnumerateInstanceLayerProperties(&count, nullptr)); 1505db71995Sopenharmony_ci ASSERT_EQ(count, layer_props); 1515db71995Sopenharmony_ci 1525db71995Sopenharmony_ci // set disable env-var to 1, layer should not load 1535db71995Sopenharmony_ci disable_env_var.set_new_value("1"); 1545db71995Sopenharmony_ci 1555db71995Sopenharmony_ci count = 0; 1565db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, env.vulkan_functions.vkEnumerateInstanceLayerProperties(&count, nullptr)); 1575db71995Sopenharmony_ci ASSERT_NE(count, 0U); 1585db71995Sopenharmony_ci ASSERT_NE(count, layer_props); 1595db71995Sopenharmony_ci} 1605db71995Sopenharmony_ci 1615db71995Sopenharmony_ciTEST(ImplicitLayers, PreInstanceEnumInstExtProps) { 1625db71995Sopenharmony_ci FrameworkEnvironment env; 1635db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA)); 1645db71995Sopenharmony_ci const char* implicit_layer_name = "VK_LAYER_ImplicitTestLayer"; 1655db71995Sopenharmony_ci EnvVarWrapper disable_env_var{"DISABLE_ME"}; 1665db71995Sopenharmony_ci 1675db71995Sopenharmony_ci env.add_implicit_layer( 1685db71995Sopenharmony_ci ManifestLayer{}.set_file_format_version({1, 1, 2}).add_layer( 1695db71995Sopenharmony_ci ManifestLayer::LayerDescription{} 1705db71995Sopenharmony_ci .set_name(implicit_layer_name) 1715db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) 1725db71995Sopenharmony_ci .set_disable_environment(disable_env_var.get()) 1735db71995Sopenharmony_ci .add_pre_instance_function(ManifestLayer::LayerDescription::FunctionOverride{} 1745db71995Sopenharmony_ci .set_vk_func("vkEnumerateInstanceExtensionProperties") 1755db71995Sopenharmony_ci .set_override_name("test_preinst_vkEnumerateInstanceExtensionProperties"))), 1765db71995Sopenharmony_ci "implicit_test_layer.json"); 1775db71995Sopenharmony_ci 1785db71995Sopenharmony_ci uint32_t ext_props = 52; 1795db71995Sopenharmony_ci auto& layer = env.get_test_layer(0); 1805db71995Sopenharmony_ci layer.set_reported_extension_props(ext_props); 1815db71995Sopenharmony_ci 1825db71995Sopenharmony_ci uint32_t count = 0; 1835db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, env.vulkan_functions.vkEnumerateInstanceExtensionProperties(nullptr, &count, nullptr)); 1845db71995Sopenharmony_ci ASSERT_EQ(count, ext_props); 1855db71995Sopenharmony_ci 1865db71995Sopenharmony_ci // set disable env-var to 1, layer should not load 1875db71995Sopenharmony_ci disable_env_var.set_new_value("1"); 1885db71995Sopenharmony_ci 1895db71995Sopenharmony_ci count = 0; 1905db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, env.vulkan_functions.vkEnumerateInstanceExtensionProperties(nullptr, &count, nullptr)); 1915db71995Sopenharmony_ci ASSERT_NE(count, 0U); 1925db71995Sopenharmony_ci ASSERT_NE(count, ext_props); 1935db71995Sopenharmony_ci} 1945db71995Sopenharmony_ci 1955db71995Sopenharmony_ciTEST(ImplicitLayers, PreInstanceVersion) { 1965db71995Sopenharmony_ci FrameworkEnvironment env; 1975db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA)) 1985db71995Sopenharmony_ci .add_physical_device({}) 1995db71995Sopenharmony_ci .set_icd_api_version(VK_MAKE_API_VERSION(0, 1, 2, 3)); 2005db71995Sopenharmony_ci 2015db71995Sopenharmony_ci const char* implicit_layer_name = "VK_LAYER_ImplicitTestLayer"; 2025db71995Sopenharmony_ci EnvVarWrapper disable_env_var{"DISABLE_ME"}; 2035db71995Sopenharmony_ci 2045db71995Sopenharmony_ci env.add_implicit_layer(ManifestLayer{}.set_file_format_version({1, 1, 2}).add_layer( 2055db71995Sopenharmony_ci ManifestLayer::LayerDescription{} 2065db71995Sopenharmony_ci .set_name(implicit_layer_name) 2075db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) 2085db71995Sopenharmony_ci .set_api_version(VK_MAKE_API_VERSION(0, 1, 2, 3)) 2095db71995Sopenharmony_ci .set_disable_environment(disable_env_var.get()) 2105db71995Sopenharmony_ci .add_pre_instance_function(ManifestLayer::LayerDescription::FunctionOverride{} 2115db71995Sopenharmony_ci .set_vk_func("vkEnumerateInstanceVersion") 2125db71995Sopenharmony_ci .set_override_name("test_preinst_vkEnumerateInstanceVersion"))), 2135db71995Sopenharmony_ci "implicit_test_layer.json"); 2145db71995Sopenharmony_ci 2155db71995Sopenharmony_ci uint32_t layer_version = VK_MAKE_API_VERSION(1, 2, 3, 4); 2165db71995Sopenharmony_ci auto& layer = env.get_test_layer(0); 2175db71995Sopenharmony_ci layer.set_reported_instance_version(layer_version); 2185db71995Sopenharmony_ci 2195db71995Sopenharmony_ci uint32_t version = 0; 2205db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, env.vulkan_functions.vkEnumerateInstanceVersion(&version)); 2215db71995Sopenharmony_ci ASSERT_EQ(version, layer_version); 2225db71995Sopenharmony_ci 2235db71995Sopenharmony_ci // set disable env-var to 1, layer should not load 2245db71995Sopenharmony_ci disable_env_var.set_new_value("1"); 2255db71995Sopenharmony_ci 2265db71995Sopenharmony_ci version = 0; 2275db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, env.vulkan_functions.vkEnumerateInstanceVersion(&version)); 2285db71995Sopenharmony_ci ASSERT_NE(version, 0U); 2295db71995Sopenharmony_ci ASSERT_NE(version, layer_version); 2305db71995Sopenharmony_ci} 2315db71995Sopenharmony_ci 2325db71995Sopenharmony_ci// Run with a pre-Negotiate function version of the layer so that it has to query vkCreateInstance using the 2335db71995Sopenharmony_ci// renamed vkGetInstanceProcAddr function which returns one that intentionally fails. Then disable the 2345db71995Sopenharmony_ci// layer and verify it works. The non-override version of vkCreateInstance in the layer also works (and is 2355db71995Sopenharmony_ci// tested through behavior above). 2365db71995Sopenharmony_ciTEST(ImplicitLayers, OverrideGetInstanceProcAddr) { 2375db71995Sopenharmony_ci FrameworkEnvironment env; 2385db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA)).add_physical_device({}); 2395db71995Sopenharmony_ci 2405db71995Sopenharmony_ci const char* implicit_layer_name = "VK_LAYER_ImplicitTestLayer"; 2415db71995Sopenharmony_ci EnvVarWrapper disable_env_var{"DISABLE_ME"}; 2425db71995Sopenharmony_ci 2435db71995Sopenharmony_ci env.add_implicit_layer(ManifestLayer{}.set_file_format_version({1, 0, 0}).add_layer( 2445db71995Sopenharmony_ci ManifestLayer::LayerDescription{} 2455db71995Sopenharmony_ci .set_name(implicit_layer_name) 2465db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_1) 2475db71995Sopenharmony_ci .set_disable_environment(disable_env_var.get()) 2485db71995Sopenharmony_ci .add_function(ManifestLayer::LayerDescription::FunctionOverride{} 2495db71995Sopenharmony_ci .set_vk_func("vkGetInstanceProcAddr") 2505db71995Sopenharmony_ci .set_override_name("test_override_vkGetInstanceProcAddr"))), 2515db71995Sopenharmony_ci "implicit_test_layer.json"); 2525db71995Sopenharmony_ci 2535db71995Sopenharmony_ci { 2545db71995Sopenharmony_ci InstWrapper inst1{env.vulkan_functions}; 2555db71995Sopenharmony_ci inst1.CheckCreate(VK_ERROR_INVALID_SHADER_NV); 2565db71995Sopenharmony_ci } 2575db71995Sopenharmony_ci 2585db71995Sopenharmony_ci { 2595db71995Sopenharmony_ci // set disable env-var to 1, layer should not load 2605db71995Sopenharmony_ci disable_env_var.set_new_value("1"); 2615db71995Sopenharmony_ci InstWrapper inst2{env.vulkan_functions}; 2625db71995Sopenharmony_ci inst2.CheckCreate(); 2635db71995Sopenharmony_ci } 2645db71995Sopenharmony_ci} 2655db71995Sopenharmony_ci 2665db71995Sopenharmony_ci// Force enable with filter env var 2675db71995Sopenharmony_ciTEST(ImplicitLayers, EnableWithFilter) { 2685db71995Sopenharmony_ci FrameworkEnvironment env; 2695db71995Sopenharmony_ci 2705db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA)) 2715db71995Sopenharmony_ci .add_physical_device({}) 2725db71995Sopenharmony_ci .set_icd_api_version(VK_API_VERSION_1_2); 2735db71995Sopenharmony_ci 2745db71995Sopenharmony_ci const char* implicit_layer_name_1 = "VK_LAYER_LUNARG_First_layer"; 2755db71995Sopenharmony_ci const char* implicit_json_name_1 = "First_layer.json"; 2765db71995Sopenharmony_ci const char* disable_layer_name_1 = "DISABLE_FIRST"; 2775db71995Sopenharmony_ci const char* enable_layer_name_1 = "ENABLE_FIRST"; 2785db71995Sopenharmony_ci env.add_implicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} 2795db71995Sopenharmony_ci .set_name(implicit_layer_name_1) 2805db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) 2815db71995Sopenharmony_ci .set_enable_environment(enable_layer_name_1) 2825db71995Sopenharmony_ci .set_disable_environment(disable_layer_name_1) 2835db71995Sopenharmony_ci .set_api_version(VK_MAKE_API_VERSION(0, 1, 0, 0))), 2845db71995Sopenharmony_ci implicit_json_name_1); 2855db71995Sopenharmony_ci 2865db71995Sopenharmony_ci const char* implicit_layer_name_2 = "VK_LAYER_LUNARG_Second_layer"; 2875db71995Sopenharmony_ci const char* implicit_json_name_2 = "Second_layer.json"; 2885db71995Sopenharmony_ci const char* disable_layer_name_2 = "DISABLE_SECOND"; 2895db71995Sopenharmony_ci const char* enable_layer_name_2 = "ENABLE_SECOND"; 2905db71995Sopenharmony_ci env.add_implicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} 2915db71995Sopenharmony_ci .set_name(implicit_layer_name_2) 2925db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) 2935db71995Sopenharmony_ci .set_enable_environment(enable_layer_name_2) 2945db71995Sopenharmony_ci .set_disable_environment(disable_layer_name_2) 2955db71995Sopenharmony_ci .set_api_version(VK_MAKE_API_VERSION(0, 1, 0, 0))), 2965db71995Sopenharmony_ci implicit_json_name_2); 2975db71995Sopenharmony_ci 2985db71995Sopenharmony_ci const char* implicit_layer_name_3 = "VK_LAYER_LUNARG_Second_test_layer"; 2995db71995Sopenharmony_ci const char* implicit_json_name_3 = "Second_test_layer.json"; 3005db71995Sopenharmony_ci const char* disable_layer_name_3 = "DISABLE_THIRD"; 3015db71995Sopenharmony_ci const char* enable_layer_name_3 = "ENABLE_THIRD"; 3025db71995Sopenharmony_ci env.add_implicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} 3035db71995Sopenharmony_ci .set_name(implicit_layer_name_3) 3045db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) 3055db71995Sopenharmony_ci .set_enable_environment(enable_layer_name_3) 3065db71995Sopenharmony_ci .set_disable_environment(disable_layer_name_3) 3075db71995Sopenharmony_ci .set_api_version(VK_MAKE_API_VERSION(0, 1, 0, 0))), 3085db71995Sopenharmony_ci implicit_json_name_3); 3095db71995Sopenharmony_ci 3105db71995Sopenharmony_ci EnvVarWrapper layers_enable_env_var{"VK_LOADER_LAYERS_ENABLE"}; 3115db71995Sopenharmony_ci EnvVarWrapper layer_1_enable_env_var{enable_layer_name_1}; 3125db71995Sopenharmony_ci 3135db71995Sopenharmony_ci // First, test an instance/device without the layer forced on. 3145db71995Sopenharmony_ci InstWrapper inst1{env.vulkan_functions}; 3155db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst1.create_info, env.debug_log); 3165db71995Sopenharmony_ci inst1.CheckCreate(); 3175db71995Sopenharmony_ci 3185db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", implicit_json_name_1)); 3195db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix("Insert instance layer", implicit_layer_name_1)); 3205db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_1, "forced enabled due to env var")); 3215db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_1, "disabled because name matches filter of env var")); 3225db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", implicit_json_name_2)); 3235db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix("Insert instance layer", implicit_layer_name_2)); 3245db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_2, "forced enabled due to env var")); 3255db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_2, "disabled because name matches filter of env var")); 3265db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", implicit_json_name_3)); 3275db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix("Insert instance layer", implicit_layer_name_3)); 3285db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_3, "forced enabled due to env var")); 3295db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_3, "disabled because name matches filter of env var")); 3305db71995Sopenharmony_ci 3315db71995Sopenharmony_ci // Now force on one layer with its full name 3325db71995Sopenharmony_ci // ------------------------------------------ 3335db71995Sopenharmony_ci env.debug_log.clear(); 3345db71995Sopenharmony_ci layers_enable_env_var.set_new_value(implicit_layer_name_1); 3355db71995Sopenharmony_ci 3365db71995Sopenharmony_ci InstWrapper inst2{env.vulkan_functions}; 3375db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst2.create_info, env.debug_log); 3385db71995Sopenharmony_ci inst2.CheckCreate(); 3395db71995Sopenharmony_ci 3405db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", implicit_json_name_1)); 3415db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Insert instance layer", implicit_layer_name_1)); 3425db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_1, "forced enabled due to env var")); 3435db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_1, "disabled because name matches filter of env var")); 3445db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", implicit_json_name_2)); 3455db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix("Insert instance layer", implicit_layer_name_2)); 3465db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_2, "forced enabled due to env var")); 3475db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_2, "disabled because name matches filter of env var")); 3485db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", implicit_json_name_3)); 3495db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix("Insert instance layer", implicit_layer_name_3)); 3505db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_3, "forced enabled due to env var")); 3515db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_3, "disabled because name matches filter of env var")); 3525db71995Sopenharmony_ci 3535db71995Sopenharmony_ci // Match prefix 3545db71995Sopenharmony_ci // ------------------------------------------ 3555db71995Sopenharmony_ci env.debug_log.clear(); 3565db71995Sopenharmony_ci layers_enable_env_var.set_new_value("VK_LAYER_LUNARG_*"); 3575db71995Sopenharmony_ci 3585db71995Sopenharmony_ci InstWrapper inst3{env.vulkan_functions}; 3595db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst3.create_info, env.debug_log); 3605db71995Sopenharmony_ci inst3.CheckCreate(); 3615db71995Sopenharmony_ci 3625db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", implicit_json_name_1)); 3635db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Insert instance layer", implicit_layer_name_1)); 3645db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_1, "forced enabled due to env var")); 3655db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_1, "disabled because name matches filter of env var")); 3665db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", implicit_json_name_2)); 3675db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Insert instance layer", implicit_layer_name_2)); 3685db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_2, "forced enabled due to env var")); 3695db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_2, "disabled because name matches filter of env var")); 3705db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", implicit_json_name_3)); 3715db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Insert instance layer", implicit_layer_name_3)); 3725db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_3, "forced enabled due to env var")); 3735db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_3, "disabled because name matches filter of env var")); 3745db71995Sopenharmony_ci 3755db71995Sopenharmony_ci // Match suffix 3765db71995Sopenharmony_ci // ------------------------------------------ 3775db71995Sopenharmony_ci env.debug_log.clear(); 3785db71995Sopenharmony_ci layers_enable_env_var.set_new_value("*Second_layer"); 3795db71995Sopenharmony_ci 3805db71995Sopenharmony_ci InstWrapper inst4{env.vulkan_functions}; 3815db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst4.create_info, env.debug_log); 3825db71995Sopenharmony_ci inst4.CheckCreate(); 3835db71995Sopenharmony_ci 3845db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", implicit_json_name_1)); 3855db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix("Insert instance layer", implicit_layer_name_1)); 3865db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_1, "forced enabled due to env var")); 3875db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_1, "disabled because name matches filter of env var")); 3885db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", implicit_json_name_2)); 3895db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Insert instance layer", implicit_layer_name_2)); 3905db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_2, "forced enabled due to env var")); 3915db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_2, "disabled because name matches filter of env var")); 3925db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", implicit_json_name_3)); 3935db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix("Insert instance layer", implicit_layer_name_3)); 3945db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_3, "forced enabled due to env var")); 3955db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_3, "disabled because name matches filter of env var")); 3965db71995Sopenharmony_ci 3975db71995Sopenharmony_ci // Match substring 3985db71995Sopenharmony_ci // ------------------------------------------ 3995db71995Sopenharmony_ci env.debug_log.clear(); 4005db71995Sopenharmony_ci layers_enable_env_var.set_new_value("*Second*"); 4015db71995Sopenharmony_ci 4025db71995Sopenharmony_ci InstWrapper inst5{env.vulkan_functions}; 4035db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst5.create_info, env.debug_log); 4045db71995Sopenharmony_ci inst5.CheckCreate(); 4055db71995Sopenharmony_ci 4065db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", implicit_json_name_1)); 4075db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix("Insert instance layer", implicit_layer_name_1)); 4085db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_1, "forced enabled due to env var")); 4095db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_1, "disabled because name matches filter of env var")); 4105db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", implicit_json_name_2)); 4115db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Insert instance layer", implicit_layer_name_2)); 4125db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_2, "forced enabled due to env var")); 4135db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_2, "disabled because name matches filter of env var")); 4145db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", implicit_json_name_3)); 4155db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Insert instance layer", implicit_layer_name_3)); 4165db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_3, "forced enabled due to env var")); 4175db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_3, "disabled because name matches filter of env var")); 4185db71995Sopenharmony_ci 4195db71995Sopenharmony_ci // Match all with star '*' 4205db71995Sopenharmony_ci // ------------------------------------------ 4215db71995Sopenharmony_ci env.debug_log.clear(); 4225db71995Sopenharmony_ci layers_enable_env_var.set_new_value("*"); 4235db71995Sopenharmony_ci 4245db71995Sopenharmony_ci InstWrapper inst6{env.vulkan_functions}; 4255db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst6.create_info, env.debug_log); 4265db71995Sopenharmony_ci inst6.CheckCreate(); 4275db71995Sopenharmony_ci 4285db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", implicit_json_name_1)); 4295db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Insert instance layer", implicit_layer_name_1)); 4305db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_1, "forced enabled due to env var")); 4315db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_1, "disabled because name matches filter of env var")); 4325db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", implicit_json_name_2)); 4335db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Insert instance layer", implicit_layer_name_2)); 4345db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_2, "forced enabled due to env var")); 4355db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_2, "disabled because name matches filter of env var")); 4365db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", implicit_json_name_3)); 4375db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Insert instance layer", implicit_layer_name_3)); 4385db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_3, "forced enabled due to env var")); 4395db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_3, "disabled because name matches filter of env var")); 4405db71995Sopenharmony_ci 4415db71995Sopenharmony_ci // Match all with special name 4425db71995Sopenharmony_ci // ------------------------------------------ 4435db71995Sopenharmony_ci env.debug_log.clear(); 4445db71995Sopenharmony_ci layers_enable_env_var.set_new_value("~all~"); 4455db71995Sopenharmony_ci 4465db71995Sopenharmony_ci InstWrapper inst7{env.vulkan_functions}; 4475db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst7.create_info, env.debug_log); 4485db71995Sopenharmony_ci inst7.CheckCreate(); 4495db71995Sopenharmony_ci 4505db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", implicit_json_name_1)); 4515db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Insert instance layer", implicit_layer_name_1)); 4525db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_1, "forced enabled due to env var")); 4535db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_1, "disabled because name matches filter of env var")); 4545db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", implicit_json_name_2)); 4555db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Insert instance layer", implicit_layer_name_2)); 4565db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_2, "forced enabled due to env var")); 4575db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_2, "disabled because name matches filter of env var")); 4585db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", implicit_json_name_3)); 4595db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Insert instance layer", implicit_layer_name_3)); 4605db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_3, "forced enabled due to env var")); 4615db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_3, "disabled because name matches filter of env var")); 4625db71995Sopenharmony_ci 4635db71995Sopenharmony_ci // Match substring, but enable the other layer manually 4645db71995Sopenharmony_ci // ------------------------------------------ 4655db71995Sopenharmony_ci env.debug_log.clear(); 4665db71995Sopenharmony_ci layer_1_enable_env_var.set_new_value("1"); 4675db71995Sopenharmony_ci layers_enable_env_var.set_new_value("*Second*"); 4685db71995Sopenharmony_ci 4695db71995Sopenharmony_ci InstWrapper inst8{env.vulkan_functions}; 4705db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst8.create_info, env.debug_log); 4715db71995Sopenharmony_ci inst8.CheckCreate(); 4725db71995Sopenharmony_ci 4735db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", implicit_json_name_1)); 4745db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Insert instance layer", implicit_layer_name_1)); 4755db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_1, "forced enabled due to env var")); 4765db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_1, "disabled because name matches filter of env var")); 4775db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", implicit_json_name_2)); 4785db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Insert instance layer", implicit_layer_name_2)); 4795db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_2, "forced enabled due to env var")); 4805db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_2, "disabled because name matches filter of env var")); 4815db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", implicit_json_name_3)); 4825db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Insert instance layer", implicit_layer_name_3)); 4835db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_3, "forced enabled due to env var")); 4845db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_3, "disabled because name matches filter of env var")); 4855db71995Sopenharmony_ci} 4865db71995Sopenharmony_ci 4875db71995Sopenharmony_ci// Force disabled with new filter env var 4885db71995Sopenharmony_ciTEST(ImplicitLayers, DisableWithFilter) { 4895db71995Sopenharmony_ci FrameworkEnvironment env; 4905db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA, VK_API_VERSION_1_2)) 4915db71995Sopenharmony_ci .set_icd_api_version(VK_API_VERSION_1_2); 4925db71995Sopenharmony_ci 4935db71995Sopenharmony_ci const char* implicit_layer_name_1 = "VK_LAYER_LUNARG_First_layer"; 4945db71995Sopenharmony_ci const char* implicit_json_name_1 = "First_layer.json"; 4955db71995Sopenharmony_ci const char* disable_layer_name_1 = "DISABLE_FIRST"; 4965db71995Sopenharmony_ci env.add_implicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} 4975db71995Sopenharmony_ci .set_name(implicit_layer_name_1) 4985db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) 4995db71995Sopenharmony_ci .set_disable_environment(disable_layer_name_1) 5005db71995Sopenharmony_ci .set_api_version(VK_MAKE_API_VERSION(0, 1, 0, 0))), 5015db71995Sopenharmony_ci implicit_json_name_1); 5025db71995Sopenharmony_ci 5035db71995Sopenharmony_ci const char* implicit_layer_name_2 = "VK_LAYER_LUNARG_Second_layer"; 5045db71995Sopenharmony_ci const char* implicit_json_name_2 = "Second_layer.json"; 5055db71995Sopenharmony_ci const char* disable_layer_name_2 = "DISABLE_SECOND"; 5065db71995Sopenharmony_ci env.add_implicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} 5075db71995Sopenharmony_ci .set_name(implicit_layer_name_2) 5085db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) 5095db71995Sopenharmony_ci .set_disable_environment(disable_layer_name_2) 5105db71995Sopenharmony_ci .set_api_version(VK_MAKE_API_VERSION(0, 1, 0, 0))), 5115db71995Sopenharmony_ci implicit_json_name_2); 5125db71995Sopenharmony_ci 5135db71995Sopenharmony_ci const char* implicit_layer_name_3 = "VK_LAYER_LUNARG_Second_test_layer"; 5145db71995Sopenharmony_ci const char* implicit_json_name_3 = "Second_test_layer.json"; 5155db71995Sopenharmony_ci const char* disable_layer_name_3 = "DISABLE_THIRD"; 5165db71995Sopenharmony_ci env.add_implicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} 5175db71995Sopenharmony_ci .set_name(implicit_layer_name_3) 5185db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) 5195db71995Sopenharmony_ci .set_disable_environment(disable_layer_name_3) 5205db71995Sopenharmony_ci .set_api_version(VK_MAKE_API_VERSION(0, 1, 0, 0))), 5215db71995Sopenharmony_ci implicit_json_name_3); 5225db71995Sopenharmony_ci 5235db71995Sopenharmony_ci EnvVarWrapper layers_disable_env_var{"VK_LOADER_LAYERS_DISABLE"}; 5245db71995Sopenharmony_ci 5255db71995Sopenharmony_ci // First, test an instance/device 5265db71995Sopenharmony_ci InstWrapper inst1{env.vulkan_functions}; 5275db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst1.create_info, env.debug_log); 5285db71995Sopenharmony_ci inst1.CheckCreate(); 5295db71995Sopenharmony_ci 5305db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", implicit_json_name_1)); 5315db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Insert instance layer", implicit_layer_name_1)); 5325db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_1, "forced enabled due to env var")); 5335db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_1, "disabled because name matches filter of env var")); 5345db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", implicit_json_name_2)); 5355db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Insert instance layer", implicit_layer_name_2)); 5365db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_2, "forced enabled due to env var")); 5375db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_2, "disabled because name matches filter of env var")); 5385db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", implicit_json_name_3)); 5395db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Insert instance layer", implicit_layer_name_3)); 5405db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_3, "forced enabled due to env var")); 5415db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_3, "disabled because name matches filter of env var")); 5425db71995Sopenharmony_ci 5435db71995Sopenharmony_ci // Now force off one layer with its full name 5445db71995Sopenharmony_ci // ------------------------------------------ 5455db71995Sopenharmony_ci env.debug_log.clear(); 5465db71995Sopenharmony_ci layers_disable_env_var.set_new_value(implicit_layer_name_1); 5475db71995Sopenharmony_ci 5485db71995Sopenharmony_ci InstWrapper inst2{env.vulkan_functions}; 5495db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst2.create_info, env.debug_log); 5505db71995Sopenharmony_ci inst2.CheckCreate(); 5515db71995Sopenharmony_ci 5525db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", implicit_json_name_1)); 5535db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix("Insert instance layer", implicit_layer_name_1)); 5545db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_1, "forced enabled due to env var")); 5555db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_1, "disabled because name matches filter of env var")); 5565db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", implicit_json_name_2)); 5575db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Insert instance layer", implicit_layer_name_2)); 5585db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_2, "forced enabled due to env var")); 5595db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_2, "disabled because name matches filter of env var")); 5605db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", implicit_json_name_3)); 5615db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Insert instance layer", implicit_layer_name_3)); 5625db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_3, "forced enabled due to env var")); 5635db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_3, "disabled because name matches filter of env var")); 5645db71995Sopenharmony_ci 5655db71995Sopenharmony_ci // Match prefix 5665db71995Sopenharmony_ci // ------------------------------------------ 5675db71995Sopenharmony_ci env.debug_log.clear(); 5685db71995Sopenharmony_ci layers_disable_env_var.set_new_value("VK_LAYER_LUNARG_*"); 5695db71995Sopenharmony_ci 5705db71995Sopenharmony_ci InstWrapper inst3{env.vulkan_functions}; 5715db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst3.create_info, env.debug_log); 5725db71995Sopenharmony_ci inst3.CheckCreate(); 5735db71995Sopenharmony_ci 5745db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", implicit_json_name_1)); 5755db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix("Insert instance layer", implicit_layer_name_1)); 5765db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_1, "forced enabled due to env var")); 5775db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_1, "disabled because name matches filter of env var")); 5785db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", implicit_json_name_2)); 5795db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix("Insert instance layer", implicit_layer_name_2)); 5805db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_2, "forced enabled due to env var")); 5815db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_2, "disabled because name matches filter of env var")); 5825db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", implicit_json_name_3)); 5835db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix("Insert instance layer", implicit_layer_name_3)); 5845db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_3, "forced enabled due to env var")); 5855db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_3, "disabled because name matches filter of env var")); 5865db71995Sopenharmony_ci 5875db71995Sopenharmony_ci // Match suffix 5885db71995Sopenharmony_ci // ------------------------------------------ 5895db71995Sopenharmony_ci env.debug_log.clear(); 5905db71995Sopenharmony_ci layers_disable_env_var.set_new_value("*Second_layer"); 5915db71995Sopenharmony_ci 5925db71995Sopenharmony_ci InstWrapper inst4{env.vulkan_functions}; 5935db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst4.create_info, env.debug_log); 5945db71995Sopenharmony_ci inst4.CheckCreate(); 5955db71995Sopenharmony_ci 5965db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", implicit_json_name_1)); 5975db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Insert instance layer", implicit_layer_name_1)); 5985db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_1, "forced enabled due to env var")); 5995db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_1, "disabled because name matches filter of env var")); 6005db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", implicit_json_name_2)); 6015db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix("Insert instance layer", implicit_layer_name_2)); 6025db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_2, "forced enabled due to env var")); 6035db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_2, "disabled because name matches filter of env var")); 6045db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", implicit_json_name_3)); 6055db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Insert instance layer", implicit_layer_name_3)); 6065db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_3, "forced enabled due to env var")); 6075db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_3, "disabled because name matches filter of env var")); 6085db71995Sopenharmony_ci 6095db71995Sopenharmony_ci // Match substring 6105db71995Sopenharmony_ci // ------------------------------------------ 6115db71995Sopenharmony_ci env.debug_log.clear(); 6125db71995Sopenharmony_ci layers_disable_env_var.set_new_value("*Second*"); 6135db71995Sopenharmony_ci 6145db71995Sopenharmony_ci InstWrapper inst5{env.vulkan_functions}; 6155db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst5.create_info, env.debug_log); 6165db71995Sopenharmony_ci inst5.CheckCreate(); 6175db71995Sopenharmony_ci 6185db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", implicit_json_name_1)); 6195db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Insert instance layer", implicit_layer_name_1)); 6205db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_1, "forced enabled due to env var")); 6215db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_1, "disabled because name matches filter of env var")); 6225db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", implicit_json_name_2)); 6235db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix("Insert instance layer", implicit_layer_name_2)); 6245db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_2, "forced enabled due to env var")); 6255db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_2, "disabled because name matches filter of env var")); 6265db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", implicit_json_name_3)); 6275db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix("Insert instance layer", implicit_layer_name_3)); 6285db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_3, "forced enabled due to env var")); 6295db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_3, "disabled because name matches filter of env var")); 6305db71995Sopenharmony_ci 6315db71995Sopenharmony_ci // Match all with star '*' 6325db71995Sopenharmony_ci // ------------------------------------------ 6335db71995Sopenharmony_ci env.debug_log.clear(); 6345db71995Sopenharmony_ci layers_disable_env_var.set_new_value("*"); 6355db71995Sopenharmony_ci 6365db71995Sopenharmony_ci InstWrapper inst6{env.vulkan_functions}; 6375db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst6.create_info, env.debug_log); 6385db71995Sopenharmony_ci inst6.CheckCreate(); 6395db71995Sopenharmony_ci 6405db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", implicit_json_name_1)); 6415db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix("Insert instance layer", implicit_layer_name_1)); 6425db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_1, "forced enabled due to env var")); 6435db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_1, "disabled because name matches filter of env var")); 6445db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", implicit_json_name_2)); 6455db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix("Insert instance layer", implicit_layer_name_2)); 6465db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_2, "forced enabled due to env var")); 6475db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_2, "disabled because name matches filter of env var")); 6485db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", implicit_json_name_3)); 6495db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix("Insert instance layer", implicit_layer_name_3)); 6505db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_3, "forced enabled due to env var")); 6515db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_3, "disabled because name matches filter of env var")); 6525db71995Sopenharmony_ci 6535db71995Sopenharmony_ci // Match all with special name 6545db71995Sopenharmony_ci // ------------------------------------------ 6555db71995Sopenharmony_ci env.debug_log.clear(); 6565db71995Sopenharmony_ci layers_disable_env_var.set_new_value("~all~"); 6575db71995Sopenharmony_ci 6585db71995Sopenharmony_ci InstWrapper inst7{env.vulkan_functions}; 6595db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst7.create_info, env.debug_log); 6605db71995Sopenharmony_ci inst7.CheckCreate(); 6615db71995Sopenharmony_ci 6625db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", implicit_json_name_1)); 6635db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix("Insert instance layer", implicit_layer_name_1)); 6645db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_1, "forced enabled due to env var")); 6655db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_1, "disabled because name matches filter of env var")); 6665db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", implicit_json_name_2)); 6675db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix("Insert instance layer", implicit_layer_name_2)); 6685db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_2, "forced enabled due to env var")); 6695db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_2, "disabled because name matches filter of env var")); 6705db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", implicit_json_name_3)); 6715db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix("Insert instance layer", implicit_layer_name_3)); 6725db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_3, "forced enabled due to env var")); 6735db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_3, "disabled because name matches filter of env var")); 6745db71995Sopenharmony_ci} 6755db71995Sopenharmony_ci 6765db71995Sopenharmony_ci// Force disabled with new filter env var 6775db71995Sopenharmony_ciTEST(ImplicitLayers, DisableWithFilterWhenLayersEnableEnvVarIsActive) { 6785db71995Sopenharmony_ci FrameworkEnvironment env; 6795db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA, VK_API_VERSION_1_2)) 6805db71995Sopenharmony_ci .set_icd_api_version(VK_API_VERSION_1_2); 6815db71995Sopenharmony_ci 6825db71995Sopenharmony_ci const char* implicit_layer_name_1 = "VK_LAYER_LUNARG_First_layer"; 6835db71995Sopenharmony_ci const char* implicit_json_name_1 = "First_layer.json"; 6845db71995Sopenharmony_ci const char* disable_layer_name_1 = "DISABLE_FIRST"; 6855db71995Sopenharmony_ci const char* enable_layer_name_1 = "ENABLE_FIRST"; 6865db71995Sopenharmony_ci env.add_implicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} 6875db71995Sopenharmony_ci .set_name(implicit_layer_name_1) 6885db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) 6895db71995Sopenharmony_ci .set_disable_environment(disable_layer_name_1) 6905db71995Sopenharmony_ci .set_enable_environment(enable_layer_name_1) 6915db71995Sopenharmony_ci .set_api_version(VK_MAKE_API_VERSION(0, 1, 0, 0))), 6925db71995Sopenharmony_ci implicit_json_name_1); 6935db71995Sopenharmony_ci 6945db71995Sopenharmony_ci const char* implicit_layer_name_2 = "VK_LAYER_LUNARG_Second_layer"; 6955db71995Sopenharmony_ci const char* implicit_json_name_2 = "Second_layer.json"; 6965db71995Sopenharmony_ci const char* disable_layer_name_2 = "DISABLE_SECOND"; 6975db71995Sopenharmony_ci const char* enable_layer_name_2 = "ENABLE_SECOND"; 6985db71995Sopenharmony_ci env.add_implicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} 6995db71995Sopenharmony_ci .set_name(implicit_layer_name_2) 7005db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) 7015db71995Sopenharmony_ci .set_disable_environment(disable_layer_name_2) 7025db71995Sopenharmony_ci .set_enable_environment(enable_layer_name_2) 7035db71995Sopenharmony_ci .set_api_version(VK_MAKE_API_VERSION(0, 1, 0, 0))), 7045db71995Sopenharmony_ci implicit_json_name_2); 7055db71995Sopenharmony_ci 7065db71995Sopenharmony_ci EnvVarWrapper layers_disable_env_var{"VK_LOADER_LAYERS_DISABLE"}; 7075db71995Sopenharmony_ci EnvVarWrapper layer_1_enable_env_var{enable_layer_name_1}; 7085db71995Sopenharmony_ci EnvVarWrapper layer_2_enable_env_var{enable_layer_name_2}; 7095db71995Sopenharmony_ci 7105db71995Sopenharmony_ci // First, test an instance/device 7115db71995Sopenharmony_ci InstWrapper inst1{env.vulkan_functions}; 7125db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst1.create_info, env.debug_log); 7135db71995Sopenharmony_ci inst1.CheckCreate(); 7145db71995Sopenharmony_ci 7155db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", implicit_json_name_1)); 7165db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix("Insert instance layer", implicit_layer_name_1)); 7175db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_1, "forced enabled due to env var")); 7185db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_1, "disabled because name matches filter of env var")); 7195db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", implicit_json_name_2)); 7205db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix("Insert instance layer", implicit_layer_name_2)); 7215db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_2, "forced enabled due to env var")); 7225db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_2, "disabled because name matches filter of env var")); 7235db71995Sopenharmony_ci 7245db71995Sopenharmony_ci // Set the layers enable env-var 7255db71995Sopenharmony_ci // ------------------------------------------ 7265db71995Sopenharmony_ci env.debug_log.clear(); 7275db71995Sopenharmony_ci layer_1_enable_env_var.set_new_value("1"); 7285db71995Sopenharmony_ci layer_2_enable_env_var.set_new_value("1"); 7295db71995Sopenharmony_ci 7305db71995Sopenharmony_ci InstWrapper inst2{env.vulkan_functions}; 7315db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst2.create_info, env.debug_log); 7325db71995Sopenharmony_ci inst2.CheckCreate(); 7335db71995Sopenharmony_ci 7345db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", implicit_json_name_1)); 7355db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Insert instance layer", implicit_layer_name_1)); 7365db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_1, "forced enabled due to env var")); 7375db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_1, "disabled because name matches filter of env var")); 7385db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", implicit_json_name_2)); 7395db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Insert instance layer", implicit_layer_name_2)); 7405db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_2, "forced enabled due to env var")); 7415db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_2, "disabled because name matches filter of env var")); 7425db71995Sopenharmony_ci 7435db71995Sopenharmony_ci // Now force off one layer with its full name 7445db71995Sopenharmony_ci // ------------------------------------------ 7455db71995Sopenharmony_ci env.debug_log.clear(); 7465db71995Sopenharmony_ci layers_disable_env_var.set_new_value(implicit_layer_name_1); 7475db71995Sopenharmony_ci 7485db71995Sopenharmony_ci InstWrapper inst3{env.vulkan_functions}; 7495db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst3.create_info, env.debug_log); 7505db71995Sopenharmony_ci inst3.CheckCreate(); 7515db71995Sopenharmony_ci 7525db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", implicit_json_name_1)); 7535db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix("Insert instance layer", implicit_layer_name_1)); 7545db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_1, "forced enabled due to env var")); 7555db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_1, "disabled because name matches filter of env var")); 7565db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", implicit_json_name_2)); 7575db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Insert instance layer", implicit_layer_name_2)); 7585db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_2, "forced enabled due to env var")); 7595db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_2, "disabled because name matches filter of env var")); 7605db71995Sopenharmony_ci 7615db71995Sopenharmony_ci // Now force off both layers 7625db71995Sopenharmony_ci // ------------------------------------------ 7635db71995Sopenharmony_ci env.debug_log.clear(); 7645db71995Sopenharmony_ci layers_disable_env_var.set_new_value("~implicit~"); 7655db71995Sopenharmony_ci 7665db71995Sopenharmony_ci InstWrapper inst4{env.vulkan_functions}; 7675db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst4.create_info, env.debug_log); 7685db71995Sopenharmony_ci inst4.CheckCreate(); 7695db71995Sopenharmony_ci 7705db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", implicit_json_name_1)); 7715db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix("Insert instance layer", implicit_layer_name_1)); 7725db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_1, "forced enabled due to env var")); 7735db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_1, "disabled because name matches filter of env var")); 7745db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", implicit_json_name_2)); 7755db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix("Insert instance layer", implicit_layer_name_2)); 7765db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_2, "forced enabled due to env var")); 7775db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_2, "disabled because name matches filter of env var")); 7785db71995Sopenharmony_ci} 7795db71995Sopenharmony_ci 7805db71995Sopenharmony_ci// Test interaction between both the enable and disable filter environment variables. The enable should always 7815db71995Sopenharmony_ci// override the disable. 7825db71995Sopenharmony_ciTEST(ImplicitLayers, EnableAndDisableWithFilter) { 7835db71995Sopenharmony_ci FrameworkEnvironment env; 7845db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA, VK_API_VERSION_1_2)) 7855db71995Sopenharmony_ci .set_icd_api_version(VK_API_VERSION_1_2); 7865db71995Sopenharmony_ci 7875db71995Sopenharmony_ci const char* implicit_layer_name_1 = "VK_LAYER_LUNARG_First_layer"; 7885db71995Sopenharmony_ci const char* implicit_json_name_1 = "First_layer.json"; 7895db71995Sopenharmony_ci const char* disable_layer_name_1 = "DISABLE_FIRST"; 7905db71995Sopenharmony_ci env.add_implicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} 7915db71995Sopenharmony_ci .set_name(implicit_layer_name_1) 7925db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) 7935db71995Sopenharmony_ci .set_disable_environment(disable_layer_name_1) 7945db71995Sopenharmony_ci .set_api_version(VK_MAKE_API_VERSION(0, 1, 0, 0))), 7955db71995Sopenharmony_ci implicit_json_name_1); 7965db71995Sopenharmony_ci 7975db71995Sopenharmony_ci const char* implicit_layer_name_2 = "VK_LAYER_LUNARG_Second_layer"; 7985db71995Sopenharmony_ci const char* implicit_json_name_2 = "Second_layer.json"; 7995db71995Sopenharmony_ci const char* disable_layer_name_2 = "DISABLE_SECOND"; 8005db71995Sopenharmony_ci env.add_implicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} 8015db71995Sopenharmony_ci .set_name(implicit_layer_name_2) 8025db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) 8035db71995Sopenharmony_ci .set_disable_environment(disable_layer_name_2) 8045db71995Sopenharmony_ci .set_api_version(VK_MAKE_API_VERSION(0, 1, 0, 0))), 8055db71995Sopenharmony_ci implicit_json_name_2); 8065db71995Sopenharmony_ci 8075db71995Sopenharmony_ci const char* implicit_layer_name_3 = "VK_LAYER_LUNARG_Second_test_layer"; 8085db71995Sopenharmony_ci const char* implicit_json_name_3 = "Second_test_layer.json"; 8095db71995Sopenharmony_ci const char* disable_layer_name_3 = "DISABLE_THIRD"; 8105db71995Sopenharmony_ci env.add_implicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} 8115db71995Sopenharmony_ci .set_name(implicit_layer_name_3) 8125db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) 8135db71995Sopenharmony_ci .set_disable_environment(disable_layer_name_3) 8145db71995Sopenharmony_ci .set_api_version(VK_MAKE_API_VERSION(0, 1, 0, 0))), 8155db71995Sopenharmony_ci implicit_json_name_3); 8165db71995Sopenharmony_ci 8175db71995Sopenharmony_ci EnvVarWrapper layers_disable_env_var{"VK_LOADER_LAYERS_DISABLE"}; 8185db71995Sopenharmony_ci EnvVarWrapper layers_enable_env_var{"VK_LOADER_LAYERS_ENABLE"}; 8195db71995Sopenharmony_ci 8205db71995Sopenharmony_ci // Disable 2 but enable 1 8215db71995Sopenharmony_ci // ------------------------------------------ 8225db71995Sopenharmony_ci env.debug_log.clear(); 8235db71995Sopenharmony_ci layers_disable_env_var.set_new_value("*Second*"); 8245db71995Sopenharmony_ci layers_enable_env_var.set_new_value("*test_layer"); 8255db71995Sopenharmony_ci 8265db71995Sopenharmony_ci InstWrapper inst1{env.vulkan_functions}; 8275db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst1.create_info, env.debug_log); 8285db71995Sopenharmony_ci inst1.CheckCreate(); 8295db71995Sopenharmony_ci 8305db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", implicit_json_name_1)); 8315db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Insert instance layer", implicit_layer_name_1)); 8325db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_1, "forced enabled due to env var")); 8335db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_1, "disabled because name matches filter of env var")); 8345db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", implicit_json_name_2)); 8355db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix("Insert instance layer", implicit_layer_name_2)); 8365db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_2, "forced enabled due to env var")); 8375db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_2, "disabled because name matches filter of env var")); 8385db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", implicit_json_name_3)); 8395db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Insert instance layer", implicit_layer_name_3)); 8405db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_3, "forced enabled due to env var")); 8415db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_3, "disabled because name matches filter of env var")); 8425db71995Sopenharmony_ci 8435db71995Sopenharmony_ci // Disable all but enable 2 8445db71995Sopenharmony_ci // ------------------------------------------ 8455db71995Sopenharmony_ci env.debug_log.clear(); 8465db71995Sopenharmony_ci layers_disable_env_var.set_new_value("*"); 8475db71995Sopenharmony_ci layers_enable_env_var.set_new_value("*Second*"); 8485db71995Sopenharmony_ci 8495db71995Sopenharmony_ci InstWrapper inst2{env.vulkan_functions}; 8505db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst2.create_info, env.debug_log); 8515db71995Sopenharmony_ci inst2.CheckCreate(); 8525db71995Sopenharmony_ci 8535db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", implicit_json_name_1)); 8545db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix("Insert instance layer", implicit_layer_name_1)); 8555db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_1, "forced enabled due to env var")); 8565db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_1, "disabled because name matches filter of env var")); 8575db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", implicit_json_name_2)); 8585db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Insert instance layer", implicit_layer_name_2)); 8595db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_2, "forced enabled due to env var")); 8605db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_2, "disabled because name matches filter of env var")); 8615db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", implicit_json_name_3)); 8625db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Insert instance layer", implicit_layer_name_3)); 8635db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_3, "forced enabled due to env var")); 8645db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_3, "disabled because name matches filter of env var")); 8655db71995Sopenharmony_ci 8665db71995Sopenharmony_ci // Disable all but enable 2 8675db71995Sopenharmony_ci // ------------------------------------------ 8685db71995Sopenharmony_ci env.debug_log.clear(); 8695db71995Sopenharmony_ci layers_disable_env_var.set_new_value("~all~"); 8705db71995Sopenharmony_ci layers_enable_env_var.set_new_value("*Second*"); 8715db71995Sopenharmony_ci 8725db71995Sopenharmony_ci InstWrapper inst3{env.vulkan_functions}; 8735db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst3.create_info, env.debug_log); 8745db71995Sopenharmony_ci inst3.CheckCreate(); 8755db71995Sopenharmony_ci 8765db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", implicit_json_name_1)); 8775db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix("Insert instance layer", implicit_layer_name_1)); 8785db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_1, "forced enabled due to env var")); 8795db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_1, "disabled because name matches filter of env var")); 8805db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", implicit_json_name_2)); 8815db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Insert instance layer", implicit_layer_name_2)); 8825db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_2, "forced enabled due to env var")); 8835db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_2, "disabled because name matches filter of env var")); 8845db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", implicit_json_name_3)); 8855db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Insert instance layer", implicit_layer_name_3)); 8865db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_3, "forced enabled due to env var")); 8875db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_3, "disabled because name matches filter of env var")); 8885db71995Sopenharmony_ci 8895db71995Sopenharmony_ci // Disable implicit but enable 2 8905db71995Sopenharmony_ci // ------------------------------------------ 8915db71995Sopenharmony_ci env.debug_log.clear(); 8925db71995Sopenharmony_ci layers_disable_env_var.set_new_value("~implicit~"); 8935db71995Sopenharmony_ci layers_enable_env_var.set_new_value("*Second*"); 8945db71995Sopenharmony_ci 8955db71995Sopenharmony_ci InstWrapper inst4{env.vulkan_functions}; 8965db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst4.create_info, env.debug_log); 8975db71995Sopenharmony_ci inst4.CheckCreate(); 8985db71995Sopenharmony_ci 8995db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", implicit_json_name_1)); 9005db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix("Insert instance layer", implicit_layer_name_1)); 9015db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_1, "forced enabled due to env var")); 9025db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_1, "disabled because name matches filter of env var")); 9035db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", implicit_json_name_2)); 9045db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Insert instance layer", implicit_layer_name_2)); 9055db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_2, "forced enabled due to env var")); 9065db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_2, "disabled because name matches filter of env var")); 9075db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", implicit_json_name_3)); 9085db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Insert instance layer", implicit_layer_name_3)); 9095db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_3, "forced enabled due to env var")); 9105db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_3, "disabled because name matches filter of env var")); 9115db71995Sopenharmony_ci 9125db71995Sopenharmony_ci // Disable explicit but enable 2 (should still be everything) 9135db71995Sopenharmony_ci // ------------------------------------------ 9145db71995Sopenharmony_ci env.debug_log.clear(); 9155db71995Sopenharmony_ci layers_disable_env_var.set_new_value("~explicit~"); 9165db71995Sopenharmony_ci layers_enable_env_var.set_new_value("*Second*"); 9175db71995Sopenharmony_ci 9185db71995Sopenharmony_ci InstWrapper inst5{env.vulkan_functions}; 9195db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst5.create_info, env.debug_log); 9205db71995Sopenharmony_ci inst5.CheckCreate(); 9215db71995Sopenharmony_ci 9225db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", implicit_json_name_1)); 9235db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Insert instance layer", implicit_layer_name_1)); 9245db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_1, "forced enabled due to env var")); 9255db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_1, "disabled because name matches filter of env var")); 9265db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", implicit_json_name_2)); 9275db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Insert instance layer", implicit_layer_name_2)); 9285db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_2, "forced enabled due to env var")); 9295db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_2, "disabled because name matches filter of env var")); 9305db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", implicit_json_name_3)); 9315db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Insert instance layer", implicit_layer_name_3)); 9325db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_3, "forced enabled due to env var")); 9335db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_3, "disabled because name matches filter of env var")); 9345db71995Sopenharmony_ci 9355db71995Sopenharmony_ci // Disable implicit but enable all 9365db71995Sopenharmony_ci // ------------------------------------------ 9375db71995Sopenharmony_ci env.debug_log.clear(); 9385db71995Sopenharmony_ci layers_disable_env_var.set_new_value("~implicit~"); 9395db71995Sopenharmony_ci layers_enable_env_var.set_new_value("*"); 9405db71995Sopenharmony_ci 9415db71995Sopenharmony_ci InstWrapper inst6{env.vulkan_functions}; 9425db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst6.create_info, env.debug_log); 9435db71995Sopenharmony_ci inst6.CheckCreate(); 9445db71995Sopenharmony_ci 9455db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", implicit_json_name_1)); 9465db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Insert instance layer", implicit_layer_name_1)); 9475db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_1, "forced enabled due to env var")); 9485db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_1, "disabled because name matches filter of env var")); 9495db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", implicit_json_name_2)); 9505db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Insert instance layer", implicit_layer_name_2)); 9515db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_2, "forced enabled due to env var")); 9525db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_2, "disabled because name matches filter of env var")); 9535db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", implicit_json_name_3)); 9545db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Insert instance layer", implicit_layer_name_3)); 9555db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_3, "forced enabled due to env var")); 9565db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(implicit_layer_name_3, "disabled because name matches filter of env var")); 9575db71995Sopenharmony_ci} 9585db71995Sopenharmony_ci 9595db71995Sopenharmony_ci// Add 2 implicit layers with the same layer name and expect only one to be loaded. 9605db71995Sopenharmony_ci// Expect the second layer to be found first, because it'll be in a path that is searched first. 9615db71995Sopenharmony_ciTEST(ImplicitLayers, DuplicateLayers) { 9625db71995Sopenharmony_ci FrameworkEnvironment env; 9635db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA)).add_physical_device({}); 9645db71995Sopenharmony_ci 9655db71995Sopenharmony_ci // verify layer loads successfully when setting VK_LAYER_PATH to a full filepath 9665db71995Sopenharmony_ci const char* same_layer_name_1 = "VK_LAYER_RegularLayer1"; 9675db71995Sopenharmony_ci env.add_implicit_layer(TestLayerDetails(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} 9685db71995Sopenharmony_ci .set_name(same_layer_name_1) 9695db71995Sopenharmony_ci .set_description("actually_layer_1") 9705db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) 9715db71995Sopenharmony_ci .set_disable_environment("if_you_can")), 9725db71995Sopenharmony_ci "regular_layer_1.json")); 9735db71995Sopenharmony_ci auto& layer1 = env.get_test_layer(0); 9745db71995Sopenharmony_ci layer1.set_description("actually_layer_1"); 9755db71995Sopenharmony_ci layer1.set_make_spurious_log_in_create_instance("actually_layer_1"); 9765db71995Sopenharmony_ci 9775db71995Sopenharmony_ci env.add_implicit_layer(TestLayerDetails(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} 9785db71995Sopenharmony_ci .set_name(same_layer_name_1) 9795db71995Sopenharmony_ci .set_description("actually_layer_2") 9805db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) 9815db71995Sopenharmony_ci .set_disable_environment("if_you_can")), 9825db71995Sopenharmony_ci "regular_layer_1.json") 9835db71995Sopenharmony_ci // use override folder as just a folder and manually add it to the implicit layer search paths 9845db71995Sopenharmony_ci .set_discovery_type(ManifestDiscoveryType::override_folder)); 9855db71995Sopenharmony_ci auto& layer2 = env.get_test_layer(1); 9865db71995Sopenharmony_ci layer2.set_description("actually_layer_2"); 9875db71995Sopenharmony_ci layer2.set_make_spurious_log_in_create_instance("actually_layer_2"); 9885db71995Sopenharmony_ci#if defined(WIN32) 9895db71995Sopenharmony_ci env.platform_shim->add_manifest(ManifestCategory::implicit_layer, env.get_folder(ManifestLocation::override_layer).location()); 9905db71995Sopenharmony_ci#elif COMMON_UNIX_PLATFORMS 9915db71995Sopenharmony_ci env.platform_shim->redirect_path(fs::path(USER_LOCAL_SHARE_DIR "/vulkan/implicit_layer.d"), 9925db71995Sopenharmony_ci env.get_folder(ManifestLocation::override_layer).location()); 9935db71995Sopenharmony_ci#endif 9945db71995Sopenharmony_ci 9955db71995Sopenharmony_ci auto layer_props = env.GetLayerProperties(2); 9965db71995Sopenharmony_ci ASSERT_TRUE(string_eq(same_layer_name_1, layer_props[0].layerName)); 9975db71995Sopenharmony_ci ASSERT_TRUE(string_eq(same_layer_name_1, layer_props[1].layerName)); 9985db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layer1.description.c_str(), layer_props[0].description)); 9995db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layer2.description.c_str(), layer_props[1].description)); 10005db71995Sopenharmony_ci 10015db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 10025db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst.create_info, env.debug_log); 10035db71995Sopenharmony_ci inst.CheckCreate(); 10045db71995Sopenharmony_ci 10055db71995Sopenharmony_ci auto enabled_layer_props = inst.GetActiveLayers(inst.GetPhysDev(), 1); 10065db71995Sopenharmony_ci ASSERT_TRUE(string_eq(same_layer_name_1, enabled_layer_props.at(0).layerName)); 10075db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layer1.description.c_str(), enabled_layer_props.at(0).description)); 10085db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find("actually_layer_1")); 10095db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find("actually_layer_2")); 10105db71995Sopenharmony_ci} 10115db71995Sopenharmony_ci 10125db71995Sopenharmony_ci// Meta layer which contains component layers that do not exist. 10135db71995Sopenharmony_ciTEST(MetaLayers, InvalidComponentLayer) { 10145db71995Sopenharmony_ci FrameworkEnvironment env; 10155db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA)); 10165db71995Sopenharmony_ci const char* meta_layer_name = "VK_LAYER_MetaTestLayer"; 10175db71995Sopenharmony_ci const char* invalid_layer_name_1 = "VK_LAYER_InvalidLayer1"; 10185db71995Sopenharmony_ci const char* invalid_layer_name_2 = "VK_LAYER_InvalidLayer2"; 10195db71995Sopenharmony_ci env.add_implicit_layer(ManifestLayer{}.set_file_format_version({1, 1, 2}).add_layer( 10205db71995Sopenharmony_ci ManifestLayer::LayerDescription{} 10215db71995Sopenharmony_ci .set_name(meta_layer_name) 10225db71995Sopenharmony_ci .add_component_layers({invalid_layer_name_1, invalid_layer_name_2}) 10235db71995Sopenharmony_ci .set_disable_environment("NotGonnaWork") 10245db71995Sopenharmony_ci .add_instance_extension({"NeverGonnaGiveYouUp"}) 10255db71995Sopenharmony_ci .add_device_extension({"NeverGonnaLetYouDown"})), 10265db71995Sopenharmony_ci "meta_test_layer.json"); 10275db71995Sopenharmony_ci 10285db71995Sopenharmony_ci const char* regular_layer_name = "TestLayer"; 10295db71995Sopenharmony_ci env.add_explicit_layer( 10305db71995Sopenharmony_ci ManifestLayer{}.add_layer( 10315db71995Sopenharmony_ci ManifestLayer::LayerDescription{}.set_name(regular_layer_name).set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)), 10325db71995Sopenharmony_ci "regular_test_layer.json"); 10335db71995Sopenharmony_ci 10345db71995Sopenharmony_ci // should find 1, the 'regular' layer 10355db71995Sopenharmony_ci auto layer_props = env.GetLayerProperties(1); 10365db71995Sopenharmony_ci EXPECT_TRUE(string_eq(layer_props.at(0).layerName, regular_layer_name)); 10375db71995Sopenharmony_ci 10385db71995Sopenharmony_ci auto extensions = env.GetInstanceExtensions(4); 10395db71995Sopenharmony_ci EXPECT_TRUE(string_eq(extensions.at(0).extensionName, VK_EXT_DEBUG_REPORT_EXTENSION_NAME)); 10405db71995Sopenharmony_ci EXPECT_TRUE(string_eq(extensions.at(1).extensionName, VK_EXT_DEBUG_UTILS_EXTENSION_NAME)); 10415db71995Sopenharmony_ci EXPECT_TRUE(string_eq(extensions.at(2).extensionName, VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME)); 10425db71995Sopenharmony_ci EXPECT_TRUE(string_eq(extensions.at(3).extensionName, VK_LUNARG_DIRECT_DRIVER_LOADING_EXTENSION_NAME)); 10435db71995Sopenharmony_ci 10445db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 10455db71995Sopenharmony_ci inst.create_info.add_layer(meta_layer_name); 10465db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst.create_info, env.debug_log); 10475db71995Sopenharmony_ci inst.CheckCreate(VK_ERROR_LAYER_NOT_PRESENT); 10485db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find(std::string("verify_meta_layer_component_layers: Meta-layer ") + meta_layer_name + 10495db71995Sopenharmony_ci " can't find component layer " + invalid_layer_name_1 + " at index 0. Skipping this layer.")); 10505db71995Sopenharmony_ci} 10515db71995Sopenharmony_ci 10525db71995Sopenharmony_ci// Meta layer that is an explicit layer 10535db71995Sopenharmony_ciTEST(MetaLayers, ExplicitMetaLayer) { 10545db71995Sopenharmony_ci FrameworkEnvironment env; 10555db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA)).add_physical_device({}); 10565db71995Sopenharmony_ci const char* meta_layer_name = "VK_LAYER_MetaTestLayer"; 10575db71995Sopenharmony_ci const char* regular_layer_name = "VK_LAYER_TestLayer"; 10585db71995Sopenharmony_ci env.add_explicit_layer( 10595db71995Sopenharmony_ci ManifestLayer{}.set_file_format_version({1, 1, 2}).add_layer( 10605db71995Sopenharmony_ci ManifestLayer::LayerDescription{}.set_name(meta_layer_name).add_component_layers({regular_layer_name})), 10615db71995Sopenharmony_ci "meta_test_layer.json"); 10625db71995Sopenharmony_ci 10635db71995Sopenharmony_ci env.add_explicit_layer( 10645db71995Sopenharmony_ci ManifestLayer{}.add_layer( 10655db71995Sopenharmony_ci ManifestLayer::LayerDescription{}.set_name(regular_layer_name).set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)), 10665db71995Sopenharmony_ci "regular_test_layer.json"); 10675db71995Sopenharmony_ci 10685db71995Sopenharmony_ci { // global functions 10695db71995Sopenharmony_ci // should find 1, the 'regular' layer 10705db71995Sopenharmony_ci auto layer_props = env.GetLayerProperties(2); 10715db71995Sopenharmony_ci EXPECT_TRUE(check_permutation({regular_layer_name, meta_layer_name}, layer_props)); 10725db71995Sopenharmony_ci 10735db71995Sopenharmony_ci auto extensions = env.GetInstanceExtensions(4); 10745db71995Sopenharmony_ci EXPECT_TRUE(string_eq(extensions.at(0).extensionName, VK_EXT_DEBUG_REPORT_EXTENSION_NAME)); 10755db71995Sopenharmony_ci EXPECT_TRUE(string_eq(extensions.at(1).extensionName, VK_EXT_DEBUG_UTILS_EXTENSION_NAME)); 10765db71995Sopenharmony_ci EXPECT_TRUE(string_eq(extensions.at(2).extensionName, VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME)); 10775db71995Sopenharmony_ci EXPECT_TRUE(string_eq(extensions.at(3).extensionName, VK_LUNARG_DIRECT_DRIVER_LOADING_EXTENSION_NAME)); 10785db71995Sopenharmony_ci } 10795db71995Sopenharmony_ci { // don't enable the layer, shouldn't find any layers when calling vkEnumerateDeviceLayerProperties 10805db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 10815db71995Sopenharmony_ci inst.CheckCreate(VK_SUCCESS); 10825db71995Sopenharmony_ci ASSERT_NO_FATAL_FAILURE(inst.GetActiveLayers(inst.GetPhysDev(), 0)); 10835db71995Sopenharmony_ci } 10845db71995Sopenharmony_ci { 10855db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 10865db71995Sopenharmony_ci inst.create_info.add_layer(meta_layer_name); 10875db71995Sopenharmony_ci inst.CheckCreate(VK_SUCCESS); 10885db71995Sopenharmony_ci auto layer_props = inst.GetActiveLayers(inst.GetPhysDev(), 2); 10895db71995Sopenharmony_ci EXPECT_TRUE(check_permutation({regular_layer_name, meta_layer_name}, layer_props)); 10905db71995Sopenharmony_ci } 10915db71995Sopenharmony_ci} 10925db71995Sopenharmony_ci 10935db71995Sopenharmony_ci// Meta layer which adds itself in its list of component layers 10945db71995Sopenharmony_ciTEST(MetaLayers, MetaLayerNameInComponentLayers) { 10955db71995Sopenharmony_ci FrameworkEnvironment env; 10965db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA)); 10975db71995Sopenharmony_ci const char* meta_layer_name = "VK_LAYER_MetaTestLayer"; 10985db71995Sopenharmony_ci const char* regular_layer_name = "VK_LAYER_TestLayer"; 10995db71995Sopenharmony_ci env.add_implicit_layer(ManifestLayer{}.set_file_format_version({1, 1, 2}).add_layer( 11005db71995Sopenharmony_ci ManifestLayer::LayerDescription{} 11015db71995Sopenharmony_ci .set_name(meta_layer_name) 11025db71995Sopenharmony_ci .add_component_layers({meta_layer_name, regular_layer_name}) 11035db71995Sopenharmony_ci .set_disable_environment("NotGonnaWork") 11045db71995Sopenharmony_ci .add_instance_extension({"NeverGonnaGiveYouUp"}) 11055db71995Sopenharmony_ci .add_device_extension({"NeverGonnaLetYouDown"})), 11065db71995Sopenharmony_ci "meta_test_layer.json"); 11075db71995Sopenharmony_ci 11085db71995Sopenharmony_ci env.add_explicit_layer( 11095db71995Sopenharmony_ci ManifestLayer{}.add_layer( 11105db71995Sopenharmony_ci ManifestLayer::LayerDescription{}.set_name(regular_layer_name).set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)), 11115db71995Sopenharmony_ci "regular_test_layer.json"); 11125db71995Sopenharmony_ci 11135db71995Sopenharmony_ci // should find 1, the 'regular' layer 11145db71995Sopenharmony_ci auto layer_props = env.GetLayerProperties(1); 11155db71995Sopenharmony_ci EXPECT_TRUE(string_eq(layer_props.at(0).layerName, regular_layer_name)); 11165db71995Sopenharmony_ci 11175db71995Sopenharmony_ci auto extensions = env.GetInstanceExtensions(4); 11185db71995Sopenharmony_ci EXPECT_TRUE(string_eq(extensions.at(0).extensionName, VK_EXT_DEBUG_REPORT_EXTENSION_NAME)); 11195db71995Sopenharmony_ci EXPECT_TRUE(string_eq(extensions.at(1).extensionName, VK_EXT_DEBUG_UTILS_EXTENSION_NAME)); 11205db71995Sopenharmony_ci EXPECT_TRUE(string_eq(extensions.at(2).extensionName, VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME)); 11215db71995Sopenharmony_ci EXPECT_TRUE(string_eq(extensions.at(3).extensionName, VK_LUNARG_DIRECT_DRIVER_LOADING_EXTENSION_NAME)); 11225db71995Sopenharmony_ci 11235db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 11245db71995Sopenharmony_ci inst.create_info.add_layer(meta_layer_name); 11255db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst.create_info, env.debug_log); 11265db71995Sopenharmony_ci inst.CheckCreate(VK_ERROR_LAYER_NOT_PRESENT); 11275db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find(std::string("verify_meta_layer_component_layers: Meta-layer ") + meta_layer_name + 11285db71995Sopenharmony_ci " lists itself in its component layer " + "list at index 0. Skipping this layer.")); 11295db71995Sopenharmony_ci} 11305db71995Sopenharmony_ci 11315db71995Sopenharmony_ci// Meta layer which adds another meta layer as a component layer 11325db71995Sopenharmony_ciTEST(MetaLayers, MetaLayerWhichAddsMetaLayer) { 11335db71995Sopenharmony_ci FrameworkEnvironment env; 11345db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA)); 11355db71995Sopenharmony_ci const char* meta_layer_name = "VK_LAYER_MetaTestLayer"; 11365db71995Sopenharmony_ci const char* meta_meta_layer_name = "VK_LAYER_MetaMetaTestLayer"; 11375db71995Sopenharmony_ci const char* regular_layer_name = "VK_LAYER_TestLayer"; 11385db71995Sopenharmony_ci env.add_explicit_layer( 11395db71995Sopenharmony_ci ManifestLayer{}.add_layer( 11405db71995Sopenharmony_ci ManifestLayer::LayerDescription{}.set_name(regular_layer_name).set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)), 11415db71995Sopenharmony_ci "regular_test_layer.json"); 11425db71995Sopenharmony_ci env.add_explicit_layer( 11435db71995Sopenharmony_ci ManifestLayer{}.set_file_format_version({1, 1, 2}).add_layer( 11445db71995Sopenharmony_ci ManifestLayer::LayerDescription{}.set_name(meta_layer_name).add_component_layers({regular_layer_name})), 11455db71995Sopenharmony_ci "meta_test_layer.json"); 11465db71995Sopenharmony_ci env.add_explicit_layer(ManifestLayer{}.set_file_format_version({1, 1, 2}).add_layer( 11475db71995Sopenharmony_ci ManifestLayer::LayerDescription{} 11485db71995Sopenharmony_ci .set_name(meta_meta_layer_name) 11495db71995Sopenharmony_ci .add_component_layers({meta_layer_name, regular_layer_name})), 11505db71995Sopenharmony_ci "meta_meta_test_layer.json"); 11515db71995Sopenharmony_ci 11525db71995Sopenharmony_ci auto layer_props = env.GetLayerProperties(3); 11535db71995Sopenharmony_ci EXPECT_TRUE(check_permutation({regular_layer_name, meta_layer_name, meta_meta_layer_name}, layer_props)); 11545db71995Sopenharmony_ci 11555db71995Sopenharmony_ci auto extensions = env.GetInstanceExtensions(4); 11565db71995Sopenharmony_ci EXPECT_TRUE(string_eq(extensions.at(0).extensionName, VK_EXT_DEBUG_REPORT_EXTENSION_NAME)); 11575db71995Sopenharmony_ci EXPECT_TRUE(string_eq(extensions.at(1).extensionName, VK_EXT_DEBUG_UTILS_EXTENSION_NAME)); 11585db71995Sopenharmony_ci EXPECT_TRUE(string_eq(extensions.at(2).extensionName, VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME)); 11595db71995Sopenharmony_ci EXPECT_TRUE(string_eq(extensions.at(3).extensionName, VK_LUNARG_DIRECT_DRIVER_LOADING_EXTENSION_NAME)); 11605db71995Sopenharmony_ci 11615db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 11625db71995Sopenharmony_ci inst.create_info.add_layer(meta_layer_name); 11635db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst.create_info, env.debug_log); 11645db71995Sopenharmony_ci inst.CheckCreate(); 11655db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find(std::string("verify_meta_layer_component_layers: Adding meta-layer ") + meta_meta_layer_name + 11665db71995Sopenharmony_ci " which also contains meta-layer " + meta_layer_name)); 11675db71995Sopenharmony_ci} 11685db71995Sopenharmony_ci 11695db71995Sopenharmony_ciTEST(MetaLayers, InstanceExtensionInComponentLayer) { 11705db71995Sopenharmony_ci FrameworkEnvironment env; 11715db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA)).add_physical_device({}); 11725db71995Sopenharmony_ci 11735db71995Sopenharmony_ci const char* meta_layer_name = "VK_LAYER_MetaTestLayer"; 11745db71995Sopenharmony_ci const char* regular_layer_name = "VK_LAYER_TestLayer"; 11755db71995Sopenharmony_ci const char* instance_ext_name = "VK_EXT_headless_surface"; 11765db71995Sopenharmony_ci env.add_explicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} 11775db71995Sopenharmony_ci .set_name(regular_layer_name) 11785db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) 11795db71995Sopenharmony_ci .add_instance_extension({instance_ext_name})), 11805db71995Sopenharmony_ci "regular_test_layer.json"); 11815db71995Sopenharmony_ci env.add_explicit_layer( 11825db71995Sopenharmony_ci ManifestLayer{}.set_file_format_version({1, 1, 2}).add_layer( 11835db71995Sopenharmony_ci ManifestLayer::LayerDescription{}.set_name(meta_layer_name).add_component_layers({regular_layer_name})), 11845db71995Sopenharmony_ci "meta_test_layer.json"); 11855db71995Sopenharmony_ci 11865db71995Sopenharmony_ci auto extensions = env.GetInstanceExtensions(1, meta_layer_name); 11875db71995Sopenharmony_ci EXPECT_TRUE(string_eq(extensions[0].extensionName, instance_ext_name)); 11885db71995Sopenharmony_ci} 11895db71995Sopenharmony_ci 11905db71995Sopenharmony_ciTEST(MetaLayers, DeviceExtensionInComponentLayer) { 11915db71995Sopenharmony_ci FrameworkEnvironment env; 11925db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA)).add_physical_device({}); 11935db71995Sopenharmony_ci 11945db71995Sopenharmony_ci const char* meta_layer_name = "VK_LAYER_MetaTestLayer"; 11955db71995Sopenharmony_ci const char* regular_layer_name = "VK_LAYER_TestLayer"; 11965db71995Sopenharmony_ci const char* device_ext_name = "VK_EXT_fake_dev_ext"; 11975db71995Sopenharmony_ci env.add_explicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} 11985db71995Sopenharmony_ci .set_name(regular_layer_name) 11995db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) 12005db71995Sopenharmony_ci .add_device_extension({device_ext_name})), 12015db71995Sopenharmony_ci "regular_test_layer.json"); 12025db71995Sopenharmony_ci env.add_explicit_layer( 12035db71995Sopenharmony_ci ManifestLayer{}.set_file_format_version({1, 1, 2}).add_layer( 12045db71995Sopenharmony_ci ManifestLayer::LayerDescription{}.set_name(meta_layer_name).add_component_layers({regular_layer_name})), 12055db71995Sopenharmony_ci "meta_test_layer.json"); 12065db71995Sopenharmony_ci 12075db71995Sopenharmony_ci ASSERT_NO_FATAL_FAILURE(env.GetInstanceExtensions(0, meta_layer_name)); 12085db71995Sopenharmony_ci 12095db71995Sopenharmony_ci { // layer is not enabled 12105db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 12115db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst.create_info, env.debug_log); 12125db71995Sopenharmony_ci inst.CheckCreate(); 12135db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find(std::string("Meta-layer ") + meta_layer_name + " component layer " + regular_layer_name + 12145db71995Sopenharmony_ci " adding device extension " + device_ext_name)); 12155db71995Sopenharmony_ci 12165db71995Sopenharmony_ci auto extensions = inst.EnumerateLayerDeviceExtensions(inst.GetPhysDev(), meta_layer_name, 1); 12175db71995Sopenharmony_ci EXPECT_TRUE(string_eq(extensions.at(0).extensionName, device_ext_name)); 12185db71995Sopenharmony_ci } 12195db71995Sopenharmony_ci { // layer is enabled 12205db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 12215db71995Sopenharmony_ci inst.create_info.add_layer(meta_layer_name); 12225db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst.create_info, env.debug_log); 12235db71995Sopenharmony_ci inst.CheckCreate(); 12245db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find(std::string("Meta-layer ") + meta_layer_name + " component layer " + regular_layer_name + 12255db71995Sopenharmony_ci " adding device extension " + device_ext_name)); 12265db71995Sopenharmony_ci 12275db71995Sopenharmony_ci auto extensions = inst.EnumerateLayerDeviceExtensions(inst.GetPhysDev(), meta_layer_name, 1); 12285db71995Sopenharmony_ci EXPECT_TRUE(string_eq(extensions.at(0).extensionName, device_ext_name)); 12295db71995Sopenharmony_ci } 12305db71995Sopenharmony_ci} 12315db71995Sopenharmony_ci 12325db71995Sopenharmony_ci// Override meta layer missing disable environment variable still enables the layer 12335db71995Sopenharmony_ciTEST(OverrideMetaLayer, InvalidDisableEnvironment) { 12345db71995Sopenharmony_ci FrameworkEnvironment env; 12355db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA)).add_physical_device({}); 12365db71995Sopenharmony_ci 12375db71995Sopenharmony_ci const char* regular_layer_name = "VK_LAYER_TestLayer"; 12385db71995Sopenharmony_ci env.add_explicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} 12395db71995Sopenharmony_ci .set_name(regular_layer_name) 12405db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) 12415db71995Sopenharmony_ci .set_api_version(VK_MAKE_API_VERSION(0, 1, 1, 0)) 12425db71995Sopenharmony_ci .add_device_extension({"NeverGonnaLetYouDown"})), 12435db71995Sopenharmony_ci "regular_test_layer.json"); 12445db71995Sopenharmony_ci 12455db71995Sopenharmony_ci env.add_implicit_layer( 12465db71995Sopenharmony_ci ManifestLayer{}.set_file_format_version({1, 1, 2}).add_layer(ManifestLayer::LayerDescription{} 12475db71995Sopenharmony_ci .set_name(lunarg_meta_layer_name) 12485db71995Sopenharmony_ci .set_api_version(VK_MAKE_API_VERSION(0, 1, 1, 0)) 12495db71995Sopenharmony_ci .add_component_layers({regular_layer_name})), 12505db71995Sopenharmony_ci "meta_test_layer.json"); 12515db71995Sopenharmony_ci 12525db71995Sopenharmony_ci auto layer_props = env.GetLayerProperties(1); 12535db71995Sopenharmony_ci EXPECT_TRUE(string_eq(layer_props[0].layerName, regular_layer_name)); 12545db71995Sopenharmony_ci 12555db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 12565db71995Sopenharmony_ci inst.CheckCreate(); 12575db71995Sopenharmony_ci} 12585db71995Sopenharmony_ci 12595db71995Sopenharmony_ci// Override meta layer whose version is less than the api version of the instance 12605db71995Sopenharmony_ciTEST(OverrideMetaLayer, OlderVersionThanInstance) { 12615db71995Sopenharmony_ci FrameworkEnvironment env; 12625db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA)).add_physical_device({}); 12635db71995Sopenharmony_ci 12645db71995Sopenharmony_ci const char* regular_layer_name = "VK_LAYER_TestLayer"; 12655db71995Sopenharmony_ci env.add_explicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} 12665db71995Sopenharmony_ci .set_name(regular_layer_name) 12675db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) 12685db71995Sopenharmony_ci .set_api_version(VK_MAKE_API_VERSION(0, 1, 1, 0)) 12695db71995Sopenharmony_ci .add_device_extension({"NeverGonnaLetYouDown"})), 12705db71995Sopenharmony_ci "regular_test_layer.json"); 12715db71995Sopenharmony_ci 12725db71995Sopenharmony_ci env.add_implicit_layer( 12735db71995Sopenharmony_ci ManifestLayer{}.set_file_format_version({1, 1, 2}).add_layer(ManifestLayer::LayerDescription{} 12745db71995Sopenharmony_ci .set_name(lunarg_meta_layer_name) 12755db71995Sopenharmony_ci .set_api_version(VK_MAKE_API_VERSION(0, 1, 1, 0)) 12765db71995Sopenharmony_ci .set_disable_environment("DisableMeIfYouCan") 12775db71995Sopenharmony_ci .add_component_layers({regular_layer_name})), 12785db71995Sopenharmony_ci "meta_test_layer.json"); 12795db71995Sopenharmony_ci { // global functions 12805db71995Sopenharmony_ci auto layer_props = env.GetLayerProperties(2); 12815db71995Sopenharmony_ci EXPECT_TRUE(check_permutation({regular_layer_name, lunarg_meta_layer_name}, layer_props)); 12825db71995Sopenharmony_ci } 12835db71995Sopenharmony_ci { // 1.1 instance 12845db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 12855db71995Sopenharmony_ci inst.create_info.api_version = VK_API_VERSION_1_1; 12865db71995Sopenharmony_ci inst.CheckCreate(); 12875db71995Sopenharmony_ci auto layer_props = inst.GetActiveLayers(inst.GetPhysDev(), 2); 12885db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layer_props[0].layerName, regular_layer_name)); 12895db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layer_props[1].layerName, lunarg_meta_layer_name)); 12905db71995Sopenharmony_ci } 12915db71995Sopenharmony_ci { // 1.3 instance 12925db71995Sopenharmony_ci 12935db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 12945db71995Sopenharmony_ci inst.create_info.api_version = VK_API_VERSION_1_3; 12955db71995Sopenharmony_ci inst.CheckCreate(); 12965db71995Sopenharmony_ci auto layer_props = inst.GetActiveLayers(inst.GetPhysDev(), 2); 12975db71995Sopenharmony_ci 12985db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layer_props[0].layerName, regular_layer_name)); 12995db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layer_props[1].layerName, lunarg_meta_layer_name)); 13005db71995Sopenharmony_ci } 13015db71995Sopenharmony_ci} 13025db71995Sopenharmony_ci 13035db71995Sopenharmony_ciTEST(OverrideMetaLayer, OlderMetaLayerWithNewerInstanceVersion) { 13045db71995Sopenharmony_ci FrameworkEnvironment env; 13055db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA)).add_physical_device({}); 13065db71995Sopenharmony_ci 13075db71995Sopenharmony_ci const char* regular_layer_name = "VK_LAYER_TestLayer"; 13085db71995Sopenharmony_ci env.add_explicit_layer( 13095db71995Sopenharmony_ci ManifestLayer{}.set_file_format_version({1, 2, 0}).add_layer(ManifestLayer::LayerDescription{} 13105db71995Sopenharmony_ci .set_name(regular_layer_name) 13115db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) 13125db71995Sopenharmony_ci .set_api_version(VK_MAKE_API_VERSION(0, 1, 1, 0))), 13135db71995Sopenharmony_ci "regular_test_layer.json"); 13145db71995Sopenharmony_ci 13155db71995Sopenharmony_ci env.add_implicit_layer( 13165db71995Sopenharmony_ci ManifestLayer{}.set_file_format_version({1, 2, 0}).add_layer(ManifestLayer::LayerDescription{} 13175db71995Sopenharmony_ci .set_name(lunarg_meta_layer_name) 13185db71995Sopenharmony_ci .set_api_version(VK_MAKE_API_VERSION(0, 1, 1, 0)) 13195db71995Sopenharmony_ci .add_component_layers({regular_layer_name}) 13205db71995Sopenharmony_ci .set_disable_environment("DisableMeIfYouCan")), 13215db71995Sopenharmony_ci "meta_test_layer.json"); 13225db71995Sopenharmony_ci { // global functions 13235db71995Sopenharmony_ci auto layer_props = env.GetLayerProperties(2); 13245db71995Sopenharmony_ci EXPECT_TRUE(check_permutation({regular_layer_name, lunarg_meta_layer_name}, layer_props)); 13255db71995Sopenharmony_ci } 13265db71995Sopenharmony_ci { 13275db71995Sopenharmony_ci // 1.1 instance 13285db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 13295db71995Sopenharmony_ci inst.create_info.set_api_version(1, 1, 0); 13305db71995Sopenharmony_ci inst.CheckCreate(); 13315db71995Sopenharmony_ci auto layer_props = inst.GetActiveLayers(inst.GetPhysDev(), 2); 13325db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layer_props[0].layerName, regular_layer_name)); 13335db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layer_props[1].layerName, lunarg_meta_layer_name)); 13345db71995Sopenharmony_ci } 13355db71995Sopenharmony_ci 13365db71995Sopenharmony_ci { 13375db71995Sopenharmony_ci // 1.3 instance 13385db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 13395db71995Sopenharmony_ci inst.create_info.set_api_version(1, 3, 0); 13405db71995Sopenharmony_ci inst.CheckCreate(); 13415db71995Sopenharmony_ci auto layer_props = inst.GetActiveLayers(inst.GetPhysDev(), 2); 13425db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layer_props[0].layerName, regular_layer_name)); 13435db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layer_props[1].layerName, lunarg_meta_layer_name)); 13445db71995Sopenharmony_ci } 13455db71995Sopenharmony_ci} 13465db71995Sopenharmony_ci 13475db71995Sopenharmony_ciTEST(OverrideMetaLayer, NewerComponentLayerInMetaLayer) { 13485db71995Sopenharmony_ci FrameworkEnvironment env; 13495db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA)).add_physical_device({}); 13505db71995Sopenharmony_ci 13515db71995Sopenharmony_ci const char* regular_layer_name = "VK_LAYER_TestLayer"; 13525db71995Sopenharmony_ci env.add_explicit_layer( 13535db71995Sopenharmony_ci ManifestLayer{}.set_file_format_version({1, 2, 0}).add_layer(ManifestLayer::LayerDescription{} 13545db71995Sopenharmony_ci .set_name(regular_layer_name) 13555db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) 13565db71995Sopenharmony_ci .set_api_version(VK_API_VERSION_1_2)), 13575db71995Sopenharmony_ci "regular_test_layer.json"); 13585db71995Sopenharmony_ci 13595db71995Sopenharmony_ci env.add_implicit_layer( 13605db71995Sopenharmony_ci ManifestLayer{}.set_file_format_version({1, 2, 0}).add_layer(ManifestLayer::LayerDescription{} 13615db71995Sopenharmony_ci .set_name(lunarg_meta_layer_name) 13625db71995Sopenharmony_ci .set_api_version(VK_MAKE_API_VERSION(0, 1, 1, 0)) 13635db71995Sopenharmony_ci .add_component_layers({regular_layer_name}) 13645db71995Sopenharmony_ci .set_disable_environment("DisableMeIfYouCan")), 13655db71995Sopenharmony_ci "meta_test_layer.json"); 13665db71995Sopenharmony_ci 13675db71995Sopenharmony_ci { // global functions 13685db71995Sopenharmony_ci auto layer_props = env.GetLayerProperties(2); 13695db71995Sopenharmony_ci // Expect the explicit layer to still be found 13705db71995Sopenharmony_ci EXPECT_TRUE(check_permutation({regular_layer_name, lunarg_meta_layer_name}, layer_props)); 13715db71995Sopenharmony_ci } 13725db71995Sopenharmony_ci { 13735db71995Sopenharmony_ci // 1.1 instance 13745db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 13755db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst.create_info, env.debug_log); 13765db71995Sopenharmony_ci inst.create_info.set_api_version(1, 1, 0); 13775db71995Sopenharmony_ci inst.CheckCreate(); 13785db71995Sopenharmony_ci // Newer component is allowed now 13795db71995Sopenharmony_ci EXPECT_TRUE(env.debug_log.find(std::string("Insert instance layer \"") + regular_layer_name)); 13805db71995Sopenharmony_ci auto layer_props = inst.GetActiveLayers(inst.GetPhysDev(), 2); 13815db71995Sopenharmony_ci EXPECT_TRUE(check_permutation({regular_layer_name, lunarg_meta_layer_name}, layer_props)); 13825db71995Sopenharmony_ci } 13835db71995Sopenharmony_ci env.debug_log.clear(); 13845db71995Sopenharmony_ci 13855db71995Sopenharmony_ci { 13865db71995Sopenharmony_ci // 1.3 instance 13875db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 13885db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst.create_info, env.debug_log); 13895db71995Sopenharmony_ci inst.create_info.set_api_version(1, 3, 0); 13905db71995Sopenharmony_ci inst.CheckCreate(); 13915db71995Sopenharmony_ci // Newer component is allowed now 13925db71995Sopenharmony_ci EXPECT_TRUE(env.debug_log.find(std::string("Insert instance layer \"") + regular_layer_name)); 13935db71995Sopenharmony_ci auto layer_props = inst.GetActiveLayers(inst.GetPhysDev(), 2); 13945db71995Sopenharmony_ci 13955db71995Sopenharmony_ci EXPECT_TRUE(check_permutation({regular_layer_name, lunarg_meta_layer_name}, layer_props)); 13965db71995Sopenharmony_ci } 13975db71995Sopenharmony_ci} 13985db71995Sopenharmony_ci 13995db71995Sopenharmony_ciTEST(OverrideMetaLayer, OlderComponentLayerInMetaLayer) { 14005db71995Sopenharmony_ci FrameworkEnvironment env; 14015db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA)).add_physical_device({}); 14025db71995Sopenharmony_ci 14035db71995Sopenharmony_ci const char* regular_layer_name = "VK_LAYER_TestLayer"; 14045db71995Sopenharmony_ci env.add_explicit_layer( 14055db71995Sopenharmony_ci ManifestLayer{}.set_file_format_version({1, 2, 0}).add_layer(ManifestLayer::LayerDescription{} 14065db71995Sopenharmony_ci .set_name(regular_layer_name) 14075db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) 14085db71995Sopenharmony_ci .set_api_version(VK_MAKE_API_VERSION(0, 1, 0, 0))), 14095db71995Sopenharmony_ci "regular_test_layer.json"); 14105db71995Sopenharmony_ci 14115db71995Sopenharmony_ci env.add_implicit_layer( 14125db71995Sopenharmony_ci ManifestLayer{}.set_file_format_version({1, 2, 0}).add_layer(ManifestLayer::LayerDescription{} 14135db71995Sopenharmony_ci .set_name(lunarg_meta_layer_name) 14145db71995Sopenharmony_ci .set_api_version(VK_MAKE_API_VERSION(0, 1, 1, 0)) 14155db71995Sopenharmony_ci .add_component_layers({regular_layer_name}) 14165db71995Sopenharmony_ci .set_disable_environment("DisableMeIfYouCan")), 14175db71995Sopenharmony_ci "meta_test_layer.json"); 14185db71995Sopenharmony_ci { // global functions 14195db71995Sopenharmony_ci auto layer_props = env.GetLayerProperties(1); 14205db71995Sopenharmony_ci EXPECT_TRUE(string_eq(layer_props[0].layerName, regular_layer_name)); 14215db71995Sopenharmony_ci } 14225db71995Sopenharmony_ci { 14235db71995Sopenharmony_ci // 1.1 instance 14245db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 14255db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst.create_info, env.debug_log); 14265db71995Sopenharmony_ci inst.create_info.set_api_version(1, 1, 0); 14275db71995Sopenharmony_ci inst.CheckCreate(); 14285db71995Sopenharmony_ci EXPECT_TRUE( 14295db71995Sopenharmony_ci env.debug_log.find("verify_meta_layer_component_layers: Meta-layer uses API version 1.1, but component layer 0 has API " 14305db71995Sopenharmony_ci "version 1.0 that is lower. Skipping this layer.")); 14315db71995Sopenharmony_ci env.debug_log.clear(); 14325db71995Sopenharmony_ci ASSERT_NO_FATAL_FAILURE(inst.GetActiveLayers(inst.GetPhysDev(), 0)); 14335db71995Sopenharmony_ci } 14345db71995Sopenharmony_ci 14355db71995Sopenharmony_ci { 14365db71995Sopenharmony_ci // 1.2 instance 14375db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 14385db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst.create_info, env.debug_log); 14395db71995Sopenharmony_ci inst.create_info.set_api_version(1, 2, 0); 14405db71995Sopenharmony_ci inst.CheckCreate(); 14415db71995Sopenharmony_ci ASSERT_TRUE( 14425db71995Sopenharmony_ci env.debug_log.find("verify_meta_layer_component_layers: Meta-layer uses API version 1.1, but component layer 0 has API " 14435db71995Sopenharmony_ci "version 1.0 that is lower. Skipping this layer.")); 14445db71995Sopenharmony_ci env.debug_log.clear(); 14455db71995Sopenharmony_ci ASSERT_NO_FATAL_FAILURE(inst.GetActiveLayers(inst.GetPhysDev(), 0)); 14465db71995Sopenharmony_ci } 14475db71995Sopenharmony_ci} 14485db71995Sopenharmony_ci 14495db71995Sopenharmony_ciTEST(OverrideMetaLayer, ApplicationEnabledLayerInBlacklist) { 14505db71995Sopenharmony_ci FrameworkEnvironment env; 14515db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA)).add_physical_device({}); 14525db71995Sopenharmony_ci 14535db71995Sopenharmony_ci const char* automatic_regular_layer_name = "VK_LAYER_TestLayer_1"; 14545db71995Sopenharmony_ci const char* manual_regular_layer_name = "VK_LAYER_TestLayer_2"; 14555db71995Sopenharmony_ci env.add_explicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} 14565db71995Sopenharmony_ci .set_name(automatic_regular_layer_name) 14575db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) 14585db71995Sopenharmony_ci .set_api_version(VK_MAKE_API_VERSION(0, 1, 1, 0))), 14595db71995Sopenharmony_ci "regular_test_layer_1.json"); 14605db71995Sopenharmony_ci env.add_explicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} 14615db71995Sopenharmony_ci .set_name(manual_regular_layer_name) 14625db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) 14635db71995Sopenharmony_ci .set_api_version(VK_MAKE_API_VERSION(0, 1, 1, 0))), 14645db71995Sopenharmony_ci "regular_test_layer_2.json"); 14655db71995Sopenharmony_ci env.add_implicit_layer( 14665db71995Sopenharmony_ci ManifestLayer{}.set_file_format_version({1, 2, 0}).add_layer(ManifestLayer::LayerDescription{} 14675db71995Sopenharmony_ci .set_name(lunarg_meta_layer_name) 14685db71995Sopenharmony_ci .set_api_version(VK_MAKE_API_VERSION(0, 1, 1, 0)) 14695db71995Sopenharmony_ci .add_component_layer(automatic_regular_layer_name) 14705db71995Sopenharmony_ci .add_blacklisted_layer(manual_regular_layer_name) 14715db71995Sopenharmony_ci .set_disable_environment("DisableMeIfYouCan")), 14725db71995Sopenharmony_ci "meta_test_layer.json"); 14735db71995Sopenharmony_ci { // Check that enumerating the layers returns only the non-blacklisted layers + override layer 14745db71995Sopenharmony_ci auto layer_props = env.GetLayerProperties(2); 14755db71995Sopenharmony_ci ASSERT_TRUE(check_permutation({automatic_regular_layer_name, lunarg_meta_layer_name}, layer_props)); 14765db71995Sopenharmony_ci } 14775db71995Sopenharmony_ci { 14785db71995Sopenharmony_ci // enable the layer in the blacklist 14795db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 14805db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst.create_info, env.debug_log); 14815db71995Sopenharmony_ci inst.create_info.add_layer(manual_regular_layer_name); 14825db71995Sopenharmony_ci inst.CheckCreate(VK_ERROR_LAYER_NOT_PRESENT); 14835db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find(std::string("loader_remove_layers_in_blacklist: Override layer is active and layer ") + 14845db71995Sopenharmony_ci manual_regular_layer_name + 14855db71995Sopenharmony_ci " is in the blacklist inside of it. Removing that layer from current layer list.")); 14865db71995Sopenharmony_ci env.debug_log.clear(); 14875db71995Sopenharmony_ci } 14885db71995Sopenharmony_ci { // dont enable the layer in the blacklist 14895db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 14905db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst.create_info, env.debug_log); 14915db71995Sopenharmony_ci inst.CheckCreate(); 14925db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find(std::string("loader_remove_layers_in_blacklist: Override layer is active and layer ") + 14935db71995Sopenharmony_ci manual_regular_layer_name + 14945db71995Sopenharmony_ci " is in the blacklist inside of it. Removing that layer from current layer list.")); 14955db71995Sopenharmony_ci env.debug_log.clear(); 14965db71995Sopenharmony_ci auto layer_props = inst.GetActiveLayers(inst.GetPhysDev(), 2); 14975db71995Sopenharmony_ci ASSERT_TRUE(check_permutation({automatic_regular_layer_name, lunarg_meta_layer_name}, layer_props)); 14985db71995Sopenharmony_ci } 14995db71995Sopenharmony_ci} 15005db71995Sopenharmony_ci 15015db71995Sopenharmony_ciTEST(OverrideMetaLayer, BasicOverridePaths) { 15025db71995Sopenharmony_ci FrameworkEnvironment env; 15035db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA)).add_physical_device({}); 15045db71995Sopenharmony_ci 15055db71995Sopenharmony_ci fs::FolderManager override_layer_folder{FRAMEWORK_BUILD_DIRECTORY, "override_layer_folder"}; 15065db71995Sopenharmony_ci 15075db71995Sopenharmony_ci const char* regular_layer_name = "VK_LAYER_TestLayer_1"; 15085db71995Sopenharmony_ci override_layer_folder.write_manifest("regular_test_layer.json", 15095db71995Sopenharmony_ci ManifestLayer{} 15105db71995Sopenharmony_ci .add_layer(ManifestLayer::LayerDescription{} 15115db71995Sopenharmony_ci .set_name(regular_layer_name) 15125db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) 15135db71995Sopenharmony_ci .set_api_version(VK_MAKE_API_VERSION(0, 1, 1, 0))) 15145db71995Sopenharmony_ci .get_manifest_str()); 15155db71995Sopenharmony_ci env.add_implicit_layer(ManifestLayer{}.set_file_format_version({1, 2, 0}).add_layer( 15165db71995Sopenharmony_ci ManifestLayer::LayerDescription{} 15175db71995Sopenharmony_ci .set_name(lunarg_meta_layer_name) 15185db71995Sopenharmony_ci .set_api_version(VK_MAKE_API_VERSION(0, 1, 1, 0)) 15195db71995Sopenharmony_ci .add_component_layer(regular_layer_name) 15205db71995Sopenharmony_ci .set_disable_environment("DisableMeIfYouCan") 15215db71995Sopenharmony_ci .add_override_path(fs::make_native(override_layer_folder.location().str()))), 15225db71995Sopenharmony_ci "meta_test_layer.json"); 15235db71995Sopenharmony_ci 15245db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 15255db71995Sopenharmony_ci inst.create_info.set_api_version(1, 1, 0); 15265db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst.create_info, env.debug_log); 15275db71995Sopenharmony_ci inst.CheckCreate(); 15285db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find(std::string("Insert instance layer \"") + regular_layer_name)); 15295db71995Sopenharmony_ci env.layers.clear(); 15305db71995Sopenharmony_ci} 15315db71995Sopenharmony_ci 15325db71995Sopenharmony_ciTEST(OverrideMetaLayer, BasicOverridePathsIgnoreOtherLayers) { 15335db71995Sopenharmony_ci FrameworkEnvironment env; 15345db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA)).add_physical_device({}); 15355db71995Sopenharmony_ci 15365db71995Sopenharmony_ci fs::FolderManager override_layer_folder{FRAMEWORK_BUILD_DIRECTORY, "override_layer_folder"}; 15375db71995Sopenharmony_ci 15385db71995Sopenharmony_ci const char* regular_layer_name = "VK_LAYER_TestLayer"; 15395db71995Sopenharmony_ci env.add_explicit_layer( 15405db71995Sopenharmony_ci ManifestLayer{}.set_file_format_version({1, 2, 0}).add_layer(ManifestLayer::LayerDescription{} 15415db71995Sopenharmony_ci .set_name(regular_layer_name) 15425db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) 15435db71995Sopenharmony_ci .set_api_version(VK_MAKE_API_VERSION(0, 1, 0, 0))), 15445db71995Sopenharmony_ci "regular_test_layer.json"); 15455db71995Sopenharmony_ci 15465db71995Sopenharmony_ci const char* special_layer_name = "VK_LAYER_TestLayer_1"; 15475db71995Sopenharmony_ci override_layer_folder.write_manifest("regular_test_layer.json", 15485db71995Sopenharmony_ci ManifestLayer{} 15495db71995Sopenharmony_ci .add_layer(ManifestLayer::LayerDescription{} 15505db71995Sopenharmony_ci .set_name(special_layer_name) 15515db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) 15525db71995Sopenharmony_ci .set_api_version(VK_MAKE_API_VERSION(0, 1, 1, 0))) 15535db71995Sopenharmony_ci .get_manifest_str()); 15545db71995Sopenharmony_ci env.add_implicit_layer(ManifestLayer{}.set_file_format_version({1, 2, 0}).add_layer( 15555db71995Sopenharmony_ci ManifestLayer::LayerDescription{} 15565db71995Sopenharmony_ci .set_name(lunarg_meta_layer_name) 15575db71995Sopenharmony_ci .set_api_version(VK_MAKE_API_VERSION(0, 1, 1, 0)) 15585db71995Sopenharmony_ci .add_component_layer(special_layer_name) 15595db71995Sopenharmony_ci .set_disable_environment("DisableMeIfYouCan") 15605db71995Sopenharmony_ci .add_override_path(fs::make_native(override_layer_folder.location().str()))), 15615db71995Sopenharmony_ci "meta_test_layer.json"); 15625db71995Sopenharmony_ci 15635db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 15645db71995Sopenharmony_ci inst.create_info.set_api_version(1, 1, 0); 15655db71995Sopenharmony_ci inst.create_info.add_layer(regular_layer_name); 15665db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst.create_info, env.debug_log); 15675db71995Sopenharmony_ci inst.CheckCreate(VK_ERROR_LAYER_NOT_PRESENT); 15685db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find(std::string("Insert instance layer \"") + regular_layer_name)); 15695db71995Sopenharmony_ci env.layers.clear(); 15705db71995Sopenharmony_ci} 15715db71995Sopenharmony_ci 15725db71995Sopenharmony_ciTEST(OverrideMetaLayer, OverridePathsInteractionWithVK_LAYER_PATH) { 15735db71995Sopenharmony_ci FrameworkEnvironment env; 15745db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA)).add_physical_device({}); 15755db71995Sopenharmony_ci 15765db71995Sopenharmony_ci // add explicit layer to VK_LAYER_PATH folder 15775db71995Sopenharmony_ci const char* env_var_layer_name = "VK_LAYER_env_var_set_path"; 15785db71995Sopenharmony_ci env.add_explicit_layer(TestLayerDetails{ 15795db71995Sopenharmony_ci ManifestLayer{}.set_file_format_version({1, 2, 0}).add_layer(ManifestLayer::LayerDescription{} 15805db71995Sopenharmony_ci .set_name(env_var_layer_name) 15815db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) 15825db71995Sopenharmony_ci .set_api_version(VK_MAKE_API_VERSION(0, 1, 0, 0))), 15835db71995Sopenharmony_ci "regular_test_layer.json"} 15845db71995Sopenharmony_ci .set_discovery_type(ManifestDiscoveryType::env_var)); 15855db71995Sopenharmony_ci 15865db71995Sopenharmony_ci // add layer to regular explicit layer folder 15875db71995Sopenharmony_ci const char* regular_layer_name = "VK_LAYER_regular_layer_path"; 15885db71995Sopenharmony_ci env.add_explicit_layer(TestLayerDetails{ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} 15895db71995Sopenharmony_ci .set_name(regular_layer_name) 15905db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) 15915db71995Sopenharmony_ci .set_api_version(VK_MAKE_API_VERSION(0, 1, 1, 0))), 15925db71995Sopenharmony_ci "regular_test_layer.json"} 15935db71995Sopenharmony_ci .set_discovery_type(ManifestDiscoveryType::override_folder)); 15945db71995Sopenharmony_ci 15955db71995Sopenharmony_ci env.add_implicit_layer(ManifestLayer{}.set_file_format_version({1, 2, 0}).add_layer( 15965db71995Sopenharmony_ci ManifestLayer::LayerDescription{} 15975db71995Sopenharmony_ci .set_name(lunarg_meta_layer_name) 15985db71995Sopenharmony_ci .set_api_version(VK_MAKE_API_VERSION(0, 1, 1, 0)) 15995db71995Sopenharmony_ci .add_component_layer(regular_layer_name) 16005db71995Sopenharmony_ci .set_disable_environment("DisableMeIfYouCan") 16015db71995Sopenharmony_ci .add_override_path(env.get_folder(ManifestLocation::override_layer).location().str())), 16025db71995Sopenharmony_ci "meta_test_layer.json"); 16035db71995Sopenharmony_ci 16045db71995Sopenharmony_ci auto meta_layer_path = env.get_folder(ManifestLocation::override_layer).location(); 16055db71995Sopenharmony_ci 16065db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 16075db71995Sopenharmony_ci inst.create_info.set_api_version(1, 1, 0); 16085db71995Sopenharmony_ci inst.create_info.add_layer(env_var_layer_name); 16095db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst.create_info, env.debug_log); 16105db71995Sopenharmony_ci inst.CheckCreate(VK_ERROR_LAYER_NOT_PRESENT); 16115db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find(std::string("Insert instance layer \"") + env_var_layer_name)); 16125db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find( 16135db71995Sopenharmony_ci std::string("Ignoring VK_LAYER_PATH. The Override layer is active and has override paths set, which takes priority. " 16145db71995Sopenharmony_ci "VK_LAYER_PATH is set to ") + 16155db71995Sopenharmony_ci env.env_var_vk_layer_paths.value())); 16165db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find("Override layer has override paths set to " + meta_layer_path.str())); 16175db71995Sopenharmony_ci 16185db71995Sopenharmony_ci env.layers.clear(); 16195db71995Sopenharmony_ci} 16205db71995Sopenharmony_ci 16215db71995Sopenharmony_ci// Make sure that implicit layers not in the override paths aren't found by mistake 16225db71995Sopenharmony_ciTEST(OverrideMetaLayer, OverridePathsEnableImplicitLayerInDefaultPaths) { 16235db71995Sopenharmony_ci FrameworkEnvironment env; 16245db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA)).add_physical_device({}); 16255db71995Sopenharmony_ci fs::FolderManager override_layer_folder{FRAMEWORK_BUILD_DIRECTORY, "override_layer_folder"}; 16265db71995Sopenharmony_ci 16275db71995Sopenharmony_ci const char* implicit_layer_name = "VK_LAYER_ImplicitLayer"; 16285db71995Sopenharmony_ci env.add_implicit_layer( 16295db71995Sopenharmony_ci ManifestLayer{}.set_file_format_version({1, 2, 0}).add_layer(ManifestLayer::LayerDescription{} 16305db71995Sopenharmony_ci .set_name(implicit_layer_name) 16315db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) 16325db71995Sopenharmony_ci .set_api_version(VK_MAKE_API_VERSION(0, 1, 0, 0))), 16335db71995Sopenharmony_ci "implicit_test_layer.json"); 16345db71995Sopenharmony_ci 16355db71995Sopenharmony_ci const char* regular_layer_name = "VK_LAYER_TestLayer_1"; 16365db71995Sopenharmony_ci override_layer_folder.write_manifest("regular_test_layer.json", 16375db71995Sopenharmony_ci ManifestLayer{} 16385db71995Sopenharmony_ci .add_layer(ManifestLayer::LayerDescription{} 16395db71995Sopenharmony_ci .set_name(regular_layer_name) 16405db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) 16415db71995Sopenharmony_ci .set_api_version(VK_MAKE_API_VERSION(0, 1, 1, 0))) 16425db71995Sopenharmony_ci .get_manifest_str()); 16435db71995Sopenharmony_ci env.add_implicit_layer(ManifestLayer{}.set_file_format_version({1, 2, 0}).add_layer( 16445db71995Sopenharmony_ci ManifestLayer::LayerDescription{} 16455db71995Sopenharmony_ci .set_name(lunarg_meta_layer_name) 16465db71995Sopenharmony_ci .set_api_version(VK_MAKE_API_VERSION(0, 1, 1, 0)) 16475db71995Sopenharmony_ci .add_component_layers({regular_layer_name, implicit_layer_name}) 16485db71995Sopenharmony_ci .set_disable_environment("DisableMeIfYouCan") 16495db71995Sopenharmony_ci .add_override_path(fs::make_native(override_layer_folder.location().str()))), 16505db71995Sopenharmony_ci "meta_test_layer.json"); 16515db71995Sopenharmony_ci 16525db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 16535db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst.create_info, env.debug_log); 16545db71995Sopenharmony_ci inst.create_info.set_api_version(1, 1, 0); 16555db71995Sopenharmony_ci inst.CheckCreate(); 16565db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find(std::string("Insert instance layer \"") + implicit_layer_name)); 16575db71995Sopenharmony_ci ASSERT_TRUE( 16585db71995Sopenharmony_ci env.debug_log.find("Removing meta-layer VK_LAYER_LUNARG_override from instance layer list since it appears invalid.")); 16595db71995Sopenharmony_ci env.layers.clear(); 16605db71995Sopenharmony_ci} 16615db71995Sopenharmony_ci 16625db71995Sopenharmony_ciTEST(OverrideMetaLayer, ManifestFileFormatVersionTooOld) { 16635db71995Sopenharmony_ci FrameworkEnvironment env; 16645db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA)).add_physical_device({}); 16655db71995Sopenharmony_ci fs::FolderManager override_layer_folder{FRAMEWORK_BUILD_DIRECTORY, "override_layer_folder"}; 16665db71995Sopenharmony_ci 16675db71995Sopenharmony_ci const char* regular_layer_name = "VK_LAYER_TestLayer_1"; 16685db71995Sopenharmony_ci override_layer_folder.write_manifest("regular_test_layer.json", 16695db71995Sopenharmony_ci ManifestLayer{} 16705db71995Sopenharmony_ci .add_layer(ManifestLayer::LayerDescription{} 16715db71995Sopenharmony_ci .set_name(regular_layer_name) 16725db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) 16735db71995Sopenharmony_ci .set_api_version(VK_MAKE_API_VERSION(0, 1, 1, 0))) 16745db71995Sopenharmony_ci .get_manifest_str()); 16755db71995Sopenharmony_ci env.add_implicit_layer(ManifestLayer{}.set_file_format_version({1, 0, 0}).add_layer( 16765db71995Sopenharmony_ci ManifestLayer::LayerDescription{} 16775db71995Sopenharmony_ci .set_name(lunarg_meta_layer_name) 16785db71995Sopenharmony_ci .set_api_version(VK_MAKE_API_VERSION(0, 1, 1, 0)) 16795db71995Sopenharmony_ci .add_component_layer(regular_layer_name) 16805db71995Sopenharmony_ci .set_disable_environment("DisableMeIfYouCan") 16815db71995Sopenharmony_ci .add_override_path(fs::make_native(override_layer_folder.location().str()))), 16825db71995Sopenharmony_ci "meta_test_layer.json"); 16835db71995Sopenharmony_ci 16845db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 16855db71995Sopenharmony_ci inst.create_info.set_api_version(1, 1, 0); 16865db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst.create_info, env.debug_log); 16875db71995Sopenharmony_ci inst.CheckCreate(); 16885db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find(std::string("Insert instance layer \"") + regular_layer_name)); 16895db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find("Indicating meta-layer-specific override paths, but using older JSON file version.")); 16905db71995Sopenharmony_ci env.layers.clear(); 16915db71995Sopenharmony_ci} 16925db71995Sopenharmony_ci 16935db71995Sopenharmony_ci// app_key contains test executable name, should activate the override layer 16945db71995Sopenharmony_ciTEST(OverrideMetaLayer, AppKeysDoesContainCurrentApplication) { 16955db71995Sopenharmony_ci FrameworkEnvironment env; 16965db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA)).add_physical_device({}); 16975db71995Sopenharmony_ci 16985db71995Sopenharmony_ci const char* regular_layer_name = "VK_LAYER_TestLayer"; 16995db71995Sopenharmony_ci env.add_explicit_layer( 17005db71995Sopenharmony_ci ManifestLayer{}.set_file_format_version({1, 2, 0}).add_layer( 17015db71995Sopenharmony_ci ManifestLayer::LayerDescription{}.set_name(regular_layer_name).set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)), 17025db71995Sopenharmony_ci "regular_test_layer.json"); 17035db71995Sopenharmony_ci 17045db71995Sopenharmony_ci std::string cur_path = test_platform_executable_path(); 17055db71995Sopenharmony_ci 17065db71995Sopenharmony_ci env.add_implicit_layer( 17075db71995Sopenharmony_ci ManifestLayer{}.set_file_format_version({1, 2, 0}).add_layer(ManifestLayer::LayerDescription{} 17085db71995Sopenharmony_ci .set_name(lunarg_meta_layer_name) 17095db71995Sopenharmony_ci .add_component_layers({regular_layer_name}) 17105db71995Sopenharmony_ci .set_disable_environment("DisableMeIfYouCan") 17115db71995Sopenharmony_ci .add_app_key(cur_path)), 17125db71995Sopenharmony_ci "meta_test_layer.json"); 17135db71995Sopenharmony_ci { // global functions 17145db71995Sopenharmony_ci auto layer_props = env.GetLayerProperties(2); 17155db71995Sopenharmony_ci EXPECT_TRUE(check_permutation({regular_layer_name, lunarg_meta_layer_name}, layer_props)); 17165db71995Sopenharmony_ci } 17175db71995Sopenharmony_ci { 17185db71995Sopenharmony_ci // instance 17195db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 17205db71995Sopenharmony_ci inst.CheckCreate(); 17215db71995Sopenharmony_ci auto layer_props = inst.GetActiveLayers(inst.GetPhysDev(), 2); 17225db71995Sopenharmony_ci EXPECT_TRUE(check_permutation({regular_layer_name, lunarg_meta_layer_name}, layer_props)); 17235db71995Sopenharmony_ci } 17245db71995Sopenharmony_ci} 17255db71995Sopenharmony_ci 17265db71995Sopenharmony_ci// app_key contains random strings, should not activate the override layer 17275db71995Sopenharmony_ciTEST(OverrideMetaLayer, AppKeysDoesNotContainCurrentApplication) { 17285db71995Sopenharmony_ci FrameworkEnvironment env; 17295db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA)).add_physical_device({}); 17305db71995Sopenharmony_ci 17315db71995Sopenharmony_ci const char* regular_layer_name = "VK_LAYER_TestLayer"; 17325db71995Sopenharmony_ci env.add_explicit_layer( 17335db71995Sopenharmony_ci ManifestLayer{}.set_file_format_version({1, 2, 0}).add_layer( 17345db71995Sopenharmony_ci ManifestLayer::LayerDescription{}.set_name(regular_layer_name).set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)), 17355db71995Sopenharmony_ci "regular_test_layer.json"); 17365db71995Sopenharmony_ci 17375db71995Sopenharmony_ci env.add_implicit_layer(ManifestLayer{}.set_file_format_version({1, 2, 0}).add_layer( 17385db71995Sopenharmony_ci ManifestLayer::LayerDescription{} 17395db71995Sopenharmony_ci .set_name(lunarg_meta_layer_name) 17405db71995Sopenharmony_ci .add_component_layers({regular_layer_name}) 17415db71995Sopenharmony_ci .set_disable_environment("DisableMeIfYouCan") 17425db71995Sopenharmony_ci .add_app_keys({"/Hello", "Hi", "./../Uh-oh", "C:/Windows/Only"})), 17435db71995Sopenharmony_ci "meta_test_layer.json"); 17445db71995Sopenharmony_ci { // global functions 17455db71995Sopenharmony_ci auto layer_props = env.GetLayerProperties(1); 17465db71995Sopenharmony_ci EXPECT_TRUE(string_eq(layer_props[0].layerName, regular_layer_name)); 17475db71995Sopenharmony_ci } 17485db71995Sopenharmony_ci { 17495db71995Sopenharmony_ci // instance 17505db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 17515db71995Sopenharmony_ci inst.CheckCreate(); 17525db71995Sopenharmony_ci ASSERT_NO_FATAL_FAILURE(inst.GetActiveLayers(inst.GetPhysDev(), 0)); 17535db71995Sopenharmony_ci } 17545db71995Sopenharmony_ci} 17555db71995Sopenharmony_ci 17565db71995Sopenharmony_ciTEST(OverrideMetaLayer, RunningWithElevatedPrivilegesFromSecureLocation) { 17575db71995Sopenharmony_ci FrameworkEnvironment env; 17585db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA)).add_physical_device({}); 17595db71995Sopenharmony_ci 17605db71995Sopenharmony_ci fs::FolderManager override_layer_folder{FRAMEWORK_BUILD_DIRECTORY, "override_layer_folder"}; 17615db71995Sopenharmony_ci 17625db71995Sopenharmony_ci const char* regular_layer_name = "VK_LAYER_TestLayer_1"; 17635db71995Sopenharmony_ci override_layer_folder.write_manifest("regular_test_layer.json", 17645db71995Sopenharmony_ci ManifestLayer{} 17655db71995Sopenharmony_ci .add_layer(ManifestLayer::LayerDescription{} 17665db71995Sopenharmony_ci .set_name(regular_layer_name) 17675db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) 17685db71995Sopenharmony_ci .set_api_version(VK_MAKE_API_VERSION(0, 1, 1, 0))) 17695db71995Sopenharmony_ci .get_manifest_str()); 17705db71995Sopenharmony_ci auto override_folder_location = fs::make_native(override_layer_folder.location().str()); 17715db71995Sopenharmony_ci env.add_implicit_layer(TestLayerDetails{ManifestLayer{}.set_file_format_version({1, 2, 0}).add_layer( 17725db71995Sopenharmony_ci ManifestLayer::LayerDescription{} 17735db71995Sopenharmony_ci .set_name(lunarg_meta_layer_name) 17745db71995Sopenharmony_ci .set_api_version(VK_MAKE_API_VERSION(0, 1, 1, 0)) 17755db71995Sopenharmony_ci .add_component_layer(regular_layer_name) 17765db71995Sopenharmony_ci .set_disable_environment("DisableMeIfYouCan") 17775db71995Sopenharmony_ci .add_override_path(fs::make_native(override_layer_folder.location().str()))), 17785db71995Sopenharmony_ci "meta_test_layer.json"}); 17795db71995Sopenharmony_ci 17805db71995Sopenharmony_ci { // try with no elevated privileges 17815db71995Sopenharmony_ci auto layer_props = env.GetLayerProperties(2); 17825db71995Sopenharmony_ci EXPECT_TRUE(check_permutation({regular_layer_name, lunarg_meta_layer_name}, layer_props)); 17835db71995Sopenharmony_ci 17845db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 17855db71995Sopenharmony_ci inst.create_info.set_api_version(1, 1, 0); 17865db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst.create_info, env.debug_log); 17875db71995Sopenharmony_ci inst.CheckCreate(); 17885db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find(std::string("Insert instance layer \"") + regular_layer_name)); 17895db71995Sopenharmony_ci auto active_layer_props = inst.GetActiveLayers(inst.GetPhysDev(), 2); 17905db71995Sopenharmony_ci EXPECT_TRUE(check_permutation({regular_layer_name, lunarg_meta_layer_name}, layer_props)); 17915db71995Sopenharmony_ci env.debug_log.clear(); 17925db71995Sopenharmony_ci } 17935db71995Sopenharmony_ci 17945db71995Sopenharmony_ci env.platform_shim->set_elevated_privilege(true); 17955db71995Sopenharmony_ci 17965db71995Sopenharmony_ci { // try with elevated privileges 17975db71995Sopenharmony_ci auto layer_props = env.GetLayerProperties(2); 17985db71995Sopenharmony_ci EXPECT_TRUE(check_permutation({regular_layer_name, lunarg_meta_layer_name}, layer_props)); 17995db71995Sopenharmony_ci 18005db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 18015db71995Sopenharmony_ci inst.create_info.set_api_version(1, 1, 0); 18025db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst.create_info, env.debug_log); 18035db71995Sopenharmony_ci inst.CheckCreate(); 18045db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find(std::string("Insert instance layer \"") + regular_layer_name)); 18055db71995Sopenharmony_ci auto active_layer_props = inst.GetActiveLayers(inst.GetPhysDev(), 2); 18065db71995Sopenharmony_ci EXPECT_TRUE(check_permutation({regular_layer_name, lunarg_meta_layer_name}, active_layer_props)); 18075db71995Sopenharmony_ci } 18085db71995Sopenharmony_ci} 18095db71995Sopenharmony_ci 18105db71995Sopenharmony_ci// Override layer should not be found and thus not loaded when running with elevated privileges 18115db71995Sopenharmony_ciTEST(OverrideMetaLayer, RunningWithElevatedPrivilegesFromUnsecureLocation) { 18125db71995Sopenharmony_ci FrameworkEnvironment env; 18135db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA)).add_physical_device({}); 18145db71995Sopenharmony_ci 18155db71995Sopenharmony_ci fs::FolderManager override_layer_folder{FRAMEWORK_BUILD_DIRECTORY, "override_layer_folder"}; 18165db71995Sopenharmony_ci 18175db71995Sopenharmony_ci const char* regular_layer_name = "VK_LAYER_TestLayer_1"; 18185db71995Sopenharmony_ci override_layer_folder.write_manifest("regular_test_layer.json", 18195db71995Sopenharmony_ci ManifestLayer{} 18205db71995Sopenharmony_ci .add_layer(ManifestLayer::LayerDescription{} 18215db71995Sopenharmony_ci .set_name(regular_layer_name) 18225db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) 18235db71995Sopenharmony_ci .set_api_version(VK_MAKE_API_VERSION(0, 1, 1, 0))) 18245db71995Sopenharmony_ci .get_manifest_str()); 18255db71995Sopenharmony_ci env.add_implicit_layer(TestLayerDetails{ManifestLayer{}.set_file_format_version({1, 2, 0}).add_layer( 18265db71995Sopenharmony_ci ManifestLayer::LayerDescription{} 18275db71995Sopenharmony_ci .set_name(lunarg_meta_layer_name) 18285db71995Sopenharmony_ci .set_api_version(VK_MAKE_API_VERSION(0, 1, 1, 0)) 18295db71995Sopenharmony_ci .add_component_layer(regular_layer_name) 18305db71995Sopenharmony_ci .set_disable_environment("DisableMeIfYouCan") 18315db71995Sopenharmony_ci .add_override_path(fs::make_native(override_layer_folder.location().str()))), 18325db71995Sopenharmony_ci "meta_test_layer.json"} 18335db71995Sopenharmony_ci .set_discovery_type(ManifestDiscoveryType::unsecured_generic)); 18345db71995Sopenharmony_ci 18355db71995Sopenharmony_ci { // try with no elevated privileges 18365db71995Sopenharmony_ci auto layer_props = env.GetLayerProperties(2); 18375db71995Sopenharmony_ci EXPECT_TRUE(check_permutation({regular_layer_name, lunarg_meta_layer_name}, layer_props)); 18385db71995Sopenharmony_ci 18395db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 18405db71995Sopenharmony_ci inst.create_info.set_api_version(1, 1, 0); 18415db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst.create_info, env.debug_log); 18425db71995Sopenharmony_ci inst.CheckCreate(); 18435db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find(std::string("Insert instance layer \"") + regular_layer_name)); 18445db71995Sopenharmony_ci env.debug_log.clear(); 18455db71995Sopenharmony_ci auto active_layer_props = inst.GetActiveLayers(inst.GetPhysDev(), 2); 18465db71995Sopenharmony_ci EXPECT_TRUE(check_permutation({regular_layer_name, lunarg_meta_layer_name}, active_layer_props)); 18475db71995Sopenharmony_ci } 18485db71995Sopenharmony_ci 18495db71995Sopenharmony_ci env.platform_shim->set_elevated_privilege(true); 18505db71995Sopenharmony_ci 18515db71995Sopenharmony_ci { // try with no elevated privileges 18525db71995Sopenharmony_ci ASSERT_NO_FATAL_FAILURE(env.GetLayerProperties(0)); 18535db71995Sopenharmony_ci 18545db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 18555db71995Sopenharmony_ci inst.create_info.set_api_version(1, 1, 0); 18565db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst.create_info, env.debug_log); 18575db71995Sopenharmony_ci inst.CheckCreate(); 18585db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find(std::string("Insert instance layer \"") + regular_layer_name)); 18595db71995Sopenharmony_ci ASSERT_NO_FATAL_FAILURE(inst.GetActiveLayers(inst.GetPhysDev(), 0)); 18605db71995Sopenharmony_ci } 18615db71995Sopenharmony_ci} 18625db71995Sopenharmony_ci 18635db71995Sopenharmony_ci// Makes sure explicit layers can't override pre-instance functions even if enabled by the override layer 18645db71995Sopenharmony_ciTEST(ExplicitLayers, OverridePreInstanceFunctions) { 18655db71995Sopenharmony_ci FrameworkEnvironment env; 18665db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA)).add_physical_device({}); 18675db71995Sopenharmony_ci const char* explicit_layer_name = "VK_LAYER_enabled_by_override"; 18685db71995Sopenharmony_ci const char* disable_env_var = "DISABLE_ME"; 18695db71995Sopenharmony_ci 18705db71995Sopenharmony_ci env.add_explicit_layer( 18715db71995Sopenharmony_ci ManifestLayer{}.set_file_format_version({1, 1, 2}).add_layer( 18725db71995Sopenharmony_ci ManifestLayer::LayerDescription{} 18735db71995Sopenharmony_ci .set_name(explicit_layer_name) 18745db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) 18755db71995Sopenharmony_ci .add_pre_instance_function(ManifestLayer::LayerDescription::FunctionOverride{} 18765db71995Sopenharmony_ci .set_vk_func("vkEnumerateInstanceLayerProperties") 18775db71995Sopenharmony_ci .set_override_name("test_preinst_vkEnumerateInstanceLayerProperties")) 18785db71995Sopenharmony_ci .add_pre_instance_function(ManifestLayer::LayerDescription::FunctionOverride{} 18795db71995Sopenharmony_ci .set_vk_func("vkEnumerateInstanceExtensionProperties") 18805db71995Sopenharmony_ci .set_override_name("test_preinst_vkEnumerateInstanceExtensionProperties")) 18815db71995Sopenharmony_ci .add_pre_instance_function(ManifestLayer::LayerDescription::FunctionOverride{} 18825db71995Sopenharmony_ci .set_vk_func("vkEnumerateInstanceVersion") 18835db71995Sopenharmony_ci .set_override_name("test_preinst_vkEnumerateInstanceVersion"))), 18845db71995Sopenharmony_ci "explicit_test_layer.json"); 18855db71995Sopenharmony_ci 18865db71995Sopenharmony_ci auto& layer = env.get_test_layer(0); 18875db71995Sopenharmony_ci layer.set_reported_layer_props(34); 18885db71995Sopenharmony_ci layer.set_reported_extension_props(22); 18895db71995Sopenharmony_ci layer.set_reported_instance_version(VK_MAKE_API_VERSION(1, 0, 0, 1)); 18905db71995Sopenharmony_ci 18915db71995Sopenharmony_ci env.add_implicit_layer( 18925db71995Sopenharmony_ci ManifestLayer{}.set_file_format_version({1, 1, 2}).add_layer(ManifestLayer::LayerDescription{} 18935db71995Sopenharmony_ci .set_name(lunarg_meta_layer_name) 18945db71995Sopenharmony_ci .add_component_layers({explicit_layer_name}) 18955db71995Sopenharmony_ci .set_disable_environment(disable_env_var)), 18965db71995Sopenharmony_ci "override_meta_layer.json"); 18975db71995Sopenharmony_ci 18985db71995Sopenharmony_ci uint32_t count = 0; 18995db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, env.vulkan_functions.vkEnumerateInstanceLayerProperties(&count, nullptr)); 19005db71995Sopenharmony_ci ASSERT_EQ(count, 2U); 19015db71995Sopenharmony_ci count = 0; 19025db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, env.vulkan_functions.vkEnumerateInstanceExtensionProperties(nullptr, &count, nullptr)); 19035db71995Sopenharmony_ci ASSERT_EQ(count, 4U); 19045db71995Sopenharmony_ci 19055db71995Sopenharmony_ci uint32_t version = 0; 19065db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, env.vulkan_functions.vkEnumerateInstanceVersion(&version)); 19075db71995Sopenharmony_ci ASSERT_EQ(version, VK_HEADER_VERSION_COMPLETE); 19085db71995Sopenharmony_ci 19095db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 19105db71995Sopenharmony_ci inst.CheckCreate(); 19115db71995Sopenharmony_ci 19125db71995Sopenharmony_ci auto layers = inst.GetActiveLayers(inst.GetPhysDev(), 2); 19135db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layers.at(0).layerName, explicit_layer_name)); 19145db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layers.at(1).layerName, lunarg_meta_layer_name)); 19155db71995Sopenharmony_ci} 19165db71995Sopenharmony_ci 19175db71995Sopenharmony_ciTEST(ExplicitLayers, LayerSettingsPreInstanceFunctions) { 19185db71995Sopenharmony_ci FrameworkEnvironment env; 19195db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA)).add_physical_device({}); 19205db71995Sopenharmony_ci const char* explicit_layer_name = "VK_LAYER_enabled_by_override"; 19215db71995Sopenharmony_ci 19225db71995Sopenharmony_ci env.add_explicit_layer( 19235db71995Sopenharmony_ci ManifestLayer{}.set_file_format_version({1, 1, 2}).add_layer( 19245db71995Sopenharmony_ci ManifestLayer::LayerDescription{} 19255db71995Sopenharmony_ci .set_name(explicit_layer_name) 19265db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) 19275db71995Sopenharmony_ci .add_pre_instance_function(ManifestLayer::LayerDescription::FunctionOverride{} 19285db71995Sopenharmony_ci .set_vk_func("vkEnumerateInstanceLayerProperties") 19295db71995Sopenharmony_ci .set_override_name("test_preinst_vkEnumerateInstanceLayerProperties")) 19305db71995Sopenharmony_ci .add_pre_instance_function(ManifestLayer::LayerDescription::FunctionOverride{} 19315db71995Sopenharmony_ci .set_vk_func("vkEnumerateInstanceExtensionProperties") 19325db71995Sopenharmony_ci .set_override_name("test_preinst_vkEnumerateInstanceExtensionProperties")) 19335db71995Sopenharmony_ci .add_pre_instance_function(ManifestLayer::LayerDescription::FunctionOverride{} 19345db71995Sopenharmony_ci .set_vk_func("vkEnumerateInstanceVersion") 19355db71995Sopenharmony_ci .set_override_name("test_preinst_vkEnumerateInstanceVersion"))), 19365db71995Sopenharmony_ci "explicit_test_layer.json"); 19375db71995Sopenharmony_ci 19385db71995Sopenharmony_ci env.loader_settings.add_app_specific_setting(AppSpecificSettings{}.add_stderr_log_filter("all").add_layer_configuration( 19395db71995Sopenharmony_ci LoaderSettingsLayerConfiguration{} 19405db71995Sopenharmony_ci .set_name(explicit_layer_name) 19415db71995Sopenharmony_ci .set_control("on") 19425db71995Sopenharmony_ci .set_path(env.get_shimmed_layer_manifest_path(0).str()) 19435db71995Sopenharmony_ci .set_treat_as_implicit_manifest(false))); 19445db71995Sopenharmony_ci env.update_loader_settings(env.loader_settings); 19455db71995Sopenharmony_ci 19465db71995Sopenharmony_ci auto& layer = env.get_test_layer(0); 19475db71995Sopenharmony_ci layer.set_reported_layer_props(34); 19485db71995Sopenharmony_ci layer.set_reported_extension_props(22); 19495db71995Sopenharmony_ci layer.set_reported_instance_version(VK_MAKE_API_VERSION(1, 0, 0, 1)); 19505db71995Sopenharmony_ci 19515db71995Sopenharmony_ci uint32_t count = 0; 19525db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, env.vulkan_functions.vkEnumerateInstanceLayerProperties(&count, nullptr)); 19535db71995Sopenharmony_ci ASSERT_EQ(count, 1U); 19545db71995Sopenharmony_ci count = 0; 19555db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, env.vulkan_functions.vkEnumerateInstanceExtensionProperties(nullptr, &count, nullptr)); 19565db71995Sopenharmony_ci ASSERT_EQ(count, 4U); 19575db71995Sopenharmony_ci 19585db71995Sopenharmony_ci uint32_t version = 0; 19595db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, env.vulkan_functions.vkEnumerateInstanceVersion(&version)); 19605db71995Sopenharmony_ci ASSERT_EQ(version, VK_HEADER_VERSION_COMPLETE); 19615db71995Sopenharmony_ci 19625db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 19635db71995Sopenharmony_ci inst.CheckCreate(); 19645db71995Sopenharmony_ci 19655db71995Sopenharmony_ci auto layers = inst.GetActiveLayers(inst.GetPhysDev(), 1); 19665db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layers.at(0).layerName, explicit_layer_name)); 19675db71995Sopenharmony_ci} 19685db71995Sopenharmony_ci 19695db71995Sopenharmony_ciTEST(ExplicitLayers, ContainsPreInstanceFunctions) { 19705db71995Sopenharmony_ci FrameworkEnvironment env; 19715db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA)).add_physical_device({}); 19725db71995Sopenharmony_ci const char* explicit_layer_name = "VK_LAYER_enabled_by_override"; 19735db71995Sopenharmony_ci 19745db71995Sopenharmony_ci env.add_explicit_layer( 19755db71995Sopenharmony_ci ManifestLayer{}.set_file_format_version({1, 1, 2}).add_layer( 19765db71995Sopenharmony_ci ManifestLayer::LayerDescription{} 19775db71995Sopenharmony_ci .set_name(explicit_layer_name) 19785db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) 19795db71995Sopenharmony_ci .add_pre_instance_function(ManifestLayer::LayerDescription::FunctionOverride{} 19805db71995Sopenharmony_ci .set_vk_func("vkEnumerateInstanceLayerProperties") 19815db71995Sopenharmony_ci .set_override_name("test_preinst_vkEnumerateInstanceLayerProperties")) 19825db71995Sopenharmony_ci .add_pre_instance_function(ManifestLayer::LayerDescription::FunctionOverride{} 19835db71995Sopenharmony_ci .set_vk_func("vkEnumerateInstanceExtensionProperties") 19845db71995Sopenharmony_ci .set_override_name("test_preinst_vkEnumerateInstanceExtensionProperties")) 19855db71995Sopenharmony_ci .add_pre_instance_function(ManifestLayer::LayerDescription::FunctionOverride{} 19865db71995Sopenharmony_ci .set_vk_func("vkEnumerateInstanceVersion") 19875db71995Sopenharmony_ci .set_override_name("test_preinst_vkEnumerateInstanceVersion"))), 19885db71995Sopenharmony_ci "explicit_test_layer.json"); 19895db71995Sopenharmony_ci 19905db71995Sopenharmony_ci auto& layer = env.get_test_layer(0); 19915db71995Sopenharmony_ci layer.set_reported_layer_props(34); 19925db71995Sopenharmony_ci layer.set_reported_extension_props(22); 19935db71995Sopenharmony_ci layer.set_reported_instance_version(VK_MAKE_API_VERSION(1, 0, 0, 1)); 19945db71995Sopenharmony_ci 19955db71995Sopenharmony_ci uint32_t count = 0; 19965db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, env.vulkan_functions.vkEnumerateInstanceLayerProperties(&count, nullptr)); 19975db71995Sopenharmony_ci ASSERT_EQ(count, 1U); 19985db71995Sopenharmony_ci count = 0; 19995db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, env.vulkan_functions.vkEnumerateInstanceExtensionProperties(nullptr, &count, nullptr)); 20005db71995Sopenharmony_ci ASSERT_EQ(count, 4U); 20015db71995Sopenharmony_ci 20025db71995Sopenharmony_ci uint32_t version = 0; 20035db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, env.vulkan_functions.vkEnumerateInstanceVersion(&version)); 20045db71995Sopenharmony_ci ASSERT_EQ(version, VK_HEADER_VERSION_COMPLETE); 20055db71995Sopenharmony_ci 20065db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 20075db71995Sopenharmony_ci inst.create_info.add_layer(explicit_layer_name); 20085db71995Sopenharmony_ci inst.CheckCreate(); 20095db71995Sopenharmony_ci 20105db71995Sopenharmony_ci auto layers = inst.GetActiveLayers(inst.GetPhysDev(), 1); 20115db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layers.at(0).layerName, explicit_layer_name)); 20125db71995Sopenharmony_ci} 20135db71995Sopenharmony_ci 20145db71995Sopenharmony_ci// This test makes sure that any layer calling GetPhysicalDeviceProperties2 inside of CreateInstance 20155db71995Sopenharmony_ci// succeeds and doesn't crash. 20165db71995Sopenharmony_ciTEST(LayerCreateInstance, GetPhysicalDeviceProperties2) { 20175db71995Sopenharmony_ci FrameworkEnvironment env; 20185db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA)) 20195db71995Sopenharmony_ci .add_physical_device({}) 20205db71995Sopenharmony_ci .set_icd_api_version(VK_API_VERSION_1_1); 20215db71995Sopenharmony_ci 20225db71995Sopenharmony_ci const char* regular_layer_name = "VK_LAYER_TestLayer"; 20235db71995Sopenharmony_ci env.add_explicit_layer( 20245db71995Sopenharmony_ci ManifestLayer{}.set_file_format_version({1, 1, 2}).add_layer( 20255db71995Sopenharmony_ci ManifestLayer::LayerDescription{}.set_name(regular_layer_name).set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)), 20265db71995Sopenharmony_ci "regular_test_layer.json"); 20275db71995Sopenharmony_ci 20285db71995Sopenharmony_ci auto& layer_handle = env.get_test_layer(0); 20295db71995Sopenharmony_ci layer_handle.set_create_instance_callback([](TestLayer& layer) -> VkResult { 20305db71995Sopenharmony_ci uint32_t phys_dev_count = 0; 20315db71995Sopenharmony_ci VkResult res = layer.instance_dispatch_table.EnumeratePhysicalDevices(layer.instance_handle, &phys_dev_count, nullptr); 20325db71995Sopenharmony_ci if (res != VK_SUCCESS || phys_dev_count > 1) { 20335db71995Sopenharmony_ci return VK_ERROR_INITIALIZATION_FAILED; // expecting only a single physical device. 20345db71995Sopenharmony_ci } 20355db71995Sopenharmony_ci VkPhysicalDevice phys_dev{}; 20365db71995Sopenharmony_ci res = layer.instance_dispatch_table.EnumeratePhysicalDevices(layer.instance_handle, &phys_dev_count, &phys_dev); 20375db71995Sopenharmony_ci if (res != VK_SUCCESS) { 20385db71995Sopenharmony_ci return VK_ERROR_INITIALIZATION_FAILED; 20395db71995Sopenharmony_ci } 20405db71995Sopenharmony_ci VkPhysicalDeviceProperties2 props2{}; 20415db71995Sopenharmony_ci props2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2; 20425db71995Sopenharmony_ci layer.instance_dispatch_table.GetPhysicalDeviceProperties2(phys_dev, &props2); 20435db71995Sopenharmony_ci 20445db71995Sopenharmony_ci VkPhysicalDeviceFeatures2 features2{}; 20455db71995Sopenharmony_ci features2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2; 20465db71995Sopenharmony_ci layer.instance_dispatch_table.GetPhysicalDeviceFeatures2(phys_dev, &features2); 20475db71995Sopenharmony_ci return VK_SUCCESS; 20485db71995Sopenharmony_ci }); 20495db71995Sopenharmony_ci 20505db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 20515db71995Sopenharmony_ci inst.create_info.add_layer(regular_layer_name).set_api_version(1, 1, 0); 20525db71995Sopenharmony_ci inst.CheckCreate(); 20535db71995Sopenharmony_ci} 20545db71995Sopenharmony_ci 20555db71995Sopenharmony_ciTEST(LayerCreateInstance, GetPhysicalDeviceProperties2KHR) { 20565db71995Sopenharmony_ci FrameworkEnvironment env; 20575db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA)) 20585db71995Sopenharmony_ci .add_physical_device({}) 20595db71995Sopenharmony_ci .add_instance_extension({"VK_KHR_get_physical_device_properties2", 0}); 20605db71995Sopenharmony_ci 20615db71995Sopenharmony_ci const char* regular_layer_name = "VK_LAYER_TestLayer"; 20625db71995Sopenharmony_ci env.add_explicit_layer( 20635db71995Sopenharmony_ci ManifestLayer{}.add_layer( 20645db71995Sopenharmony_ci ManifestLayer::LayerDescription{}.set_name(regular_layer_name).set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)), 20655db71995Sopenharmony_ci "regular_test_layer.json"); 20665db71995Sopenharmony_ci 20675db71995Sopenharmony_ci auto& layer_handle = env.get_test_layer(0); 20685db71995Sopenharmony_ci layer_handle.set_create_instance_callback([](TestLayer& layer) -> VkResult { 20695db71995Sopenharmony_ci uint32_t phys_dev_count = 1; 20705db71995Sopenharmony_ci VkPhysicalDevice phys_dev{}; 20715db71995Sopenharmony_ci layer.instance_dispatch_table.EnumeratePhysicalDevices(layer.instance_handle, &phys_dev_count, &phys_dev); 20725db71995Sopenharmony_ci 20735db71995Sopenharmony_ci VkPhysicalDeviceProperties2KHR props2{}; 20745db71995Sopenharmony_ci props2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR; 20755db71995Sopenharmony_ci layer.instance_dispatch_table.GetPhysicalDeviceProperties2KHR(phys_dev, &props2); 20765db71995Sopenharmony_ci 20775db71995Sopenharmony_ci VkPhysicalDeviceFeatures2KHR features2{}; 20785db71995Sopenharmony_ci features2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR; 20795db71995Sopenharmony_ci layer.instance_dispatch_table.GetPhysicalDeviceFeatures2KHR(phys_dev, &features2); 20805db71995Sopenharmony_ci return VK_SUCCESS; 20815db71995Sopenharmony_ci }); 20825db71995Sopenharmony_ci 20835db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 20845db71995Sopenharmony_ci inst.create_info.add_layer(regular_layer_name).add_extension("VK_KHR_get_physical_device_properties2"); 20855db71995Sopenharmony_ci inst.CheckCreate(); 20865db71995Sopenharmony_ci} 20875db71995Sopenharmony_ci 20885db71995Sopenharmony_ciTEST(ExplicitLayers, MultipleLayersInSingleManifest) { 20895db71995Sopenharmony_ci FrameworkEnvironment env; 20905db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA)).add_physical_device({}); 20915db71995Sopenharmony_ci 20925db71995Sopenharmony_ci // verify layer loads successfully when setting VK_LAYER_PATH to a full filepath 20935db71995Sopenharmony_ci const char* regular_layer_name_1 = "VK_LAYER_RegularLayer1"; 20945db71995Sopenharmony_ci const char* regular_layer_name_2 = "VK_LAYER_RegularLayer2"; 20955db71995Sopenharmony_ci const char* regular_layer_name_3 = "VK_LAYER_RegularLayer3"; 20965db71995Sopenharmony_ci env.add_explicit_layer(TestLayerDetails( 20975db71995Sopenharmony_ci ManifestLayer{} 20985db71995Sopenharmony_ci .set_file_format_version({1, 0, 1}) 20995db71995Sopenharmony_ci .add_layer( 21005db71995Sopenharmony_ci ManifestLayer::LayerDescription{}.set_name(regular_layer_name_1).set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)) 21015db71995Sopenharmony_ci .add_layer( 21025db71995Sopenharmony_ci ManifestLayer::LayerDescription{}.set_name(regular_layer_name_2).set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)) 21035db71995Sopenharmony_ci .add_layer( 21045db71995Sopenharmony_ci ManifestLayer::LayerDescription{}.set_name(regular_layer_name_3).set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)), 21055db71995Sopenharmony_ci "multi_layer_manifest.json")); 21065db71995Sopenharmony_ci 21075db71995Sopenharmony_ci auto layer_props = env.GetLayerProperties(3); 21085db71995Sopenharmony_ci ASSERT_TRUE(string_eq(regular_layer_name_1, layer_props[0].layerName)); 21095db71995Sopenharmony_ci ASSERT_TRUE(string_eq(regular_layer_name_2, layer_props[1].layerName)); 21105db71995Sopenharmony_ci ASSERT_TRUE(string_eq(regular_layer_name_3, layer_props[2].layerName)); 21115db71995Sopenharmony_ci} 21125db71995Sopenharmony_ci 21135db71995Sopenharmony_ciTEST(ExplicitLayers, WrapObjects) { 21145db71995Sopenharmony_ci FrameworkEnvironment env; 21155db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA)).add_physical_device("physical_device_0"); 21165db71995Sopenharmony_ci 21175db71995Sopenharmony_ci const char* wrap_objects_name = "VK_LAYER_LUNARG_wrap_objects"; 21185db71995Sopenharmony_ci env.add_explicit_layer(ManifestLayer{}.add_layer( 21195db71995Sopenharmony_ci ManifestLayer::LayerDescription{}.set_name(wrap_objects_name).set_lib_path(TEST_LAYER_WRAP_OBJECTS)), 21205db71995Sopenharmony_ci "wrap_objects_layer.json"); 21215db71995Sopenharmony_ci 21225db71995Sopenharmony_ci const char* regular_layer_name_1 = "VK_LAYER_RegularLayer1"; 21235db71995Sopenharmony_ci env.add_explicit_layer( 21245db71995Sopenharmony_ci ManifestLayer{}.add_layer( 21255db71995Sopenharmony_ci ManifestLayer::LayerDescription{}.set_name(regular_layer_name_1).set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)), 21265db71995Sopenharmony_ci "regular_layer_1.json"); 21275db71995Sopenharmony_ci 21285db71995Sopenharmony_ci const char* regular_layer_name_2 = "VK_LAYER_RegularLayer2"; 21295db71995Sopenharmony_ci env.add_explicit_layer( 21305db71995Sopenharmony_ci ManifestLayer{}.add_layer( 21315db71995Sopenharmony_ci ManifestLayer::LayerDescription{}.set_name(regular_layer_name_2).set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)), 21325db71995Sopenharmony_ci "regular_layer_2.json"); 21335db71995Sopenharmony_ci 21345db71995Sopenharmony_ci { // just the wrap layer 21355db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 21365db71995Sopenharmony_ci inst.create_info.add_layer(wrap_objects_name); 21375db71995Sopenharmony_ci inst.CheckCreate(); 21385db71995Sopenharmony_ci VkPhysicalDevice phys_dev = inst.GetPhysDev(); 21395db71995Sopenharmony_ci 21405db71995Sopenharmony_ci DeviceWrapper dev{inst}; 21415db71995Sopenharmony_ci dev.CheckCreate(phys_dev); 21425db71995Sopenharmony_ci } 21435db71995Sopenharmony_ci { // wrap layer first 21445db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 21455db71995Sopenharmony_ci inst.create_info.add_layer(wrap_objects_name).add_layer(regular_layer_name_1); 21465db71995Sopenharmony_ci inst.CheckCreate(); 21475db71995Sopenharmony_ci VkPhysicalDevice phys_dev = inst.GetPhysDev(); 21485db71995Sopenharmony_ci 21495db71995Sopenharmony_ci DeviceWrapper dev{inst}; 21505db71995Sopenharmony_ci dev.CheckCreate(phys_dev); 21515db71995Sopenharmony_ci } 21525db71995Sopenharmony_ci { // wrap layer last 21535db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 21545db71995Sopenharmony_ci inst.create_info.add_layer(regular_layer_name_1).add_layer(wrap_objects_name); 21555db71995Sopenharmony_ci inst.CheckCreate(); 21565db71995Sopenharmony_ci VkPhysicalDevice phys_dev = inst.GetPhysDev(); 21575db71995Sopenharmony_ci 21585db71995Sopenharmony_ci DeviceWrapper dev{inst}; 21595db71995Sopenharmony_ci dev.CheckCreate(phys_dev); 21605db71995Sopenharmony_ci } 21615db71995Sopenharmony_ci { // wrap layer last 21625db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 21635db71995Sopenharmony_ci inst.create_info.add_layer(regular_layer_name_1).add_layer(wrap_objects_name).add_layer(regular_layer_name_2); 21645db71995Sopenharmony_ci inst.CheckCreate(); 21655db71995Sopenharmony_ci VkPhysicalDevice phys_dev = inst.GetPhysDev(); 21665db71995Sopenharmony_ci 21675db71995Sopenharmony_ci DeviceWrapper dev{inst}; 21685db71995Sopenharmony_ci dev.CheckCreate(phys_dev); 21695db71995Sopenharmony_ci } 21705db71995Sopenharmony_ci} 21715db71995Sopenharmony_ci 21725db71995Sopenharmony_ciTEST(ExplicitLayers, VkLayerPathEnvVar) { 21735db71995Sopenharmony_ci FrameworkEnvironment env; 21745db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA)).add_physical_device({}); 21755db71995Sopenharmony_ci 21765db71995Sopenharmony_ci { 21775db71995Sopenharmony_ci // verify layer loads successfully when setting VK_LAYER_PATH to a full filepath 21785db71995Sopenharmony_ci const char* regular_layer_name_1 = "VK_LAYER_RegularLayer1"; 21795db71995Sopenharmony_ci env.add_explicit_layer(TestLayerDetails(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} 21805db71995Sopenharmony_ci .set_name(regular_layer_name_1) 21815db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)), 21825db71995Sopenharmony_ci "regular_layer_1.json") 21835db71995Sopenharmony_ci .set_discovery_type(ManifestDiscoveryType::env_var) 21845db71995Sopenharmony_ci .set_is_dir(false)); 21855db71995Sopenharmony_ci 21865db71995Sopenharmony_ci InstWrapper inst(env.vulkan_functions); 21875db71995Sopenharmony_ci inst.create_info.add_layer(regular_layer_name_1); 21885db71995Sopenharmony_ci inst.CheckCreate(VK_SUCCESS); 21895db71995Sopenharmony_ci auto layer_props = inst.GetActiveLayers(inst.GetPhysDev(), 1); 21905db71995Sopenharmony_ci EXPECT_TRUE(string_eq(layer_props.at(0).layerName, regular_layer_name_1)); 21915db71995Sopenharmony_ci } 21925db71995Sopenharmony_ci { 21935db71995Sopenharmony_ci // verify layers load successfully when setting VK_LAYER_PATH to multiple full filepaths 21945db71995Sopenharmony_ci const char* regular_layer_name_1 = "VK_LAYER_RegularLayer1"; 21955db71995Sopenharmony_ci env.add_explicit_layer(TestLayerDetails(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} 21965db71995Sopenharmony_ci .set_name(regular_layer_name_1) 21975db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)), 21985db71995Sopenharmony_ci "regular_layer_1.json") 21995db71995Sopenharmony_ci .set_discovery_type(ManifestDiscoveryType::env_var) 22005db71995Sopenharmony_ci .set_is_dir(false)); 22015db71995Sopenharmony_ci 22025db71995Sopenharmony_ci const char* regular_layer_name_2 = "VK_LAYER_RegularLayer2"; 22035db71995Sopenharmony_ci env.add_explicit_layer(TestLayerDetails(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} 22045db71995Sopenharmony_ci .set_name(regular_layer_name_2) 22055db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)), 22065db71995Sopenharmony_ci "regular_layer_2.json") 22075db71995Sopenharmony_ci .set_discovery_type(ManifestDiscoveryType::env_var) 22085db71995Sopenharmony_ci .set_is_dir(false)); 22095db71995Sopenharmony_ci 22105db71995Sopenharmony_ci InstWrapper inst(env.vulkan_functions); 22115db71995Sopenharmony_ci inst.create_info.add_layer(regular_layer_name_1); 22125db71995Sopenharmony_ci inst.create_info.add_layer(regular_layer_name_2); 22135db71995Sopenharmony_ci inst.CheckCreate(VK_SUCCESS); 22145db71995Sopenharmony_ci auto layer_props = inst.GetActiveLayers(inst.GetPhysDev(), 2); 22155db71995Sopenharmony_ci EXPECT_TRUE(check_permutation({regular_layer_name_1, regular_layer_name_2}, layer_props)); 22165db71995Sopenharmony_ci } 22175db71995Sopenharmony_ci { 22185db71995Sopenharmony_ci // verify layers load successfully when setting VK_LAYER_PATH to a directory 22195db71995Sopenharmony_ci const char* regular_layer_name_1 = "VK_LAYER_RegularLayer1"; 22205db71995Sopenharmony_ci env.add_explicit_layer(TestLayerDetails(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} 22215db71995Sopenharmony_ci .set_name(regular_layer_name_1) 22225db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)), 22235db71995Sopenharmony_ci "regular_layer_1.json") 22245db71995Sopenharmony_ci .set_discovery_type(ManifestDiscoveryType::env_var)); 22255db71995Sopenharmony_ci 22265db71995Sopenharmony_ci const char* regular_layer_name_2 = "VK_LAYER_RegularLayer2"; 22275db71995Sopenharmony_ci env.add_explicit_layer(TestLayerDetails(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} 22285db71995Sopenharmony_ci .set_name(regular_layer_name_2) 22295db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)), 22305db71995Sopenharmony_ci "regular_layer_2.json") 22315db71995Sopenharmony_ci .set_discovery_type(ManifestDiscoveryType::env_var)); 22325db71995Sopenharmony_ci 22335db71995Sopenharmony_ci InstWrapper inst(env.vulkan_functions); 22345db71995Sopenharmony_ci inst.create_info.add_layer(regular_layer_name_1); 22355db71995Sopenharmony_ci inst.create_info.add_layer(regular_layer_name_2); 22365db71995Sopenharmony_ci inst.CheckCreate(VK_SUCCESS); 22375db71995Sopenharmony_ci auto layer_props = inst.GetActiveLayers(inst.GetPhysDev(), 2); 22385db71995Sopenharmony_ci EXPECT_TRUE(check_permutation({regular_layer_name_1, regular_layer_name_2}, layer_props)); 22395db71995Sopenharmony_ci } 22405db71995Sopenharmony_ci} 22415db71995Sopenharmony_ci 22425db71995Sopenharmony_ciTEST(ExplicitLayers, DuplicateLayersInVK_LAYER_PATH) { 22435db71995Sopenharmony_ci FrameworkEnvironment env; 22445db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA)).add_physical_device({}); 22455db71995Sopenharmony_ci 22465db71995Sopenharmony_ci // verify layer loads successfully when setting VK_LAYER_PATH to a full filepath 22475db71995Sopenharmony_ci const char* same_layer_name_1 = "VK_LAYER_RegularLayer1"; 22485db71995Sopenharmony_ci env.add_explicit_layer(TestLayerDetails(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} 22495db71995Sopenharmony_ci .set_name(same_layer_name_1) 22505db71995Sopenharmony_ci .set_description("actually_layer_1") 22515db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)), 22525db71995Sopenharmony_ci "regular_layer_1.json") 22535db71995Sopenharmony_ci // use override folder as just a folder and manually set the VK_LAYER_PATH env-var to it 22545db71995Sopenharmony_ci .set_discovery_type(ManifestDiscoveryType::override_folder) 22555db71995Sopenharmony_ci .set_is_dir(true)); 22565db71995Sopenharmony_ci auto& layer1 = env.get_test_layer(0); 22575db71995Sopenharmony_ci layer1.set_description("actually_layer_1"); 22585db71995Sopenharmony_ci layer1.set_make_spurious_log_in_create_instance("actually_layer_1"); 22595db71995Sopenharmony_ci env.env_var_vk_layer_paths.add_to_list(env.get_folder(ManifestLocation::override_layer).location().str()); 22605db71995Sopenharmony_ci 22615db71995Sopenharmony_ci env.add_explicit_layer(TestLayerDetails(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} 22625db71995Sopenharmony_ci .set_name(same_layer_name_1) 22635db71995Sopenharmony_ci .set_description("actually_layer_2") 22645db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)), 22655db71995Sopenharmony_ci "regular_layer_1.json") 22665db71995Sopenharmony_ci .set_discovery_type(ManifestDiscoveryType::env_var) 22675db71995Sopenharmony_ci .set_is_dir(true)); 22685db71995Sopenharmony_ci auto& layer2 = env.get_test_layer(1); 22695db71995Sopenharmony_ci layer2.set_description("actually_layer_2"); 22705db71995Sopenharmony_ci layer2.set_make_spurious_log_in_create_instance("actually_layer_2"); 22715db71995Sopenharmony_ci 22725db71995Sopenharmony_ci auto layer_props = env.GetLayerProperties(2); 22735db71995Sopenharmony_ci ASSERT_TRUE(string_eq(same_layer_name_1, layer_props[0].layerName)); 22745db71995Sopenharmony_ci ASSERT_TRUE(string_eq(same_layer_name_1, layer_props[1].layerName)); 22755db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layer1.description.c_str(), layer_props[0].description)); 22765db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layer2.description.c_str(), layer_props[1].description)); 22775db71995Sopenharmony_ci { 22785db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 22795db71995Sopenharmony_ci inst.create_info.add_layer(same_layer_name_1); 22805db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst.create_info, env.debug_log); 22815db71995Sopenharmony_ci inst.CheckCreate(); 22825db71995Sopenharmony_ci auto enabled_layer_props = inst.GetActiveLayers(inst.GetPhysDev(), 1); 22835db71995Sopenharmony_ci ASSERT_TRUE(string_eq(same_layer_name_1, enabled_layer_props.at(0).layerName)); 22845db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layer1.description.c_str(), enabled_layer_props.at(0).description)); 22855db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find("actually_layer_1")); 22865db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find("actually_layer_2")); 22875db71995Sopenharmony_ci } 22885db71995Sopenharmony_ci env.debug_log.clear(); 22895db71995Sopenharmony_ci 22905db71995Sopenharmony_ci { 22915db71995Sopenharmony_ci EnvVarWrapper layers_enable_env_var{"VK_INSTANCE_LAYERS", same_layer_name_1}; 22925db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 22935db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst.create_info, env.debug_log); 22945db71995Sopenharmony_ci inst.CheckCreate(); 22955db71995Sopenharmony_ci auto enabled_layer_props = inst.GetActiveLayers(inst.GetPhysDev(), 1); 22965db71995Sopenharmony_ci ASSERT_TRUE(string_eq(same_layer_name_1, enabled_layer_props.at(0).layerName)); 22975db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layer1.description.c_str(), enabled_layer_props.at(0).description)); 22985db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find("actually_layer_1")); 22995db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find("actually_layer_2")); 23005db71995Sopenharmony_ci } 23015db71995Sopenharmony_ci env.debug_log.clear(); 23025db71995Sopenharmony_ci 23035db71995Sopenharmony_ci { 23045db71995Sopenharmony_ci EnvVarWrapper layers_enable_env_var{"VK_LOADER_LAYERS_ENABLE", same_layer_name_1}; 23055db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 23065db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst.create_info, env.debug_log); 23075db71995Sopenharmony_ci inst.CheckCreate(); 23085db71995Sopenharmony_ci auto enabled_layer_props = inst.GetActiveLayers(inst.GetPhysDev(), 1); 23095db71995Sopenharmony_ci ASSERT_TRUE(string_eq(same_layer_name_1, enabled_layer_props.at(0).layerName)); 23105db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layer1.description.c_str(), enabled_layer_props.at(0).description)); 23115db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find("actually_layer_1")); 23125db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find("actually_layer_2")); 23135db71995Sopenharmony_ci } 23145db71995Sopenharmony_ci env.debug_log.clear(); 23155db71995Sopenharmony_ci} 23165db71995Sopenharmony_ci 23175db71995Sopenharmony_ciTEST(ExplicitLayers, DuplicateLayersInVK_ADD_LAYER_PATH) { 23185db71995Sopenharmony_ci FrameworkEnvironment env; 23195db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA)).add_physical_device({}); 23205db71995Sopenharmony_ci 23215db71995Sopenharmony_ci // verify layer loads successfully when setting VK_LAYER_PATH to a full filepath 23225db71995Sopenharmony_ci const char* same_layer_name_1 = "VK_LAYER_RegularLayer1"; 23235db71995Sopenharmony_ci env.add_explicit_layer(TestLayerDetails(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} 23245db71995Sopenharmony_ci .set_name(same_layer_name_1) 23255db71995Sopenharmony_ci .set_description("actually_layer_1") 23265db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)), 23275db71995Sopenharmony_ci "regular_layer_1.json") 23285db71995Sopenharmony_ci // use override folder as just a folder and manually set the VK_ADD_LAYER_PATH env-var to it 23295db71995Sopenharmony_ci .set_discovery_type(ManifestDiscoveryType::override_folder) 23305db71995Sopenharmony_ci .set_is_dir(true)); 23315db71995Sopenharmony_ci auto& layer1 = env.get_test_layer(0); 23325db71995Sopenharmony_ci layer1.set_description("actually_layer_1"); 23335db71995Sopenharmony_ci layer1.set_make_spurious_log_in_create_instance("actually_layer_1"); 23345db71995Sopenharmony_ci env.add_env_var_vk_layer_paths.add_to_list(env.get_folder(ManifestLocation::override_layer).location().str()); 23355db71995Sopenharmony_ci 23365db71995Sopenharmony_ci env.add_explicit_layer(TestLayerDetails(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} 23375db71995Sopenharmony_ci .set_name(same_layer_name_1) 23385db71995Sopenharmony_ci .set_description("actually_layer_2") 23395db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)), 23405db71995Sopenharmony_ci "regular_layer_1.json") 23415db71995Sopenharmony_ci .set_discovery_type(ManifestDiscoveryType::add_env_var) 23425db71995Sopenharmony_ci .set_is_dir(true)); 23435db71995Sopenharmony_ci auto& layer2 = env.get_test_layer(1); 23445db71995Sopenharmony_ci layer2.set_description("actually_layer_2"); 23455db71995Sopenharmony_ci layer2.set_make_spurious_log_in_create_instance("actually_layer_2"); 23465db71995Sopenharmony_ci 23475db71995Sopenharmony_ci auto layer_props = env.GetLayerProperties(2); 23485db71995Sopenharmony_ci ASSERT_TRUE(string_eq(same_layer_name_1, layer_props[0].layerName)); 23495db71995Sopenharmony_ci ASSERT_TRUE(string_eq(same_layer_name_1, layer_props[1].layerName)); 23505db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layer1.description.c_str(), layer_props[0].description)); 23515db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layer2.description.c_str(), layer_props[1].description)); 23525db71995Sopenharmony_ci { 23535db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 23545db71995Sopenharmony_ci inst.create_info.add_layer(same_layer_name_1); 23555db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst.create_info, env.debug_log); 23565db71995Sopenharmony_ci inst.CheckCreate(); 23575db71995Sopenharmony_ci auto enabled_layer_props = inst.GetActiveLayers(inst.GetPhysDev(), 1); 23585db71995Sopenharmony_ci ASSERT_TRUE(string_eq(same_layer_name_1, enabled_layer_props.at(0).layerName)); 23595db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layer1.description.c_str(), enabled_layer_props.at(0).description)); 23605db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find("actually_layer_1")); 23615db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find("actually_layer_2")); 23625db71995Sopenharmony_ci } 23635db71995Sopenharmony_ci env.debug_log.clear(); 23645db71995Sopenharmony_ci 23655db71995Sopenharmony_ci { 23665db71995Sopenharmony_ci EnvVarWrapper layers_enable_env_var{"VK_INSTANCE_LAYERS", same_layer_name_1}; 23675db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 23685db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst.create_info, env.debug_log); 23695db71995Sopenharmony_ci inst.CheckCreate(); 23705db71995Sopenharmony_ci auto enabled_layer_props = inst.GetActiveLayers(inst.GetPhysDev(), 1); 23715db71995Sopenharmony_ci ASSERT_TRUE(string_eq(same_layer_name_1, enabled_layer_props.at(0).layerName)); 23725db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layer1.description.c_str(), enabled_layer_props.at(0).description)); 23735db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find("actually_layer_1")); 23745db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find("actually_layer_2")); 23755db71995Sopenharmony_ci } 23765db71995Sopenharmony_ci env.debug_log.clear(); 23775db71995Sopenharmony_ci 23785db71995Sopenharmony_ci { 23795db71995Sopenharmony_ci EnvVarWrapper layers_enable_env_var{"VK_LOADER_LAYERS_ENABLE", same_layer_name_1}; 23805db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 23815db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst.create_info, env.debug_log); 23825db71995Sopenharmony_ci inst.CheckCreate(); 23835db71995Sopenharmony_ci auto enabled_layer_props = inst.GetActiveLayers(inst.GetPhysDev(), 1); 23845db71995Sopenharmony_ci ASSERT_TRUE(string_eq(same_layer_name_1, enabled_layer_props.at(0).layerName)); 23855db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layer1.description.c_str(), enabled_layer_props.at(0).description)); 23865db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find("actually_layer_1")); 23875db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find("actually_layer_2")); 23885db71995Sopenharmony_ci } 23895db71995Sopenharmony_ci env.debug_log.clear(); 23905db71995Sopenharmony_ci} 23915db71995Sopenharmony_ci 23925db71995Sopenharmony_ciTEST(ExplicitLayers, CorrectOrderOfEnvVarEnabledLayers) { 23935db71995Sopenharmony_ci FrameworkEnvironment env; 23945db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA)).add_physical_device({}); 23955db71995Sopenharmony_ci 23965db71995Sopenharmony_ci // verify layer loads successfully when setting VK_LAYER_PATH to a full filepath 23975db71995Sopenharmony_ci const char* layer_name_1 = "VK_LAYER_RegularLayer1"; 23985db71995Sopenharmony_ci env.add_explicit_layer(TestLayerDetails(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} 23995db71995Sopenharmony_ci .set_name(layer_name_1) 24005db71995Sopenharmony_ci .set_description("actually_layer_1") 24015db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)), 24025db71995Sopenharmony_ci "regular_layer_1.json") 24035db71995Sopenharmony_ci .set_discovery_type(ManifestDiscoveryType::env_var) 24045db71995Sopenharmony_ci .set_is_dir(true)); 24055db71995Sopenharmony_ci auto& layer1 = env.get_test_layer(0); 24065db71995Sopenharmony_ci layer1.set_description("actually_layer_1"); 24075db71995Sopenharmony_ci 24085db71995Sopenharmony_ci const char* layer_name_2 = "VK_LAYER_RegularLayer2"; 24095db71995Sopenharmony_ci env.add_explicit_layer(TestLayerDetails(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} 24105db71995Sopenharmony_ci .set_name(layer_name_2) 24115db71995Sopenharmony_ci .set_description("actually_layer_2") 24125db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)), 24135db71995Sopenharmony_ci "regular_layer_2.json") 24145db71995Sopenharmony_ci .set_discovery_type(ManifestDiscoveryType::env_var) 24155db71995Sopenharmony_ci .set_is_dir(true)); 24165db71995Sopenharmony_ci auto& layer2 = env.get_test_layer(1); 24175db71995Sopenharmony_ci layer2.set_description("actually_layer_2"); 24185db71995Sopenharmony_ci 24195db71995Sopenharmony_ci auto layer_props = env.GetLayerProperties(2); 24205db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layer_name_1, layer_props[0].layerName)); 24215db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layer_name_2, layer_props[1].layerName)); 24225db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layer1.description.c_str(), layer_props[0].description)); 24235db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layer2.description.c_str(), layer_props[1].description)); 24245db71995Sopenharmony_ci // 1 then 2 24255db71995Sopenharmony_ci { 24265db71995Sopenharmony_ci EnvVarWrapper inst_layers_env_var{"VK_INSTANCE_LAYERS"}; 24275db71995Sopenharmony_ci inst_layers_env_var.add_to_list(layer_name_1); 24285db71995Sopenharmony_ci inst_layers_env_var.add_to_list(layer_name_2); 24295db71995Sopenharmony_ci 24305db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 24315db71995Sopenharmony_ci inst.CheckCreate(); 24325db71995Sopenharmony_ci 24335db71995Sopenharmony_ci // Expect the env-var layer to be first 24345db71995Sopenharmony_ci auto enabled_layer_props = inst.GetActiveLayers(inst.GetPhysDev(), 2); 24355db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layer1.description.c_str(), enabled_layer_props[0].description)); 24365db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layer2.description.c_str(), enabled_layer_props[1].description)); 24375db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layer_name_1, enabled_layer_props[0].layerName)); 24385db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layer_name_2, enabled_layer_props[1].layerName)); 24395db71995Sopenharmony_ci } 24405db71995Sopenharmony_ci // 2 then 1 24415db71995Sopenharmony_ci { 24425db71995Sopenharmony_ci EnvVarWrapper inst_layers_env_var{"VK_INSTANCE_LAYERS"}; 24435db71995Sopenharmony_ci inst_layers_env_var.add_to_list(layer_name_2); 24445db71995Sopenharmony_ci inst_layers_env_var.add_to_list(layer_name_1); 24455db71995Sopenharmony_ci 24465db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 24475db71995Sopenharmony_ci inst.CheckCreate(); 24485db71995Sopenharmony_ci 24495db71995Sopenharmony_ci // Expect the env-var layer to be first 24505db71995Sopenharmony_ci auto enabled_layer_props = inst.GetActiveLayers(inst.GetPhysDev(), 2); 24515db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layer2.description.c_str(), enabled_layer_props[0].description)); 24525db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layer1.description.c_str(), enabled_layer_props[1].description)); 24535db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layer_name_2, enabled_layer_props[0].layerName)); 24545db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layer_name_1, enabled_layer_props[1].layerName)); 24555db71995Sopenharmony_ci } 24565db71995Sopenharmony_ci} 24575db71995Sopenharmony_ci 24585db71995Sopenharmony_ciTEST(ExplicitLayers, CorrectOrderOfEnvVarEnabledLayersFromSystemLocations) { 24595db71995Sopenharmony_ci FrameworkEnvironment env; 24605db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA)).add_physical_device({}); 24615db71995Sopenharmony_ci 24625db71995Sopenharmony_ci // verify layer loads successfully when setting VK_LAYER_PATH to a full filepath 24635db71995Sopenharmony_ci const char* layer_name_1 = "VK_LAYER_RegularLayer1"; 24645db71995Sopenharmony_ci env.add_explicit_layer(TestLayerDetails(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} 24655db71995Sopenharmony_ci .set_name(layer_name_1) 24665db71995Sopenharmony_ci .set_description("actually_layer_1") 24675db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)), 24685db71995Sopenharmony_ci "regular_layer_1.json")); 24695db71995Sopenharmony_ci auto& layer1 = env.get_test_layer(0); 24705db71995Sopenharmony_ci layer1.set_description("actually_layer_1"); 24715db71995Sopenharmony_ci 24725db71995Sopenharmony_ci const char* layer_name_2 = "VK_LAYER_RegularLayer2"; 24735db71995Sopenharmony_ci env.add_explicit_layer(TestLayerDetails(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} 24745db71995Sopenharmony_ci .set_name(layer_name_2) 24755db71995Sopenharmony_ci .set_description("actually_layer_2") 24765db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)), 24775db71995Sopenharmony_ci "regular_layer_2.json")); 24785db71995Sopenharmony_ci auto& layer2 = env.get_test_layer(1); 24795db71995Sopenharmony_ci layer2.set_description("actually_layer_2"); 24805db71995Sopenharmony_ci 24815db71995Sopenharmony_ci auto layer_props = env.GetLayerProperties(2); 24825db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layer_name_1, layer_props[0].layerName)); 24835db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layer_name_2, layer_props[1].layerName)); 24845db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layer1.description.c_str(), layer_props[0].description)); 24855db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layer2.description.c_str(), layer_props[1].description)); 24865db71995Sopenharmony_ci // 1 then 2 24875db71995Sopenharmony_ci { 24885db71995Sopenharmony_ci EnvVarWrapper inst_layers_env_var{"VK_INSTANCE_LAYERS"}; 24895db71995Sopenharmony_ci inst_layers_env_var.add_to_list(layer_name_1); 24905db71995Sopenharmony_ci inst_layers_env_var.add_to_list(layer_name_2); 24915db71995Sopenharmony_ci 24925db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 24935db71995Sopenharmony_ci inst.CheckCreate(); 24945db71995Sopenharmony_ci auto enabled_layer_props = inst.GetActiveLayers(inst.GetPhysDev(), 2); 24955db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layer1.description.c_str(), enabled_layer_props[0].description)); 24965db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layer2.description.c_str(), enabled_layer_props[1].description)); 24975db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layer_name_1, enabled_layer_props[0].layerName)); 24985db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layer_name_2, enabled_layer_props[1].layerName)); 24995db71995Sopenharmony_ci } 25005db71995Sopenharmony_ci // 2 then 1 25015db71995Sopenharmony_ci { 25025db71995Sopenharmony_ci EnvVarWrapper inst_layers_env_var{"VK_INSTANCE_LAYERS"}; 25035db71995Sopenharmony_ci inst_layers_env_var.add_to_list(layer_name_2); 25045db71995Sopenharmony_ci inst_layers_env_var.add_to_list(layer_name_1); 25055db71995Sopenharmony_ci 25065db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 25075db71995Sopenharmony_ci inst.CheckCreate(); 25085db71995Sopenharmony_ci 25095db71995Sopenharmony_ci // Expect the env-var layer to be first 25105db71995Sopenharmony_ci auto enabled_layer_props = inst.GetActiveLayers(inst.GetPhysDev(), 2); 25115db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layer2.description.c_str(), enabled_layer_props[0].description)); 25125db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layer1.description.c_str(), enabled_layer_props[1].description)); 25135db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layer_name_2, enabled_layer_props[0].layerName)); 25145db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layer_name_1, enabled_layer_props[1].layerName)); 25155db71995Sopenharmony_ci } 25165db71995Sopenharmony_ci} 25175db71995Sopenharmony_ci 25185db71995Sopenharmony_ciTEST(ExplicitLayers, CorrectOrderOfApplicationEnabledLayers) { 25195db71995Sopenharmony_ci FrameworkEnvironment env; 25205db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA)).add_physical_device({}); 25215db71995Sopenharmony_ci 25225db71995Sopenharmony_ci // verify layer loads successfully when setting VK_LAYER_PATH to a full filepath 25235db71995Sopenharmony_ci const char* layer_name_1 = "VK_LAYER_RegularLayer1"; 25245db71995Sopenharmony_ci env.add_explicit_layer(TestLayerDetails(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} 25255db71995Sopenharmony_ci .set_name(layer_name_1) 25265db71995Sopenharmony_ci .set_description("actually_layer_1") 25275db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)), 25285db71995Sopenharmony_ci "regular_layer_1.json")); 25295db71995Sopenharmony_ci auto& layer1 = env.get_test_layer(0); 25305db71995Sopenharmony_ci layer1.set_description("actually_layer_1"); 25315db71995Sopenharmony_ci layer1.set_make_spurious_log_in_create_instance("actually_layer_1"); 25325db71995Sopenharmony_ci 25335db71995Sopenharmony_ci const char* layer_name_2 = "VK_LAYER_RegularLayer2"; 25345db71995Sopenharmony_ci env.add_explicit_layer(TestLayerDetails(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} 25355db71995Sopenharmony_ci .set_name(layer_name_2) 25365db71995Sopenharmony_ci .set_description("actually_layer_2") 25375db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)), 25385db71995Sopenharmony_ci "regular_layer_2.json")); 25395db71995Sopenharmony_ci auto& layer2 = env.get_test_layer(1); 25405db71995Sopenharmony_ci layer2.set_description("actually_layer_2"); 25415db71995Sopenharmony_ci layer2.set_make_spurious_log_in_create_instance("actually_layer_2"); 25425db71995Sopenharmony_ci 25435db71995Sopenharmony_ci auto layer_props = env.GetLayerProperties(2); 25445db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layer_name_1, layer_props[0].layerName)); 25455db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layer_name_2, layer_props[1].layerName)); 25465db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layer1.description.c_str(), layer_props[0].description)); 25475db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layer2.description.c_str(), layer_props[1].description)); 25485db71995Sopenharmony_ci 25495db71995Sopenharmony_ci // 1 then 2 25505db71995Sopenharmony_ci { 25515db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 25525db71995Sopenharmony_ci inst.create_info.add_layer(layer_name_1); 25535db71995Sopenharmony_ci inst.create_info.add_layer(layer_name_2); 25545db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst.create_info, env.debug_log); 25555db71995Sopenharmony_ci inst.CheckCreate(); 25565db71995Sopenharmony_ci 25575db71995Sopenharmony_ci // Expect the env-var layer to be first 25585db71995Sopenharmony_ci auto enabled_layer_props = inst.GetActiveLayers(inst.GetPhysDev(), 2); 25595db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layer1.description.c_str(), enabled_layer_props[0].description)); 25605db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layer2.description.c_str(), enabled_layer_props[1].description)); 25615db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layer_name_1, enabled_layer_props[0].layerName)); 25625db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layer_name_2, enabled_layer_props[1].layerName)); 25635db71995Sopenharmony_ci } 25645db71995Sopenharmony_ci // 2 then 1 25655db71995Sopenharmony_ci { 25665db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 25675db71995Sopenharmony_ci inst.create_info.add_layer(layer_name_2); 25685db71995Sopenharmony_ci inst.create_info.add_layer(layer_name_1); 25695db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst.create_info, env.debug_log); 25705db71995Sopenharmony_ci inst.CheckCreate(); 25715db71995Sopenharmony_ci 25725db71995Sopenharmony_ci // Expect the env-var layer to be first 25735db71995Sopenharmony_ci auto enabled_layer_props = inst.GetActiveLayers(inst.GetPhysDev(), 2); 25745db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layer2.description.c_str(), enabled_layer_props[0].description)); 25755db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layer1.description.c_str(), enabled_layer_props[1].description)); 25765db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layer_name_2, enabled_layer_props[0].layerName)); 25775db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layer_name_1, enabled_layer_props[1].layerName)); 25785db71995Sopenharmony_ci } 25795db71995Sopenharmony_ci} 25805db71995Sopenharmony_ci 25815db71995Sopenharmony_ciTEST(LayerExtensions, ImplicitNoAdditionalInstanceExtension) { 25825db71995Sopenharmony_ci FrameworkEnvironment env; 25835db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA)).add_physical_device({}); 25845db71995Sopenharmony_ci 25855db71995Sopenharmony_ci const char* implicit_layer_name = "VK_LAYER_LUNARG_wrap_objects"; 25865db71995Sopenharmony_ci const char* enable_env_var = "ENABLE_ME"; 25875db71995Sopenharmony_ci const char* disable_env_var = "DISABLE_ME"; 25885db71995Sopenharmony_ci 25895db71995Sopenharmony_ci env.add_implicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} 25905db71995Sopenharmony_ci .set_name(implicit_layer_name) 25915db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_WRAP_OBJECTS) 25925db71995Sopenharmony_ci .set_disable_environment(disable_env_var) 25935db71995Sopenharmony_ci .set_enable_environment(enable_env_var)), 25945db71995Sopenharmony_ci "implicit_wrap_layer_no_ext.json"); 25955db71995Sopenharmony_ci 25965db71995Sopenharmony_ci auto layers = env.GetLayerProperties(1); 25975db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layers[0].layerName, implicit_layer_name)); 25985db71995Sopenharmony_ci 25995db71995Sopenharmony_ci // set enable env-var, layer should load 26005db71995Sopenharmony_ci EnvVarWrapper wrap_enable_env_var{enable_env_var, "1"}; 26015db71995Sopenharmony_ci CheckLogForLayerString(env, implicit_layer_name, true); 26025db71995Sopenharmony_ci 26035db71995Sopenharmony_ci auto extensions = env.GetInstanceExtensions(4); 26045db71995Sopenharmony_ci EXPECT_TRUE(string_eq(extensions.at(0).extensionName, VK_EXT_DEBUG_REPORT_EXTENSION_NAME)); 26055db71995Sopenharmony_ci EXPECT_TRUE(string_eq(extensions.at(1).extensionName, VK_EXT_DEBUG_UTILS_EXTENSION_NAME)); 26065db71995Sopenharmony_ci EXPECT_TRUE(string_eq(extensions.at(2).extensionName, VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME)); 26075db71995Sopenharmony_ci EXPECT_TRUE(string_eq(extensions.at(3).extensionName, VK_LUNARG_DIRECT_DRIVER_LOADING_EXTENSION_NAME)); 26085db71995Sopenharmony_ci 26095db71995Sopenharmony_ci // Make sure the extensions that are implemented only in the test layers is not present. 26105db71995Sopenharmony_ci ASSERT_FALSE(contains(extensions, VK_EXT_DIRECT_MODE_DISPLAY_EXTENSION_NAME)); 26115db71995Sopenharmony_ci ASSERT_FALSE(contains(extensions, VK_EXT_DISPLAY_SURFACE_COUNTER_EXTENSION_NAME)); 26125db71995Sopenharmony_ci 26135db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 26145db71995Sopenharmony_ci inst.CheckCreate(); 26155db71995Sopenharmony_ci 26165db71995Sopenharmony_ci // Make sure all the function pointers are NULL as well 26175db71995Sopenharmony_ci handle_assert_null(env.vulkan_functions.vkGetInstanceProcAddr(inst.inst, "vkReleaseDisplayEXT")); 26185db71995Sopenharmony_ci handle_assert_null(env.vulkan_functions.vkGetInstanceProcAddr(inst.inst, "vkGetPhysicalDeviceSurfaceCapabilities2EXT")); 26195db71995Sopenharmony_ci} 26205db71995Sopenharmony_ci 26215db71995Sopenharmony_ciTEST(LayerExtensions, ImplicitDirDispModeInstanceExtension) { 26225db71995Sopenharmony_ci FrameworkEnvironment env; 26235db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA)).add_physical_device({}); 26245db71995Sopenharmony_ci 26255db71995Sopenharmony_ci const char* implicit_layer_name = "VK_LAYER_LUNARG_wrap_objects"; 26265db71995Sopenharmony_ci const char* enable_env_var = "ENABLE_ME"; 26275db71995Sopenharmony_ci const char* disable_env_var = "DISABLE_ME"; 26285db71995Sopenharmony_ci 26295db71995Sopenharmony_ci env.add_implicit_layer( 26305db71995Sopenharmony_ci ManifestLayer{}.add_layer( 26315db71995Sopenharmony_ci ManifestLayer::LayerDescription{} 26325db71995Sopenharmony_ci .set_name(implicit_layer_name) 26335db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_WRAP_OBJECTS_1) 26345db71995Sopenharmony_ci .set_disable_environment(disable_env_var) 26355db71995Sopenharmony_ci .set_enable_environment(enable_env_var) 26365db71995Sopenharmony_ci .add_instance_extension({VK_EXT_DIRECT_MODE_DISPLAY_EXTENSION_NAME, 1, {"vkReleaseDisplayEXT"}})), 26375db71995Sopenharmony_ci "implicit_wrap_layer_dir_disp_mode.json"); 26385db71995Sopenharmony_ci 26395db71995Sopenharmony_ci auto layers = env.GetLayerProperties(1); 26405db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layers[0].layerName, implicit_layer_name)); 26415db71995Sopenharmony_ci 26425db71995Sopenharmony_ci // set enable env-var, layer should load 26435db71995Sopenharmony_ci EnvVarWrapper wrap_enable_env_var{enable_env_var, "1"}; 26445db71995Sopenharmony_ci CheckLogForLayerString(env, implicit_layer_name, true); 26455db71995Sopenharmony_ci 26465db71995Sopenharmony_ci auto extensions = env.GetInstanceExtensions(5); 26475db71995Sopenharmony_ci EXPECT_TRUE(string_eq(extensions.at(0).extensionName, VK_EXT_DEBUG_REPORT_EXTENSION_NAME)); 26485db71995Sopenharmony_ci EXPECT_TRUE(string_eq(extensions.at(1).extensionName, VK_EXT_DEBUG_UTILS_EXTENSION_NAME)); 26495db71995Sopenharmony_ci EXPECT_TRUE(string_eq(extensions.at(2).extensionName, VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME)); 26505db71995Sopenharmony_ci EXPECT_TRUE(string_eq(extensions.at(3).extensionName, VK_LUNARG_DIRECT_DRIVER_LOADING_EXTENSION_NAME)); 26515db71995Sopenharmony_ci EXPECT_TRUE(string_eq(extensions.at(4).extensionName, VK_EXT_DIRECT_MODE_DISPLAY_EXTENSION_NAME)); 26525db71995Sopenharmony_ci 26535db71995Sopenharmony_ci // Make sure the extensions that are implemented only in the test layers is not present. 26545db71995Sopenharmony_ci ASSERT_FALSE(contains(extensions, VK_EXT_DISPLAY_SURFACE_COUNTER_EXTENSION_NAME)); 26555db71995Sopenharmony_ci 26565db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 26575db71995Sopenharmony_ci inst.create_info.add_extension(VK_EXT_DIRECT_MODE_DISPLAY_EXTENSION_NAME); 26585db71995Sopenharmony_ci inst.CheckCreate(); 26595db71995Sopenharmony_ci 26605db71995Sopenharmony_ci // Make sure only the appropriate function pointers are NULL as well 26615db71995Sopenharmony_ci handle_assert_has_value(env.vulkan_functions.vkGetInstanceProcAddr(inst.inst, "vkReleaseDisplayEXT")); 26625db71995Sopenharmony_ci handle_assert_null(env.vulkan_functions.vkGetInstanceProcAddr(inst.inst, "vkGetPhysicalDeviceSurfaceCapabilities2EXT")); 26635db71995Sopenharmony_ci} 26645db71995Sopenharmony_ci 26655db71995Sopenharmony_ciTEST(LayerExtensions, ImplicitDispSurfCountInstanceExtension) { 26665db71995Sopenharmony_ci FrameworkEnvironment env; 26675db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA)).add_physical_device({}); 26685db71995Sopenharmony_ci 26695db71995Sopenharmony_ci const char* implicit_layer_name = "VK_LAYER_LUNARG_wrap_objects"; 26705db71995Sopenharmony_ci const char* enable_env_var = "ENABLE_ME"; 26715db71995Sopenharmony_ci const char* disable_env_var = "DISABLE_ME"; 26725db71995Sopenharmony_ci 26735db71995Sopenharmony_ci env.add_implicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} 26745db71995Sopenharmony_ci .set_name(implicit_layer_name) 26755db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_WRAP_OBJECTS_2) 26765db71995Sopenharmony_ci .set_disable_environment(disable_env_var) 26775db71995Sopenharmony_ci .set_enable_environment(enable_env_var) 26785db71995Sopenharmony_ci .add_instance_extension({VK_EXT_DISPLAY_SURFACE_COUNTER_EXTENSION_NAME, 26795db71995Sopenharmony_ci 1, 26805db71995Sopenharmony_ci {"vkGetPhysicalDeviceSurfaceCapabilities2EXT"}})), 26815db71995Sopenharmony_ci "implicit_wrap_layer_disp_surf_count.json"); 26825db71995Sopenharmony_ci 26835db71995Sopenharmony_ci auto layers = env.GetLayerProperties(1); 26845db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layers[0].layerName, implicit_layer_name)); 26855db71995Sopenharmony_ci 26865db71995Sopenharmony_ci // set enable env-var, layer should load 26875db71995Sopenharmony_ci EnvVarWrapper wrap_enable_env_var{enable_env_var, "1"}; 26885db71995Sopenharmony_ci CheckLogForLayerString(env, implicit_layer_name, true); 26895db71995Sopenharmony_ci 26905db71995Sopenharmony_ci auto extensions = env.GetInstanceExtensions(5); 26915db71995Sopenharmony_ci EXPECT_TRUE(string_eq(extensions.at(0).extensionName, VK_EXT_DEBUG_REPORT_EXTENSION_NAME)); 26925db71995Sopenharmony_ci EXPECT_TRUE(string_eq(extensions.at(1).extensionName, VK_EXT_DEBUG_UTILS_EXTENSION_NAME)); 26935db71995Sopenharmony_ci EXPECT_TRUE(string_eq(extensions.at(2).extensionName, VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME)); 26945db71995Sopenharmony_ci EXPECT_TRUE(string_eq(extensions.at(3).extensionName, VK_LUNARG_DIRECT_DRIVER_LOADING_EXTENSION_NAME)); 26955db71995Sopenharmony_ci EXPECT_TRUE(string_eq(extensions.at(4).extensionName, VK_EXT_DISPLAY_SURFACE_COUNTER_EXTENSION_NAME)); 26965db71995Sopenharmony_ci 26975db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 26985db71995Sopenharmony_ci inst.create_info.add_extension(VK_EXT_DISPLAY_SURFACE_COUNTER_EXTENSION_NAME); 26995db71995Sopenharmony_ci inst.CheckCreate(); 27005db71995Sopenharmony_ci 27015db71995Sopenharmony_ci // Make sure only the appropriate function pointers are NULL as well 27025db71995Sopenharmony_ci handle_assert_null(env.vulkan_functions.vkGetInstanceProcAddr(inst.inst, "vkReleaseDisplayEXT")); 27035db71995Sopenharmony_ci handle_assert_has_value(env.vulkan_functions.vkGetInstanceProcAddr(inst.inst, "vkGetPhysicalDeviceSurfaceCapabilities2EXT")); 27045db71995Sopenharmony_ci} 27055db71995Sopenharmony_ci 27065db71995Sopenharmony_ciTEST(LayerExtensions, ImplicitBothInstanceExtensions) { 27075db71995Sopenharmony_ci FrameworkEnvironment env; 27085db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA)).add_physical_device({}); 27095db71995Sopenharmony_ci 27105db71995Sopenharmony_ci const char* implicit_layer_name = "VK_LAYER_LUNARG_wrap_objects"; 27115db71995Sopenharmony_ci const char* enable_env_var = "ENABLE_ME"; 27125db71995Sopenharmony_ci const char* disable_env_var = "DISABLE_ME"; 27135db71995Sopenharmony_ci 27145db71995Sopenharmony_ci env.add_implicit_layer( 27155db71995Sopenharmony_ci ManifestLayer{}.add_layer( 27165db71995Sopenharmony_ci ManifestLayer::LayerDescription{} 27175db71995Sopenharmony_ci .set_name(implicit_layer_name) 27185db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_WRAP_OBJECTS_3) 27195db71995Sopenharmony_ci .set_disable_environment(disable_env_var) 27205db71995Sopenharmony_ci .set_enable_environment(enable_env_var) 27215db71995Sopenharmony_ci .add_instance_extension({VK_EXT_DIRECT_MODE_DISPLAY_EXTENSION_NAME, 1, {"vkReleaseDisplayEXT"}}) 27225db71995Sopenharmony_ci .add_instance_extension( 27235db71995Sopenharmony_ci {VK_EXT_DISPLAY_SURFACE_COUNTER_EXTENSION_NAME, 1, {"vkGetPhysicalDeviceSurfaceCapabilities2EXT"}})), 27245db71995Sopenharmony_ci "implicit_wrap_layer_both_inst.json"); 27255db71995Sopenharmony_ci 27265db71995Sopenharmony_ci auto layers = env.GetLayerProperties(1); 27275db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layers[0].layerName, implicit_layer_name)); 27285db71995Sopenharmony_ci 27295db71995Sopenharmony_ci // set enable env-var, layer should load 27305db71995Sopenharmony_ci EnvVarWrapper wrap_enable_env_var{enable_env_var, "1"}; 27315db71995Sopenharmony_ci CheckLogForLayerString(env, implicit_layer_name, true); 27325db71995Sopenharmony_ci 27335db71995Sopenharmony_ci auto extensions = env.GetInstanceExtensions(6); 27345db71995Sopenharmony_ci EXPECT_TRUE(string_eq(extensions.at(0).extensionName, VK_EXT_DEBUG_REPORT_EXTENSION_NAME)); 27355db71995Sopenharmony_ci EXPECT_TRUE(string_eq(extensions.at(1).extensionName, VK_EXT_DEBUG_UTILS_EXTENSION_NAME)); 27365db71995Sopenharmony_ci EXPECT_TRUE(string_eq(extensions.at(2).extensionName, VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME)); 27375db71995Sopenharmony_ci EXPECT_TRUE(string_eq(extensions.at(3).extensionName, VK_LUNARG_DIRECT_DRIVER_LOADING_EXTENSION_NAME)); 27385db71995Sopenharmony_ci EXPECT_TRUE(string_eq(extensions.at(4).extensionName, VK_EXT_DIRECT_MODE_DISPLAY_EXTENSION_NAME)); 27395db71995Sopenharmony_ci EXPECT_TRUE(string_eq(extensions.at(5).extensionName, VK_EXT_DISPLAY_SURFACE_COUNTER_EXTENSION_NAME)); 27405db71995Sopenharmony_ci 27415db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 27425db71995Sopenharmony_ci inst.create_info.add_extension(VK_EXT_DIRECT_MODE_DISPLAY_EXTENSION_NAME) 27435db71995Sopenharmony_ci .add_extension(VK_EXT_DISPLAY_SURFACE_COUNTER_EXTENSION_NAME); 27445db71995Sopenharmony_ci inst.CheckCreate(); 27455db71995Sopenharmony_ci 27465db71995Sopenharmony_ci // Make sure only the appropriate function pointers are NULL as well 27475db71995Sopenharmony_ci handle_assert_has_value(env.vulkan_functions.vkGetInstanceProcAddr(inst.inst, "vkReleaseDisplayEXT")); 27485db71995Sopenharmony_ci handle_assert_has_value(env.vulkan_functions.vkGetInstanceProcAddr(inst.inst, "vkGetPhysicalDeviceSurfaceCapabilities2EXT")); 27495db71995Sopenharmony_ci} 27505db71995Sopenharmony_ci 27515db71995Sopenharmony_ciTEST(LayerExtensions, ExplicitNoAdditionalInstanceExtension) { 27525db71995Sopenharmony_ci FrameworkEnvironment env; 27535db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA)).add_physical_device({}); 27545db71995Sopenharmony_ci 27555db71995Sopenharmony_ci const char* explicit_layer_name = "VK_LAYER_LUNARG_wrap_objects"; 27565db71995Sopenharmony_ci env.add_explicit_layer( 27575db71995Sopenharmony_ci ManifestLayer{}.add_layer( 27585db71995Sopenharmony_ci ManifestLayer::LayerDescription{}.set_name(explicit_layer_name).set_lib_path(TEST_LAYER_WRAP_OBJECTS)), 27595db71995Sopenharmony_ci "explicit_wrap_layer_no_ext.json"); 27605db71995Sopenharmony_ci 27615db71995Sopenharmony_ci auto layers = env.GetLayerProperties(1); 27625db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layers[0].layerName, explicit_layer_name)); 27635db71995Sopenharmony_ci 27645db71995Sopenharmony_ci auto extensions = env.GetInstanceExtensions(4); 27655db71995Sopenharmony_ci EXPECT_TRUE(string_eq(extensions.at(0).extensionName, VK_EXT_DEBUG_REPORT_EXTENSION_NAME)); 27665db71995Sopenharmony_ci EXPECT_TRUE(string_eq(extensions.at(1).extensionName, VK_EXT_DEBUG_UTILS_EXTENSION_NAME)); 27675db71995Sopenharmony_ci EXPECT_TRUE(string_eq(extensions.at(2).extensionName, VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME)); 27685db71995Sopenharmony_ci EXPECT_TRUE(string_eq(extensions.at(3).extensionName, VK_LUNARG_DIRECT_DRIVER_LOADING_EXTENSION_NAME)); 27695db71995Sopenharmony_ci 27705db71995Sopenharmony_ci // Now query by layer name. 27715db71995Sopenharmony_ci ASSERT_NO_FATAL_FAILURE(env.GetInstanceExtensions(0, explicit_layer_name)); 27725db71995Sopenharmony_ci 27735db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 27745db71995Sopenharmony_ci inst.CheckCreate(); 27755db71995Sopenharmony_ci 27765db71995Sopenharmony_ci // Make sure all the function pointers are NULL as well 27775db71995Sopenharmony_ci handle_assert_null(env.vulkan_functions.vkGetInstanceProcAddr(inst.inst, "vkReleaseDisplayEXT")); 27785db71995Sopenharmony_ci handle_assert_null(env.vulkan_functions.vkGetInstanceProcAddr(inst.inst, "vkGetPhysicalDeviceSurfaceCapabilities2EXT")); 27795db71995Sopenharmony_ci} 27805db71995Sopenharmony_ci 27815db71995Sopenharmony_ciTEST(LayerExtensions, ExplicitDirDispModeInstanceExtension) { 27825db71995Sopenharmony_ci FrameworkEnvironment env; 27835db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA)).add_physical_device({}); 27845db71995Sopenharmony_ci 27855db71995Sopenharmony_ci const char* explicit_layer_name = "VK_LAYER_LUNARG_wrap_objects"; 27865db71995Sopenharmony_ci env.add_explicit_layer( 27875db71995Sopenharmony_ci ManifestLayer{}.add_layer( 27885db71995Sopenharmony_ci ManifestLayer::LayerDescription{} 27895db71995Sopenharmony_ci .set_name(explicit_layer_name) 27905db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_WRAP_OBJECTS_1) 27915db71995Sopenharmony_ci .add_instance_extension({VK_EXT_DIRECT_MODE_DISPLAY_EXTENSION_NAME, 1, {"vkReleaseDisplayEXT"}})), 27925db71995Sopenharmony_ci "explicit_wrap_layer_dir_disp_mode.json"); 27935db71995Sopenharmony_ci 27945db71995Sopenharmony_ci auto layers = env.GetLayerProperties(1); 27955db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layers[0].layerName, explicit_layer_name)); 27965db71995Sopenharmony_ci 27975db71995Sopenharmony_ci auto extensions = env.GetInstanceExtensions(4); 27985db71995Sopenharmony_ci EXPECT_TRUE(string_eq(extensions.at(0).extensionName, VK_EXT_DEBUG_REPORT_EXTENSION_NAME)); 27995db71995Sopenharmony_ci EXPECT_TRUE(string_eq(extensions.at(1).extensionName, VK_EXT_DEBUG_UTILS_EXTENSION_NAME)); 28005db71995Sopenharmony_ci EXPECT_TRUE(string_eq(extensions.at(2).extensionName, VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME)); 28015db71995Sopenharmony_ci EXPECT_TRUE(string_eq(extensions.at(3).extensionName, VK_LUNARG_DIRECT_DRIVER_LOADING_EXTENSION_NAME)); 28025db71995Sopenharmony_ci 28035db71995Sopenharmony_ci // Now query by layer name. 28045db71995Sopenharmony_ci auto layer_extensions = env.GetInstanceExtensions(1, explicit_layer_name); 28055db71995Sopenharmony_ci EXPECT_TRUE(string_eq(layer_extensions.at(0).extensionName, VK_EXT_DIRECT_MODE_DISPLAY_EXTENSION_NAME)); 28065db71995Sopenharmony_ci 28075db71995Sopenharmony_ci InstWrapper inst1{env.vulkan_functions}; 28085db71995Sopenharmony_ci inst1.create_info.add_extension(VK_EXT_DIRECT_MODE_DISPLAY_EXTENSION_NAME); 28095db71995Sopenharmony_ci inst1.CheckCreate(VK_ERROR_EXTENSION_NOT_PRESENT); 28105db71995Sopenharmony_ci 28115db71995Sopenharmony_ci // Make sure only the appropriate function pointers are NULL as well 28125db71995Sopenharmony_ci handle_assert_null(env.vulkan_functions.vkGetInstanceProcAddr(inst1.inst, "vkReleaseDisplayEXT")); 28135db71995Sopenharmony_ci handle_assert_null(env.vulkan_functions.vkGetInstanceProcAddr(inst1.inst, "vkGetPhysicalDeviceSurfaceCapabilities2EXT")); 28145db71995Sopenharmony_ci 28155db71995Sopenharmony_ci InstWrapper inst2{env.vulkan_functions}; 28165db71995Sopenharmony_ci inst2.create_info.add_layer(explicit_layer_name).add_extension(VK_EXT_DIRECT_MODE_DISPLAY_EXTENSION_NAME); 28175db71995Sopenharmony_ci inst2.CheckCreate(); 28185db71995Sopenharmony_ci 28195db71995Sopenharmony_ci // Make sure only the appropriate function pointers are NULL as well 28205db71995Sopenharmony_ci handle_assert_has_value(env.vulkan_functions.vkGetInstanceProcAddr(inst2.inst, "vkReleaseDisplayEXT")); 28215db71995Sopenharmony_ci handle_assert_null(env.vulkan_functions.vkGetInstanceProcAddr(inst2.inst, "vkGetPhysicalDeviceSurfaceCapabilities2EXT")); 28225db71995Sopenharmony_ci} 28235db71995Sopenharmony_ci 28245db71995Sopenharmony_ciTEST(LayerExtensions, ExplicitDispSurfCountInstanceExtension) { 28255db71995Sopenharmony_ci FrameworkEnvironment env; 28265db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA)).add_physical_device({}); 28275db71995Sopenharmony_ci 28285db71995Sopenharmony_ci const char* explicit_layer_name = "VK_LAYER_LUNARG_wrap_objects"; 28295db71995Sopenharmony_ci env.add_explicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} 28305db71995Sopenharmony_ci .set_name(explicit_layer_name) 28315db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_WRAP_OBJECTS_2) 28325db71995Sopenharmony_ci .add_instance_extension({VK_EXT_DISPLAY_SURFACE_COUNTER_EXTENSION_NAME, 28335db71995Sopenharmony_ci 1, 28345db71995Sopenharmony_ci {"vkGetPhysicalDeviceSurfaceCapabilities2EXT"}})), 28355db71995Sopenharmony_ci "explicit_wrap_layer_disp_surf_count.json"); 28365db71995Sopenharmony_ci 28375db71995Sopenharmony_ci auto layers = env.GetLayerProperties(1); 28385db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layers[0].layerName, explicit_layer_name)); 28395db71995Sopenharmony_ci 28405db71995Sopenharmony_ci auto extensions = env.GetInstanceExtensions(4); 28415db71995Sopenharmony_ci EXPECT_TRUE(string_eq(extensions.at(0).extensionName, VK_EXT_DEBUG_REPORT_EXTENSION_NAME)); 28425db71995Sopenharmony_ci EXPECT_TRUE(string_eq(extensions.at(1).extensionName, VK_EXT_DEBUG_UTILS_EXTENSION_NAME)); 28435db71995Sopenharmony_ci EXPECT_TRUE(string_eq(extensions.at(2).extensionName, VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME)); 28445db71995Sopenharmony_ci EXPECT_TRUE(string_eq(extensions.at(3).extensionName, VK_LUNARG_DIRECT_DRIVER_LOADING_EXTENSION_NAME)); 28455db71995Sopenharmony_ci 28465db71995Sopenharmony_ci // Now query by layer name. 28475db71995Sopenharmony_ci auto layer_extensions = env.GetInstanceExtensions(1, explicit_layer_name); 28485db71995Sopenharmony_ci EXPECT_TRUE(string_eq(layer_extensions.at(0).extensionName, VK_EXT_DISPLAY_SURFACE_COUNTER_EXTENSION_NAME)); 28495db71995Sopenharmony_ci 28505db71995Sopenharmony_ci InstWrapper inst1{env.vulkan_functions}; 28515db71995Sopenharmony_ci inst1.create_info.add_extension(VK_EXT_DISPLAY_SURFACE_COUNTER_EXTENSION_NAME); 28525db71995Sopenharmony_ci inst1.CheckCreate(VK_ERROR_EXTENSION_NOT_PRESENT); 28535db71995Sopenharmony_ci 28545db71995Sopenharmony_ci // Make sure only the appropriate function pointers are NULL as well 28555db71995Sopenharmony_ci handle_assert_null(env.vulkan_functions.vkGetInstanceProcAddr(inst1.inst, "vkReleaseDisplayEXT")); 28565db71995Sopenharmony_ci handle_assert_null(env.vulkan_functions.vkGetInstanceProcAddr(inst1.inst, "vkGetPhysicalDeviceSurfaceCapabilities2EXT")); 28575db71995Sopenharmony_ci 28585db71995Sopenharmony_ci InstWrapper inst2{env.vulkan_functions}; 28595db71995Sopenharmony_ci inst2.create_info.add_layer(explicit_layer_name).add_extension(VK_EXT_DISPLAY_SURFACE_COUNTER_EXTENSION_NAME); 28605db71995Sopenharmony_ci inst2.CheckCreate(); 28615db71995Sopenharmony_ci 28625db71995Sopenharmony_ci // Make sure only the appropriate function pointers are NULL as well 28635db71995Sopenharmony_ci handle_assert_null(env.vulkan_functions.vkGetInstanceProcAddr(inst2.inst, "vkReleaseDisplayEXT")); 28645db71995Sopenharmony_ci handle_assert_has_value(env.vulkan_functions.vkGetInstanceProcAddr(inst2.inst, "vkGetPhysicalDeviceSurfaceCapabilities2EXT")); 28655db71995Sopenharmony_ci} 28665db71995Sopenharmony_ci 28675db71995Sopenharmony_ciTEST(LayerExtensions, ExplicitBothInstanceExtensions) { 28685db71995Sopenharmony_ci FrameworkEnvironment env; 28695db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA)).add_physical_device({}); 28705db71995Sopenharmony_ci 28715db71995Sopenharmony_ci const char* explicit_layer_name = "VK_LAYER_LUNARG_wrap_objects"; 28725db71995Sopenharmony_ci env.add_explicit_layer( 28735db71995Sopenharmony_ci ManifestLayer{}.add_layer( 28745db71995Sopenharmony_ci ManifestLayer::LayerDescription{} 28755db71995Sopenharmony_ci .set_name(explicit_layer_name) 28765db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_WRAP_OBJECTS_3) 28775db71995Sopenharmony_ci .add_instance_extension({VK_EXT_DIRECT_MODE_DISPLAY_EXTENSION_NAME, 1, {"vkReleaseDisplayEXT"}}) 28785db71995Sopenharmony_ci .add_instance_extension( 28795db71995Sopenharmony_ci {VK_EXT_DISPLAY_SURFACE_COUNTER_EXTENSION_NAME, 1, {"vkGetPhysicalDeviceSurfaceCapabilities2EXT"}})), 28805db71995Sopenharmony_ci "explicit_wrap_layer_both_inst.json"); 28815db71995Sopenharmony_ci 28825db71995Sopenharmony_ci auto layers = env.GetLayerProperties(1); 28835db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layers[0].layerName, explicit_layer_name)); 28845db71995Sopenharmony_ci 28855db71995Sopenharmony_ci auto extensions = env.GetInstanceExtensions(4); 28865db71995Sopenharmony_ci EXPECT_TRUE(string_eq(extensions.at(0).extensionName, VK_EXT_DEBUG_REPORT_EXTENSION_NAME)); 28875db71995Sopenharmony_ci EXPECT_TRUE(string_eq(extensions.at(1).extensionName, VK_EXT_DEBUG_UTILS_EXTENSION_NAME)); 28885db71995Sopenharmony_ci EXPECT_TRUE(string_eq(extensions.at(2).extensionName, VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME)); 28895db71995Sopenharmony_ci EXPECT_TRUE(string_eq(extensions.at(3).extensionName, VK_LUNARG_DIRECT_DRIVER_LOADING_EXTENSION_NAME)); 28905db71995Sopenharmony_ci 28915db71995Sopenharmony_ci // Make sure the extensions still aren't present in this layer 28925db71995Sopenharmony_ci auto layer_extensions = env.GetInstanceExtensions(2, explicit_layer_name); 28935db71995Sopenharmony_ci EXPECT_TRUE(string_eq(layer_extensions.at(0).extensionName, VK_EXT_DIRECT_MODE_DISPLAY_EXTENSION_NAME)); 28945db71995Sopenharmony_ci EXPECT_TRUE(string_eq(layer_extensions.at(1).extensionName, VK_EXT_DISPLAY_SURFACE_COUNTER_EXTENSION_NAME)); 28955db71995Sopenharmony_ci 28965db71995Sopenharmony_ci InstWrapper inst1{env.vulkan_functions}; 28975db71995Sopenharmony_ci inst1.create_info.add_extension(VK_EXT_DIRECT_MODE_DISPLAY_EXTENSION_NAME) 28985db71995Sopenharmony_ci .add_extension(VK_EXT_DISPLAY_SURFACE_COUNTER_EXTENSION_NAME); 28995db71995Sopenharmony_ci inst1.CheckCreate(VK_ERROR_EXTENSION_NOT_PRESENT); 29005db71995Sopenharmony_ci 29015db71995Sopenharmony_ci // Make sure only the appropriate function pointers are NULL as well 29025db71995Sopenharmony_ci handle_assert_null(env.vulkan_functions.vkGetInstanceProcAddr(inst1.inst, "vkReleaseDisplayEXT")); 29035db71995Sopenharmony_ci handle_assert_null(env.vulkan_functions.vkGetInstanceProcAddr(inst1.inst, "vkGetPhysicalDeviceSurfaceCapabilities2EXT")); 29045db71995Sopenharmony_ci 29055db71995Sopenharmony_ci InstWrapper inst2{env.vulkan_functions}; 29065db71995Sopenharmony_ci inst2.create_info.add_layer(explicit_layer_name) 29075db71995Sopenharmony_ci .add_extension(VK_EXT_DIRECT_MODE_DISPLAY_EXTENSION_NAME) 29085db71995Sopenharmony_ci .add_extension(VK_EXT_DISPLAY_SURFACE_COUNTER_EXTENSION_NAME); 29095db71995Sopenharmony_ci inst2.CheckCreate(); 29105db71995Sopenharmony_ci VkPhysicalDevice phys_dev = inst2.GetPhysDev(); 29115db71995Sopenharmony_ci 29125db71995Sopenharmony_ci // Make sure only the appropriate function pointers are NULL as well 29135db71995Sopenharmony_ci handle_assert_has_value(env.vulkan_functions.vkGetInstanceProcAddr(inst2.inst, "vkReleaseDisplayEXT")); 29145db71995Sopenharmony_ci PFN_vkGetPhysicalDeviceSurfaceCapabilities2EXT pfnGetPhysicalDeviceSurfaceCapabilities2EXT = 29155db71995Sopenharmony_ci inst2.load("vkGetPhysicalDeviceSurfaceCapabilities2EXT"); 29165db71995Sopenharmony_ci handle_assert_has_value(pfnGetPhysicalDeviceSurfaceCapabilities2EXT); 29175db71995Sopenharmony_ci 29185db71995Sopenharmony_ci VkSurfaceCapabilities2EXT surf_caps{VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_2_EXT}; 29195db71995Sopenharmony_ci 29205db71995Sopenharmony_ci // Call and then check a few things 29215db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, pfnGetPhysicalDeviceSurfaceCapabilities2EXT(phys_dev, VK_NULL_HANDLE, &surf_caps)); 29225db71995Sopenharmony_ci ASSERT_EQ(7U, surf_caps.minImageCount); 29235db71995Sopenharmony_ci ASSERT_EQ(12U, surf_caps.maxImageCount); 29245db71995Sopenharmony_ci ASSERT_EQ(365U, surf_caps.maxImageArrayLayers); 29255db71995Sopenharmony_ci} 29265db71995Sopenharmony_ci 29275db71995Sopenharmony_ciTEST(LayerExtensions, ImplicitNoAdditionalDeviceExtension) { 29285db71995Sopenharmony_ci FrameworkEnvironment env; 29295db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA)).add_physical_device({}); 29305db71995Sopenharmony_ci 29315db71995Sopenharmony_ci const char* implicit_layer_name = "VK_LAYER_LUNARG_wrap_objects"; 29325db71995Sopenharmony_ci const char* enable_env_var = "ENABLE_ME"; 29335db71995Sopenharmony_ci const char* disable_env_var = "DISABLE_ME"; 29345db71995Sopenharmony_ci 29355db71995Sopenharmony_ci env.add_implicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} 29365db71995Sopenharmony_ci .set_name(implicit_layer_name) 29375db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_WRAP_OBJECTS) 29385db71995Sopenharmony_ci .set_disable_environment(disable_env_var) 29395db71995Sopenharmony_ci .set_enable_environment(enable_env_var)), 29405db71995Sopenharmony_ci "implicit_wrap_layer_no_ext.json"); 29415db71995Sopenharmony_ci 29425db71995Sopenharmony_ci auto layers = env.GetLayerProperties(1); 29435db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layers[0].layerName, implicit_layer_name)); 29445db71995Sopenharmony_ci 29455db71995Sopenharmony_ci // set enable env-var, layer should load 29465db71995Sopenharmony_ci EnvVarWrapper wrap_enable_env_var{enable_env_var, "1"}; 29475db71995Sopenharmony_ci CheckLogForLayerString(env, implicit_layer_name, true); 29485db71995Sopenharmony_ci 29495db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 29505db71995Sopenharmony_ci inst.CheckCreate(); 29515db71995Sopenharmony_ci VkPhysicalDevice phys_dev = inst.GetPhysDev(); 29525db71995Sopenharmony_ci ASSERT_NO_FATAL_FAILURE(inst.EnumerateDeviceExtensions(phys_dev, 0)); 29535db71995Sopenharmony_ci 29545db71995Sopenharmony_ci // Device functions queried using vkGetInstanceProcAddr should be non-NULL since this could be available for any attached 29555db71995Sopenharmony_ci // physical device. 29565db71995Sopenharmony_ci PFN_vkTrimCommandPoolKHR pfn_vkTrimCommandPool = inst.load("vkTrimCommandPoolKHR"); 29575db71995Sopenharmony_ci PFN_vkGetSwapchainStatusKHR pfn_vkGetSwapchainStatus = inst.load("vkGetSwapchainStatusKHR"); 29585db71995Sopenharmony_ci PFN_vkSetDeviceMemoryPriorityEXT pfn_vkSetDeviceMemoryPriority = inst.load("vkSetDeviceMemoryPriorityEXT"); 29595db71995Sopenharmony_ci handle_assert_has_value(pfn_vkTrimCommandPool); 29605db71995Sopenharmony_ci handle_assert_has_value(pfn_vkGetSwapchainStatus); 29615db71995Sopenharmony_ci handle_assert_has_value(pfn_vkSetDeviceMemoryPriority); 29625db71995Sopenharmony_ci 29635db71995Sopenharmony_ci DeviceWrapper dev{inst}; 29645db71995Sopenharmony_ci dev.CheckCreate(phys_dev); 29655db71995Sopenharmony_ci 29665db71995Sopenharmony_ci // Query again after create device to make sure the value returned by vkGetInstanceProcAddr did not change 29675db71995Sopenharmony_ci PFN_vkTrimCommandPoolKHR pfn_vkTrimCommandPool2 = inst.load("vkTrimCommandPoolKHR"); 29685db71995Sopenharmony_ci PFN_vkGetSwapchainStatusKHR pfn_vkGetSwapchainStatus2 = inst.load("vkGetSwapchainStatusKHR"); 29695db71995Sopenharmony_ci PFN_vkSetDeviceMemoryPriorityEXT pfn_vkSetDeviceMemoryPriority2 = inst.load("vkSetDeviceMemoryPriorityEXT"); 29705db71995Sopenharmony_ci ASSERT_EQ(pfn_vkTrimCommandPool, pfn_vkTrimCommandPool2); 29715db71995Sopenharmony_ci ASSERT_EQ(pfn_vkGetSwapchainStatus, pfn_vkGetSwapchainStatus2); 29725db71995Sopenharmony_ci ASSERT_EQ(pfn_vkSetDeviceMemoryPriority, pfn_vkSetDeviceMemoryPriority2); 29735db71995Sopenharmony_ci 29745db71995Sopenharmony_ci // Make sure all the function pointers returned by vkGetDeviceProcAddr for non-enabled extensions are NULL 29755db71995Sopenharmony_ci handle_assert_null(dev->vkGetDeviceProcAddr(dev.dev, "vkTrimCommandPoolKHR")); 29765db71995Sopenharmony_ci handle_assert_null(dev->vkGetDeviceProcAddr(dev.dev, "vkGetSwapchainStatusKHR")); 29775db71995Sopenharmony_ci handle_assert_null(dev->vkGetDeviceProcAddr(dev.dev, "vkSetDeviceMemoryPriorityEXT")); 29785db71995Sopenharmony_ci 29795db71995Sopenharmony_ci // Even though the instance functions returned are non-NULL. They should not work if we haven't enabled the extensions. 29805db71995Sopenharmony_ci ASSERT_DEATH(pfn_vkTrimCommandPool(dev.dev, VK_NULL_HANDLE, 0), ""); 29815db71995Sopenharmony_ci ASSERT_DEATH(pfn_vkGetSwapchainStatus(dev.dev, VK_NULL_HANDLE), ""); 29825db71995Sopenharmony_ci ASSERT_DEATH(pfn_vkSetDeviceMemoryPriority(dev.dev, VK_NULL_HANDLE, 0.f), ""); 29835db71995Sopenharmony_ci} 29845db71995Sopenharmony_ci 29855db71995Sopenharmony_ciTEST(LayerExtensions, ImplicitMaintenanceDeviceExtension) { 29865db71995Sopenharmony_ci FrameworkEnvironment env; 29875db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA)).add_physical_device({}); 29885db71995Sopenharmony_ci 29895db71995Sopenharmony_ci const char* implicit_layer_name = "VK_LAYER_LUNARG_wrap_objects"; 29905db71995Sopenharmony_ci const char* enable_env_var = "ENABLE_ME"; 29915db71995Sopenharmony_ci const char* disable_env_var = "DISABLE_ME"; 29925db71995Sopenharmony_ci 29935db71995Sopenharmony_ci env.add_implicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} 29945db71995Sopenharmony_ci .set_name(implicit_layer_name) 29955db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_WRAP_OBJECTS_1) 29965db71995Sopenharmony_ci .set_disable_environment(disable_env_var) 29975db71995Sopenharmony_ci .set_enable_environment(enable_env_var)), 29985db71995Sopenharmony_ci "implicit_wrap_layer_maint.json"); 29995db71995Sopenharmony_ci 30005db71995Sopenharmony_ci auto layers = env.GetLayerProperties(1); 30015db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layers[0].layerName, implicit_layer_name)); 30025db71995Sopenharmony_ci 30035db71995Sopenharmony_ci // set enable env-var, layer should load 30045db71995Sopenharmony_ci EnvVarWrapper wrap_enable_env_var{enable_env_var, "1"}; 30055db71995Sopenharmony_ci CheckLogForLayerString(env, implicit_layer_name, true); 30065db71995Sopenharmony_ci 30075db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 30085db71995Sopenharmony_ci inst.CheckCreate(); 30095db71995Sopenharmony_ci VkPhysicalDevice phys_dev = inst.GetPhysDev(); 30105db71995Sopenharmony_ci auto device_extensions = inst.EnumerateDeviceExtensions(phys_dev, 1); 30115db71995Sopenharmony_ci ASSERT_TRUE(string_eq(device_extensions.at(0).extensionName, VK_KHR_MAINTENANCE1_EXTENSION_NAME)); 30125db71995Sopenharmony_ci 30135db71995Sopenharmony_ci DeviceWrapper dev{inst}; 30145db71995Sopenharmony_ci dev.create_info.add_extension(VK_KHR_MAINTENANCE1_EXTENSION_NAME); 30155db71995Sopenharmony_ci dev.CheckCreate(phys_dev); 30165db71995Sopenharmony_ci 30175db71995Sopenharmony_ci // Make sure only the appropriate function pointers are NULL as well 30185db71995Sopenharmony_ci handle_assert_has_value(dev->vkGetDeviceProcAddr(dev.dev, "vkTrimCommandPoolKHR")); 30195db71995Sopenharmony_ci handle_assert_null(dev->vkGetDeviceProcAddr(dev.dev, "vkGetSwapchainStatusKHR")); 30205db71995Sopenharmony_ci} 30215db71995Sopenharmony_ci 30225db71995Sopenharmony_ciTEST(LayerExtensions, ImplicitPresentImageDeviceExtension) { 30235db71995Sopenharmony_ci FrameworkEnvironment env; 30245db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA)).add_physical_device({}); 30255db71995Sopenharmony_ci 30265db71995Sopenharmony_ci const char* implicit_layer_name = "VK_LAYER_LUNARG_wrap_objects"; 30275db71995Sopenharmony_ci const char* enable_env_var = "ENABLE_ME"; 30285db71995Sopenharmony_ci const char* disable_env_var = "DISABLE_ME"; 30295db71995Sopenharmony_ci 30305db71995Sopenharmony_ci env.add_implicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} 30315db71995Sopenharmony_ci .set_name(implicit_layer_name) 30325db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_WRAP_OBJECTS_2) 30335db71995Sopenharmony_ci .set_disable_environment(disable_env_var) 30345db71995Sopenharmony_ci .set_enable_environment(enable_env_var)), 30355db71995Sopenharmony_ci "implicit_wrap_layer_pres.json"); 30365db71995Sopenharmony_ci 30375db71995Sopenharmony_ci auto layers = env.GetLayerProperties(1); 30385db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layers[0].layerName, implicit_layer_name)); 30395db71995Sopenharmony_ci 30405db71995Sopenharmony_ci // set enable env-var, layer should load 30415db71995Sopenharmony_ci EnvVarWrapper wrap_enable_env_var{enable_env_var, "1"}; 30425db71995Sopenharmony_ci CheckLogForLayerString(env, implicit_layer_name, true); 30435db71995Sopenharmony_ci 30445db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 30455db71995Sopenharmony_ci inst.CheckCreate(); 30465db71995Sopenharmony_ci VkPhysicalDevice phys_dev = inst.GetPhysDev(); 30475db71995Sopenharmony_ci auto device_extensions = inst.EnumerateDeviceExtensions(phys_dev, 1); 30485db71995Sopenharmony_ci ASSERT_TRUE(string_eq(device_extensions.at(0).extensionName, VK_KHR_SHARED_PRESENTABLE_IMAGE_EXTENSION_NAME)); 30495db71995Sopenharmony_ci 30505db71995Sopenharmony_ci DeviceWrapper dev{inst}; 30515db71995Sopenharmony_ci dev.create_info.add_extension(VK_KHR_SHARED_PRESENTABLE_IMAGE_EXTENSION_NAME); 30525db71995Sopenharmony_ci dev.CheckCreate(phys_dev); 30535db71995Sopenharmony_ci 30545db71995Sopenharmony_ci // Make sure only the appropriate function pointers are NULL as well 30555db71995Sopenharmony_ci handle_assert_null(dev->vkGetDeviceProcAddr(dev.dev, "vkTrimCommandPoolKHR")); 30565db71995Sopenharmony_ci handle_assert_has_value(dev->vkGetDeviceProcAddr(dev.dev, "vkGetSwapchainStatusKHR")); 30575db71995Sopenharmony_ci} 30585db71995Sopenharmony_ci 30595db71995Sopenharmony_ciTEST(LayerExtensions, ImplicitBothDeviceExtensions) { 30605db71995Sopenharmony_ci FrameworkEnvironment env; 30615db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA)).add_physical_device({}); 30625db71995Sopenharmony_ci 30635db71995Sopenharmony_ci const char* implicit_layer_name = "VK_LAYER_LUNARG_wrap_objects"; 30645db71995Sopenharmony_ci const char* enable_env_var = "ENABLE_ME"; 30655db71995Sopenharmony_ci const char* disable_env_var = "DISABLE_ME"; 30665db71995Sopenharmony_ci 30675db71995Sopenharmony_ci env.add_implicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} 30685db71995Sopenharmony_ci .set_name(implicit_layer_name) 30695db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_WRAP_OBJECTS_3) 30705db71995Sopenharmony_ci .set_disable_environment(disable_env_var) 30715db71995Sopenharmony_ci .set_enable_environment(enable_env_var)), 30725db71995Sopenharmony_ci "implicit_wrap_layer_both_dev.json"); 30735db71995Sopenharmony_ci 30745db71995Sopenharmony_ci auto layers = env.GetLayerProperties(1); 30755db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layers[0].layerName, implicit_layer_name)); 30765db71995Sopenharmony_ci 30775db71995Sopenharmony_ci // set enable env-var, layer should load 30785db71995Sopenharmony_ci EnvVarWrapper wrap_enable_env_var{enable_env_var, "1"}; 30795db71995Sopenharmony_ci CheckLogForLayerString(env, implicit_layer_name, true); 30805db71995Sopenharmony_ci 30815db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 30825db71995Sopenharmony_ci inst.CheckCreate(); 30835db71995Sopenharmony_ci VkPhysicalDevice phys_dev = inst.GetPhysDev(); 30845db71995Sopenharmony_ci auto device_extensions = inst.EnumerateDeviceExtensions(phys_dev, 2); 30855db71995Sopenharmony_ci ASSERT_TRUE(string_eq(device_extensions.at(0).extensionName, VK_KHR_MAINTENANCE1_EXTENSION_NAME)); 30865db71995Sopenharmony_ci ASSERT_TRUE(string_eq(device_extensions.at(1).extensionName, VK_KHR_SHARED_PRESENTABLE_IMAGE_EXTENSION_NAME)); 30875db71995Sopenharmony_ci 30885db71995Sopenharmony_ci DeviceWrapper dev{inst}; 30895db71995Sopenharmony_ci dev.create_info.add_extension(VK_KHR_MAINTENANCE1_EXTENSION_NAME).add_extension(VK_KHR_SHARED_PRESENTABLE_IMAGE_EXTENSION_NAME); 30905db71995Sopenharmony_ci dev.CheckCreate(phys_dev); 30915db71995Sopenharmony_ci 30925db71995Sopenharmony_ci // Make sure only the appropriate function pointers are NULL as well 30935db71995Sopenharmony_ci handle_assert_has_value(dev->vkGetDeviceProcAddr(dev.dev, "vkTrimCommandPoolKHR")); 30945db71995Sopenharmony_ci handle_assert_has_value(dev->vkGetDeviceProcAddr(dev.dev, "vkGetSwapchainStatusKHR")); 30955db71995Sopenharmony_ci} 30965db71995Sopenharmony_ci 30975db71995Sopenharmony_ciTEST(LayerExtensions, ExplicitNoAdditionalDeviceExtension) { 30985db71995Sopenharmony_ci FrameworkEnvironment env; 30995db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA)).add_physical_device({}); 31005db71995Sopenharmony_ci 31015db71995Sopenharmony_ci const char* explicit_layer_name = "VK_LAYER_LUNARG_wrap_objects"; 31025db71995Sopenharmony_ci env.add_explicit_layer( 31035db71995Sopenharmony_ci ManifestLayer{}.add_layer( 31045db71995Sopenharmony_ci ManifestLayer::LayerDescription{}.set_name(explicit_layer_name).set_lib_path(TEST_LAYER_WRAP_OBJECTS)), 31055db71995Sopenharmony_ci "explicit_wrap_layer_no_ext.json"); 31065db71995Sopenharmony_ci 31075db71995Sopenharmony_ci auto layers = env.GetLayerProperties(1); 31085db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layers[0].layerName, explicit_layer_name)); 31095db71995Sopenharmony_ci 31105db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 31115db71995Sopenharmony_ci inst.create_info.add_layer(explicit_layer_name); 31125db71995Sopenharmony_ci inst.CheckCreate(); 31135db71995Sopenharmony_ci VkPhysicalDevice phys_dev = inst.GetPhysDev(); 31145db71995Sopenharmony_ci 31155db71995Sopenharmony_ci ASSERT_NO_FATAL_FAILURE(inst.EnumerateDeviceExtensions(phys_dev, 0)); 31165db71995Sopenharmony_ci ASSERT_NO_FATAL_FAILURE(inst.EnumerateLayerDeviceExtensions(phys_dev, explicit_layer_name, 0)); 31175db71995Sopenharmony_ci 31185db71995Sopenharmony_ci DeviceWrapper dev{inst}; 31195db71995Sopenharmony_ci dev.CheckCreate(phys_dev); 31205db71995Sopenharmony_ci 31215db71995Sopenharmony_ci // Make sure all the function pointers are NULL as well 31225db71995Sopenharmony_ci handle_assert_null(dev->vkGetDeviceProcAddr(dev.dev, "vkTrimCommandPoolKHR")); 31235db71995Sopenharmony_ci handle_assert_null(dev->vkGetDeviceProcAddr(dev.dev, "vkGetSwapchainStatusKHR")); 31245db71995Sopenharmony_ci handle_assert_null(dev->vkGetDeviceProcAddr(dev.dev, "vkSetDeviceMemoryPriorityEXT")); 31255db71995Sopenharmony_ci} 31265db71995Sopenharmony_ci 31275db71995Sopenharmony_ciTEST(LayerExtensions, ExplicitMaintenanceDeviceExtension) { 31285db71995Sopenharmony_ci FrameworkEnvironment env; 31295db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA)).add_physical_device({}); 31305db71995Sopenharmony_ci 31315db71995Sopenharmony_ci const char* explicit_layer_name = "VK_LAYER_LUNARG_wrap_objects"; 31325db71995Sopenharmony_ci env.add_explicit_layer( 31335db71995Sopenharmony_ci ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} 31345db71995Sopenharmony_ci .set_name(explicit_layer_name) 31355db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_WRAP_OBJECTS_1) 31365db71995Sopenharmony_ci .set_api_version(VK_MAKE_API_VERSION(0, 1, 0, 0)) 31375db71995Sopenharmony_ci .add_device_extension({VK_KHR_MAINTENANCE1_EXTENSION_NAME, 1, {"vkTrimCommandPoolKHR"}})), 31385db71995Sopenharmony_ci "explicit_wrap_layer_maint.json"); 31395db71995Sopenharmony_ci 31405db71995Sopenharmony_ci auto layers = env.GetLayerProperties(1); 31415db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layers[0].layerName, explicit_layer_name)); 31425db71995Sopenharmony_ci 31435db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 31445db71995Sopenharmony_ci inst.create_info.add_layer(explicit_layer_name); 31455db71995Sopenharmony_ci inst.CheckCreate(); 31465db71995Sopenharmony_ci VkPhysicalDevice phys_dev = inst.GetPhysDev(); 31475db71995Sopenharmony_ci 31485db71995Sopenharmony_ci ASSERT_NO_FATAL_FAILURE(inst.EnumerateDeviceExtensions(phys_dev, 0)); 31495db71995Sopenharmony_ci auto layer_extensions = inst.EnumerateLayerDeviceExtensions(phys_dev, explicit_layer_name, 1); 31505db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layer_extensions.at(0).extensionName, VK_KHR_MAINTENANCE1_EXTENSION_NAME)); 31515db71995Sopenharmony_ci 31525db71995Sopenharmony_ci DeviceWrapper dev{inst}; 31535db71995Sopenharmony_ci dev.create_info.add_extension(VK_KHR_MAINTENANCE1_EXTENSION_NAME); 31545db71995Sopenharmony_ci dev.CheckCreate(phys_dev); 31555db71995Sopenharmony_ci 31565db71995Sopenharmony_ci // Make sure only the appropriate function pointers are NULL as well 31575db71995Sopenharmony_ci handle_assert_has_value(dev->vkGetDeviceProcAddr(dev.dev, "vkTrimCommandPoolKHR")); 31585db71995Sopenharmony_ci handle_assert_null(dev->vkGetDeviceProcAddr(dev.dev, "vkGetSwapchainStatusKHR")); 31595db71995Sopenharmony_ci} 31605db71995Sopenharmony_ci 31615db71995Sopenharmony_ciTEST(LayerExtensions, ExplicitPresentImageDeviceExtension) { 31625db71995Sopenharmony_ci FrameworkEnvironment env; 31635db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA)).add_physical_device({}); 31645db71995Sopenharmony_ci 31655db71995Sopenharmony_ci const char* explicit_layer_name = "VK_LAYER_LUNARG_wrap_objects"; 31665db71995Sopenharmony_ci env.add_explicit_layer( 31675db71995Sopenharmony_ci ManifestLayer{}.add_layer( 31685db71995Sopenharmony_ci ManifestLayer::LayerDescription{} 31695db71995Sopenharmony_ci .set_name(explicit_layer_name) 31705db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_WRAP_OBJECTS_2) 31715db71995Sopenharmony_ci .set_api_version(VK_MAKE_API_VERSION(0, 1, 0, 0)) 31725db71995Sopenharmony_ci .add_device_extension({VK_KHR_SHARED_PRESENTABLE_IMAGE_EXTENSION_NAME, 1, {"vkGetSwapchainStatusKHR"}})), 31735db71995Sopenharmony_ci "explicit_wrap_layer_pres.json"); 31745db71995Sopenharmony_ci 31755db71995Sopenharmony_ci auto layers = env.GetLayerProperties(1); 31765db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layers[0].layerName, explicit_layer_name)); 31775db71995Sopenharmony_ci 31785db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 31795db71995Sopenharmony_ci inst.create_info.add_layer(explicit_layer_name); 31805db71995Sopenharmony_ci inst.CheckCreate(); 31815db71995Sopenharmony_ci VkPhysicalDevice phys_dev = inst.GetPhysDev(); 31825db71995Sopenharmony_ci 31835db71995Sopenharmony_ci ASSERT_NO_FATAL_FAILURE(inst.EnumerateDeviceExtensions(phys_dev, 0)); 31845db71995Sopenharmony_ci auto layer_extensions = inst.EnumerateLayerDeviceExtensions(phys_dev, explicit_layer_name, 1); 31855db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layer_extensions.at(0).extensionName, VK_KHR_SHARED_PRESENTABLE_IMAGE_EXTENSION_NAME)); 31865db71995Sopenharmony_ci 31875db71995Sopenharmony_ci DeviceWrapper dev{inst}; 31885db71995Sopenharmony_ci dev.create_info.add_extension(VK_KHR_SHARED_PRESENTABLE_IMAGE_EXTENSION_NAME); 31895db71995Sopenharmony_ci dev.CheckCreate(phys_dev); 31905db71995Sopenharmony_ci 31915db71995Sopenharmony_ci // Make sure only the appropriate function pointers are NULL as well 31925db71995Sopenharmony_ci handle_assert_null(dev->vkGetDeviceProcAddr(dev.dev, "vkTrimCommandPoolKHR")); 31935db71995Sopenharmony_ci handle_assert_has_value(dev->vkGetDeviceProcAddr(dev.dev, "vkGetSwapchainStatusKHR")); 31945db71995Sopenharmony_ci} 31955db71995Sopenharmony_ci 31965db71995Sopenharmony_ciTEST(LayerExtensions, ExplicitBothDeviceExtensions) { 31975db71995Sopenharmony_ci FrameworkEnvironment env; 31985db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA)).add_physical_device({}); 31995db71995Sopenharmony_ci 32005db71995Sopenharmony_ci const char* explicit_layer_name = "VK_LAYER_LUNARG_wrap_objects"; 32015db71995Sopenharmony_ci env.add_explicit_layer( 32025db71995Sopenharmony_ci ManifestLayer{}.add_layer( 32035db71995Sopenharmony_ci ManifestLayer::LayerDescription{} 32045db71995Sopenharmony_ci .set_name(explicit_layer_name) 32055db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_WRAP_OBJECTS_3) 32065db71995Sopenharmony_ci .set_api_version(VK_MAKE_API_VERSION(0, 1, 0, 0)) 32075db71995Sopenharmony_ci .add_device_extension({VK_KHR_MAINTENANCE1_EXTENSION_NAME, 1, {"vkTrimCommandPoolKHR"}}) 32085db71995Sopenharmony_ci .add_device_extension({VK_KHR_SHARED_PRESENTABLE_IMAGE_EXTENSION_NAME, 1, {"vkGetSwapchainStatusKHR"}})), 32095db71995Sopenharmony_ci "explicit_wrap_layer_both_dev.json"); 32105db71995Sopenharmony_ci 32115db71995Sopenharmony_ci auto layers = env.GetLayerProperties(1); 32125db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layers[0].layerName, explicit_layer_name)); 32135db71995Sopenharmony_ci 32145db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 32155db71995Sopenharmony_ci inst.create_info.add_layer(explicit_layer_name); 32165db71995Sopenharmony_ci inst.CheckCreate(); 32175db71995Sopenharmony_ci VkPhysicalDevice phys_dev = inst.GetPhysDev(); 32185db71995Sopenharmony_ci handle_assert_has_value(phys_dev); 32195db71995Sopenharmony_ci 32205db71995Sopenharmony_ci ASSERT_NO_FATAL_FAILURE(inst.EnumerateDeviceExtensions(phys_dev, 0)); 32215db71995Sopenharmony_ci auto layer_extensions = inst.EnumerateLayerDeviceExtensions(phys_dev, explicit_layer_name, 2); 32225db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layer_extensions.at(0).extensionName, VK_KHR_MAINTENANCE1_EXTENSION_NAME)); 32235db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layer_extensions.at(1).extensionName, VK_KHR_SHARED_PRESENTABLE_IMAGE_EXTENSION_NAME)); 32245db71995Sopenharmony_ci 32255db71995Sopenharmony_ci DeviceWrapper dev{inst}; 32265db71995Sopenharmony_ci dev.create_info.add_extension(VK_KHR_MAINTENANCE1_EXTENSION_NAME).add_extension(VK_KHR_SHARED_PRESENTABLE_IMAGE_EXTENSION_NAME); 32275db71995Sopenharmony_ci dev.CheckCreate(phys_dev); 32285db71995Sopenharmony_ci 32295db71995Sopenharmony_ci // Make sure only the appropriate function pointers are NULL as well 32305db71995Sopenharmony_ci handle_assert_has_value(dev->vkGetDeviceProcAddr(dev.dev, "vkTrimCommandPoolKHR")); 32315db71995Sopenharmony_ci 32325db71995Sopenharmony_ci PFN_vkGetSwapchainStatusKHR gipa_pfnGetSwapchainStatusKHR = inst.load("vkGetSwapchainStatusKHR"); 32335db71995Sopenharmony_ci PFN_vkGetSwapchainStatusKHR gdpa_pfnGetSwapchainStatusKHR = dev.load("vkGetSwapchainStatusKHR"); 32345db71995Sopenharmony_ci handle_assert_has_value(gipa_pfnGetSwapchainStatusKHR); 32355db71995Sopenharmony_ci handle_assert_has_value(gdpa_pfnGetSwapchainStatusKHR); 32365db71995Sopenharmony_ci 32375db71995Sopenharmony_ci // Make sure both versions (from vkGetInstanceProcAddr and vkGetDeviceProcAddr) return the same value. 32385db71995Sopenharmony_ci ASSERT_EQ(VK_ERROR_NATIVE_WINDOW_IN_USE_KHR, gipa_pfnGetSwapchainStatusKHR(dev.dev, VK_NULL_HANDLE)); 32395db71995Sopenharmony_ci ASSERT_EQ(VK_ERROR_NATIVE_WINDOW_IN_USE_KHR, gdpa_pfnGetSwapchainStatusKHR(dev.dev, VK_NULL_HANDLE)); 32405db71995Sopenharmony_ci} 32415db71995Sopenharmony_ci 32425db71995Sopenharmony_ciTEST(TestLayers, ExplicitlyEnableImplicitLayer) { 32435db71995Sopenharmony_ci FrameworkEnvironment env; 32445db71995Sopenharmony_ci uint32_t api_version = VK_API_VERSION_1_2; 32455db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA, api_version)) 32465db71995Sopenharmony_ci .set_icd_api_version(api_version) 32475db71995Sopenharmony_ci .add_physical_device(PhysicalDevice{}.set_api_version(api_version).finish()); 32485db71995Sopenharmony_ci 32495db71995Sopenharmony_ci const char* regular_layer_name = "VK_LAYER_TestLayer1"; 32505db71995Sopenharmony_ci env.add_implicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} 32515db71995Sopenharmony_ci .set_name(regular_layer_name) 32525db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) 32535db71995Sopenharmony_ci .set_api_version(VK_MAKE_API_VERSION(0, 1, 1, 0)) 32545db71995Sopenharmony_ci .set_disable_environment("DisableMeIfYouCan")), 32555db71995Sopenharmony_ci "regular_test_layer.json"); 32565db71995Sopenharmony_ci { // 1.1 instance 32575db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 32585db71995Sopenharmony_ci inst.create_info.add_layer(regular_layer_name); 32595db71995Sopenharmony_ci inst.create_info.set_api_version(1, 1, 0); 32605db71995Sopenharmony_ci inst.CheckCreate(); 32615db71995Sopenharmony_ci auto layer_props = inst.GetActiveLayers(inst.GetPhysDev(), 1); 32625db71995Sopenharmony_ci ASSERT_TRUE(string_eq(regular_layer_name, layer_props.at(0).layerName)); 32635db71995Sopenharmony_ci } 32645db71995Sopenharmony_ci { // 1.2 instance 32655db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 32665db71995Sopenharmony_ci inst.create_info.add_layer(regular_layer_name); 32675db71995Sopenharmony_ci inst.create_info.set_api_version(1, 2, 0); 32685db71995Sopenharmony_ci inst.CheckCreate(); 32695db71995Sopenharmony_ci inst.GetActiveLayers(inst.GetPhysDev(), 1); 32705db71995Sopenharmony_ci } 32715db71995Sopenharmony_ci} 32725db71995Sopenharmony_ci 32735db71995Sopenharmony_ciTEST(TestLayers, NewerInstanceVersionThanImplicitLayer) { 32745db71995Sopenharmony_ci FrameworkEnvironment env; 32755db71995Sopenharmony_ci uint32_t api_version = VK_API_VERSION_1_2; 32765db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA, api_version)) 32775db71995Sopenharmony_ci .set_icd_api_version(api_version) 32785db71995Sopenharmony_ci .add_physical_device(PhysicalDevice{}.set_api_version(api_version).finish()); 32795db71995Sopenharmony_ci 32805db71995Sopenharmony_ci const char* regular_layer_name = "VK_LAYER_TestLayer1"; 32815db71995Sopenharmony_ci env.add_implicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} 32825db71995Sopenharmony_ci .set_name(regular_layer_name) 32835db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) 32845db71995Sopenharmony_ci .set_api_version(VK_MAKE_API_VERSION(0, 1, 1, 0)) 32855db71995Sopenharmony_ci .set_disable_environment("DisableMeIfYouCan")), 32865db71995Sopenharmony_ci "regular_test_layer.json"); 32875db71995Sopenharmony_ci { // global functions 32885db71995Sopenharmony_ci auto layer_props = env.GetLayerProperties(1); 32895db71995Sopenharmony_ci EXPECT_TRUE(string_eq(layer_props[0].layerName, regular_layer_name)); 32905db71995Sopenharmony_ci } 32915db71995Sopenharmony_ci { // 1.1 instance - should find the implicit layer 32925db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 32935db71995Sopenharmony_ci inst.create_info.set_api_version(1, 1, 0); 32945db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst.create_info, env.debug_log); 32955db71995Sopenharmony_ci inst.CheckCreate(); 32965db71995Sopenharmony_ci EXPECT_TRUE(env.debug_log.find(std::string("Insert instance layer \"") + regular_layer_name)); 32975db71995Sopenharmony_ci env.debug_log.clear(); 32985db71995Sopenharmony_ci auto layer_props = inst.GetActiveLayers(inst.GetPhysDev(), 1); 32995db71995Sopenharmony_ci ASSERT_TRUE(string_eq(regular_layer_name, layer_props.at(0).layerName)); 33005db71995Sopenharmony_ci } 33015db71995Sopenharmony_ci { // 1.2 instance -- instance layer should be found 33025db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 33035db71995Sopenharmony_ci inst.create_info.set_api_version(1, 2, 0); 33045db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst.create_info, env.debug_log); 33055db71995Sopenharmony_ci inst.CheckCreate(); 33065db71995Sopenharmony_ci EXPECT_TRUE(env.debug_log.find(std::string("Insert instance layer \"") + regular_layer_name)); 33075db71995Sopenharmony_ci env.debug_log.clear(); 33085db71995Sopenharmony_ci 33095db71995Sopenharmony_ci auto layer_props = inst.GetActiveLayers(inst.GetPhysDev(), 1); 33105db71995Sopenharmony_ci ASSERT_TRUE(string_eq(regular_layer_name, layer_props.at(0).layerName)); 33115db71995Sopenharmony_ci } 33125db71995Sopenharmony_ci} 33135db71995Sopenharmony_ci 33145db71995Sopenharmony_ciTEST(TestLayers, ImplicitLayerPre10APIVersion) { 33155db71995Sopenharmony_ci FrameworkEnvironment env; 33165db71995Sopenharmony_ci uint32_t api_version = VK_API_VERSION_1_2; 33175db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA, api_version)) 33185db71995Sopenharmony_ci .set_icd_api_version(api_version) 33195db71995Sopenharmony_ci .add_physical_device(PhysicalDevice{}.set_api_version(api_version).finish()); 33205db71995Sopenharmony_ci 33215db71995Sopenharmony_ci const char* regular_layer_name = "VK_LAYER_TestLayer1"; 33225db71995Sopenharmony_ci env.add_implicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} 33235db71995Sopenharmony_ci .set_name(regular_layer_name) 33245db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) 33255db71995Sopenharmony_ci .set_api_version(VK_MAKE_API_VERSION(0, 0, 1, 0)) 33265db71995Sopenharmony_ci .set_disable_environment("DisableMeIfYouCan")), 33275db71995Sopenharmony_ci "regular_test_layer.json"); 33285db71995Sopenharmony_ci { // global functions 33295db71995Sopenharmony_ci auto layer_props = env.GetLayerProperties(1); 33305db71995Sopenharmony_ci EXPECT_TRUE(string_eq(layer_props[0].layerName, regular_layer_name)); 33315db71995Sopenharmony_ci } 33325db71995Sopenharmony_ci { // 1.0 instance 33335db71995Sopenharmony_ci DebugUtilsLogger log; 33345db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 33355db71995Sopenharmony_ci inst.create_info.set_api_version(1, 0, 0); 33365db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst.create_info, log); 33375db71995Sopenharmony_ci inst.CheckCreate(); 33385db71995Sopenharmony_ci EXPECT_TRUE(log.find(std::string("Insert instance layer \"") + regular_layer_name)); 33395db71995Sopenharmony_ci auto layer_props = inst.GetActiveLayers(inst.GetPhysDev(), 1); 33405db71995Sopenharmony_ci ASSERT_TRUE(string_eq(regular_layer_name, layer_props.at(0).layerName)); 33415db71995Sopenharmony_ci } 33425db71995Sopenharmony_ci { // 1.1 instance 33435db71995Sopenharmony_ci DebugUtilsLogger log; 33445db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 33455db71995Sopenharmony_ci inst.create_info.set_api_version(1, 1, 0); 33465db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst.create_info, log); 33475db71995Sopenharmony_ci inst.CheckCreate(); 33485db71995Sopenharmony_ci EXPECT_TRUE(log.find(std::string("Insert instance layer \"") + regular_layer_name)); 33495db71995Sopenharmony_ci auto layer_props = inst.GetActiveLayers(inst.GetPhysDev(), 1); 33505db71995Sopenharmony_ci ASSERT_TRUE(string_eq(regular_layer_name, layer_props.at(0).layerName)); 33515db71995Sopenharmony_ci } 33525db71995Sopenharmony_ci { // 1.2 instance 33535db71995Sopenharmony_ci DebugUtilsLogger log; 33545db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 33555db71995Sopenharmony_ci inst.create_info.set_api_version(1, 2, 0); 33565db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst.create_info, log); 33575db71995Sopenharmony_ci inst.CheckCreate(); 33585db71995Sopenharmony_ci EXPECT_TRUE(log.find(std::string("Insert instance layer \"") + regular_layer_name)); 33595db71995Sopenharmony_ci auto layer_props = inst.GetActiveLayers(inst.GetPhysDev(), 1); 33605db71995Sopenharmony_ci ASSERT_TRUE(string_eq(regular_layer_name, layer_props.at(0).layerName)); 33615db71995Sopenharmony_ci } 33625db71995Sopenharmony_ci { // application sets its API version to 0 33635db71995Sopenharmony_ci DebugUtilsLogger log; 33645db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 33655db71995Sopenharmony_ci inst.create_info.set_api_version(0); 33665db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst.create_info, log); 33675db71995Sopenharmony_ci inst.CheckCreate(); 33685db71995Sopenharmony_ci EXPECT_TRUE(log.find(std::string("Insert instance layer \"") + regular_layer_name)); 33695db71995Sopenharmony_ci auto layer_props = inst.GetActiveLayers(inst.GetPhysDev(), 1); 33705db71995Sopenharmony_ci ASSERT_TRUE(string_eq(regular_layer_name, layer_props.at(0).layerName)); 33715db71995Sopenharmony_ci } 33725db71995Sopenharmony_ci} 33735db71995Sopenharmony_ci 33745db71995Sopenharmony_ci// Verify that VK_INSTANCE_LAYERS work. To test this, make sure that an explicit layer does not affect an instance until 33755db71995Sopenharmony_ci// it is set with VK_INSTANCE_LAYERS 33765db71995Sopenharmony_ciTEST(TestLayers, InstEnvironEnableExplicitLayer) { 33775db71995Sopenharmony_ci FrameworkEnvironment env; 33785db71995Sopenharmony_ci uint32_t api_version = VK_API_VERSION_1_2; 33795db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA, api_version)) 33805db71995Sopenharmony_ci .set_icd_api_version(api_version) 33815db71995Sopenharmony_ci .add_physical_device(PhysicalDevice{}.set_api_version(api_version).finish()); 33825db71995Sopenharmony_ci 33835db71995Sopenharmony_ci const char* explicit_layer_name = "VK_LAYER_LUNARG_wrap_objects"; 33845db71995Sopenharmony_ci env.add_explicit_layer( 33855db71995Sopenharmony_ci ManifestLayer{}.add_layer( 33865db71995Sopenharmony_ci ManifestLayer::LayerDescription{} 33875db71995Sopenharmony_ci .set_name(explicit_layer_name) 33885db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_WRAP_OBJECTS_3) 33895db71995Sopenharmony_ci .set_api_version(VK_MAKE_API_VERSION(0, 1, 0, 0)) 33905db71995Sopenharmony_ci .add_device_extension({VK_KHR_MAINTENANCE1_EXTENSION_NAME, 1, {"vkTrimCommandPoolKHR"}}) 33915db71995Sopenharmony_ci .add_device_extension({VK_KHR_SHARED_PRESENTABLE_IMAGE_EXTENSION_NAME, 1, {"vkGetSwapchainStatusKHR"}})), 33925db71995Sopenharmony_ci "explicit_wrap_layer_both_dev.json"); 33935db71995Sopenharmony_ci 33945db71995Sopenharmony_ci // First, test an instance/device without the layer forced on. The extensions shouldn't be present and 33955db71995Sopenharmony_ci // the function pointers should be NULL. 33965db71995Sopenharmony_ci InstWrapper inst1{env.vulkan_functions}; 33975db71995Sopenharmony_ci inst1.CheckCreate(); 33985db71995Sopenharmony_ci VkPhysicalDevice phys_dev1 = inst1.GetPhysDev(); 33995db71995Sopenharmony_ci 34005db71995Sopenharmony_ci ASSERT_NO_FATAL_FAILURE(inst1.EnumerateDeviceExtensions(phys_dev1, 0)); 34015db71995Sopenharmony_ci 34025db71995Sopenharmony_ci // Create a device and query the function pointers 34035db71995Sopenharmony_ci DeviceWrapper dev1{inst1}; 34045db71995Sopenharmony_ci dev1.CheckCreate(phys_dev1); 34055db71995Sopenharmony_ci PFN_vkTrimCommandPoolKHR pfn_TrimCommandPoolBefore = dev1.load("vkTrimCommandPoolKHR"); 34065db71995Sopenharmony_ci PFN_vkGetSwapchainStatusKHR pfn_GetSwapchainStatusBefore = dev1.load("vkGetSwapchainStatusKHR"); 34075db71995Sopenharmony_ci handle_assert_null(pfn_TrimCommandPoolBefore); 34085db71995Sopenharmony_ci handle_assert_null(pfn_GetSwapchainStatusBefore); 34095db71995Sopenharmony_ci 34105db71995Sopenharmony_ci // Now setup the instance layer 34115db71995Sopenharmony_ci EnvVarWrapper instance_layers_env_var{"VK_INSTANCE_LAYERS", explicit_layer_name}; 34125db71995Sopenharmony_ci 34135db71995Sopenharmony_ci // Now, test an instance/device with the layer forced on. The extensions should be present and 34145db71995Sopenharmony_ci // the function pointers should be valid. 34155db71995Sopenharmony_ci InstWrapper inst2{env.vulkan_functions}; 34165db71995Sopenharmony_ci inst2.CheckCreate(); 34175db71995Sopenharmony_ci VkPhysicalDevice phys_dev2 = inst2.GetPhysDev(); 34185db71995Sopenharmony_ci 34195db71995Sopenharmony_ci auto layer_extensions = inst2.EnumerateLayerDeviceExtensions(phys_dev2, explicit_layer_name, 2); 34205db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layer_extensions.at(0).extensionName, VK_KHR_MAINTENANCE1_EXTENSION_NAME)); 34215db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layer_extensions.at(1).extensionName, VK_KHR_SHARED_PRESENTABLE_IMAGE_EXTENSION_NAME)); 34225db71995Sopenharmony_ci 34235db71995Sopenharmony_ci DeviceWrapper dev2{inst2}; 34245db71995Sopenharmony_ci dev2.create_info.add_extension(VK_KHR_MAINTENANCE1_EXTENSION_NAME) 34255db71995Sopenharmony_ci .add_extension(VK_KHR_SHARED_PRESENTABLE_IMAGE_EXTENSION_NAME); 34265db71995Sopenharmony_ci dev2.CheckCreate(phys_dev2); 34275db71995Sopenharmony_ci 34285db71995Sopenharmony_ci PFN_vkTrimCommandPoolKHR pfn_TrimCommandPoolAfter = dev2.load("vkTrimCommandPoolKHR"); 34295db71995Sopenharmony_ci PFN_vkGetSwapchainStatusKHR pfn_GetSwapchainStatusAfter = dev2.load("vkGetSwapchainStatusKHR"); 34305db71995Sopenharmony_ci handle_assert_has_value(pfn_TrimCommandPoolAfter); 34315db71995Sopenharmony_ci handle_assert_has_value(pfn_GetSwapchainStatusAfter); 34325db71995Sopenharmony_ci 34335db71995Sopenharmony_ci ASSERT_EQ(VK_ERROR_NATIVE_WINDOW_IN_USE_KHR, pfn_GetSwapchainStatusAfter(dev2.dev, VK_NULL_HANDLE)); 34345db71995Sopenharmony_ci} 34355db71995Sopenharmony_ci 34365db71995Sopenharmony_ci// Verify that VK_LOADER_LAYERS_ENABLE work. To test this, make sure that an explicit layer does not affect an instance until 34375db71995Sopenharmony_ci// it is set with VK_LOADER_LAYERS_ENABLE 34385db71995Sopenharmony_ciTEST(TestLayers, EnvironLayerEnableExplicitLayer) { 34395db71995Sopenharmony_ci FrameworkEnvironment env; 34405db71995Sopenharmony_ci uint32_t api_version = VK_API_VERSION_1_2; 34415db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA, api_version)) 34425db71995Sopenharmony_ci .set_icd_api_version(api_version) 34435db71995Sopenharmony_ci .add_physical_device(PhysicalDevice{}); 34445db71995Sopenharmony_ci 34455db71995Sopenharmony_ci const char* explicit_layer_name_1 = "VK_LAYER_LUNARG_First_layer"; 34465db71995Sopenharmony_ci const char* explicit_json_name_1 = "First_layer.json"; 34475db71995Sopenharmony_ci env.add_explicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} 34485db71995Sopenharmony_ci .set_name(explicit_layer_name_1) 34495db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) 34505db71995Sopenharmony_ci .set_api_version(VK_MAKE_API_VERSION(0, 1, 0, 0))), 34515db71995Sopenharmony_ci explicit_json_name_1); 34525db71995Sopenharmony_ci 34535db71995Sopenharmony_ci const char* explicit_layer_name_2 = "VK_LAYER_LUNARG_Second_layer"; 34545db71995Sopenharmony_ci const char* explicit_json_name_2 = "Second_layer.json"; 34555db71995Sopenharmony_ci env.add_explicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} 34565db71995Sopenharmony_ci .set_name(explicit_layer_name_2) 34575db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) 34585db71995Sopenharmony_ci .set_api_version(VK_MAKE_API_VERSION(0, 1, 0, 0))), 34595db71995Sopenharmony_ci explicit_json_name_2); 34605db71995Sopenharmony_ci 34615db71995Sopenharmony_ci const char* explicit_layer_name_3 = "VK_LAYER_LUNARG_second_test_layer"; 34625db71995Sopenharmony_ci const char* explicit_json_name_3 = "second_test_layer.json"; 34635db71995Sopenharmony_ci env.add_explicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} 34645db71995Sopenharmony_ci .set_name(explicit_layer_name_3) 34655db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) 34665db71995Sopenharmony_ci .set_api_version(VK_MAKE_API_VERSION(0, 1, 0, 0))), 34675db71995Sopenharmony_ci explicit_json_name_3); 34685db71995Sopenharmony_ci 34695db71995Sopenharmony_ci EnvVarWrapper layers_enable_env_var{"VK_LOADER_LAYERS_ENABLE"}; 34705db71995Sopenharmony_ci 34715db71995Sopenharmony_ci // First, test an instance/device without the layer forced on. 34725db71995Sopenharmony_ci InstWrapper inst1{env.vulkan_functions}; 34735db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst1.create_info, env.debug_log); 34745db71995Sopenharmony_ci inst1.CheckCreate(); 34755db71995Sopenharmony_ci 34765db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", explicit_json_name_1)); 34775db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix("Insert instance layer", explicit_layer_name_1)); 34785db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_1, "forced enabled due to env var")); 34795db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_1, "disabled because name matches filter of env var")); 34805db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", explicit_json_name_2)); 34815db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix("Insert instance layer", explicit_layer_name_2)); 34825db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_2, "forced enabled due to env var")); 34835db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_2, "disabled because name matches filter of env var")); 34845db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", explicit_json_name_3)); 34855db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix("Insert instance layer", explicit_layer_name_3)); 34865db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_3, "forced enabled due to env var")); 34875db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_3, "disabled because name matches filter of env var")); 34885db71995Sopenharmony_ci 34895db71995Sopenharmony_ci // Now force on one layer with its full name 34905db71995Sopenharmony_ci // ------------------------------------------ 34915db71995Sopenharmony_ci env.debug_log.clear(); 34925db71995Sopenharmony_ci layers_enable_env_var.set_new_value(explicit_layer_name_1); 34935db71995Sopenharmony_ci 34945db71995Sopenharmony_ci InstWrapper inst2{env.vulkan_functions}; 34955db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst2.create_info, env.debug_log); 34965db71995Sopenharmony_ci inst2.CheckCreate(); 34975db71995Sopenharmony_ci 34985db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", explicit_json_name_1)); 34995db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Insert instance layer", explicit_layer_name_1)); 35005db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_1, "forced enabled due to env var")); 35015db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_1, "disabled because name matches filter of env var")); 35025db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", explicit_json_name_2)); 35035db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix("Insert instance layer", explicit_layer_name_2)); 35045db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_2, "forced enabled due to env var")); 35055db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_2, "disabled because name matches filter of env var")); 35065db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", explicit_json_name_3)); 35075db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix("Insert instance layer", explicit_layer_name_3)); 35085db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_3, "forced enabled due to env var")); 35095db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_3, "disabled because name matches filter of env var")); 35105db71995Sopenharmony_ci 35115db71995Sopenharmony_ci // Match prefix 35125db71995Sopenharmony_ci // ------------------------------------------ 35135db71995Sopenharmony_ci env.debug_log.clear(); 35145db71995Sopenharmony_ci layers_enable_env_var.set_new_value("VK_LAYER_LUNARG_*"); 35155db71995Sopenharmony_ci 35165db71995Sopenharmony_ci InstWrapper inst3{env.vulkan_functions}; 35175db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst3.create_info, env.debug_log); 35185db71995Sopenharmony_ci inst3.CheckCreate(); 35195db71995Sopenharmony_ci 35205db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", explicit_json_name_1)); 35215db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Insert instance layer", explicit_layer_name_1)); 35225db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_1, "forced enabled due to env var")); 35235db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_1, "disabled because name matches filter of env var")); 35245db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", explicit_json_name_2)); 35255db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Insert instance layer", explicit_layer_name_2)); 35265db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_2, "forced enabled due to env var")); 35275db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_2, "disabled because name matches filter of env var")); 35285db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", explicit_json_name_3)); 35295db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Insert instance layer", explicit_layer_name_3)); 35305db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_3, "forced enabled due to env var")); 35315db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_3, "disabled because name matches filter of env var")); 35325db71995Sopenharmony_ci 35335db71995Sopenharmony_ci // Match suffix 35345db71995Sopenharmony_ci // ------------------------------------------ 35355db71995Sopenharmony_ci env.debug_log.clear(); 35365db71995Sopenharmony_ci layers_enable_env_var.set_new_value("*Second_layer"); 35375db71995Sopenharmony_ci 35385db71995Sopenharmony_ci InstWrapper inst4{env.vulkan_functions}; 35395db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst4.create_info, env.debug_log); 35405db71995Sopenharmony_ci inst4.CheckCreate(); 35415db71995Sopenharmony_ci 35425db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", explicit_json_name_1)); 35435db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix("Insert instance layer", explicit_layer_name_1)); 35445db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_1, "forced enabled due to env var")); 35455db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_1, "disabled because name matches filter of env var")); 35465db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", explicit_json_name_2)); 35475db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Insert instance layer", explicit_layer_name_2)); 35485db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_2, "forced enabled due to env var")); 35495db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_2, "disabled because name matches filter of env var")); 35505db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", explicit_json_name_3)); 35515db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix("Insert instance layer", explicit_layer_name_3)); 35525db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_3, "forced enabled due to env var")); 35535db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_3, "disabled because name matches filter of env var")); 35545db71995Sopenharmony_ci 35555db71995Sopenharmony_ci // Match substring 35565db71995Sopenharmony_ci // ------------------------------------------ 35575db71995Sopenharmony_ci env.debug_log.clear(); 35585db71995Sopenharmony_ci layers_enable_env_var.set_new_value("*Second*"); 35595db71995Sopenharmony_ci 35605db71995Sopenharmony_ci InstWrapper inst5{env.vulkan_functions}; 35615db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst5.create_info, env.debug_log); 35625db71995Sopenharmony_ci inst5.CheckCreate(); 35635db71995Sopenharmony_ci 35645db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", explicit_json_name_1)); 35655db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix("Insert instance layer", explicit_layer_name_1)); 35665db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_1, "forced enabled due to env var")); 35675db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_1, "disabled because name matches filter of env var")); 35685db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", explicit_json_name_2)); 35695db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Insert instance layer", explicit_layer_name_2)); 35705db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_2, "forced enabled due to env var")); 35715db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_2, "disabled because name matches filter of env var")); 35725db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", explicit_json_name_3)); 35735db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Insert instance layer", explicit_layer_name_3)); 35745db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_3, "forced enabled due to env var")); 35755db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_3, "disabled because name matches filter of env var")); 35765db71995Sopenharmony_ci 35775db71995Sopenharmony_ci // Match all with star '*' 35785db71995Sopenharmony_ci // ------------------------------------------ 35795db71995Sopenharmony_ci env.debug_log.clear(); 35805db71995Sopenharmony_ci layers_enable_env_var.set_new_value("*"); 35815db71995Sopenharmony_ci 35825db71995Sopenharmony_ci InstWrapper inst6{env.vulkan_functions}; 35835db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst6.create_info, env.debug_log); 35845db71995Sopenharmony_ci inst6.CheckCreate(); 35855db71995Sopenharmony_ci 35865db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", explicit_json_name_1)); 35875db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Insert instance layer", explicit_layer_name_1)); 35885db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_1, "forced enabled due to env var")); 35895db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_1, "disabled because name matches filter of env var")); 35905db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", explicit_json_name_2)); 35915db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Insert instance layer", explicit_layer_name_2)); 35925db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_2, "forced enabled due to env var")); 35935db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_2, "disabled because name matches filter of env var")); 35945db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", explicit_json_name_3)); 35955db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Insert instance layer", explicit_layer_name_3)); 35965db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_3, "forced enabled due to env var")); 35975db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_3, "disabled because name matches filter of env var")); 35985db71995Sopenharmony_ci 35995db71995Sopenharmony_ci // Match all with special name 36005db71995Sopenharmony_ci // ------------------------------------------ 36015db71995Sopenharmony_ci env.debug_log.clear(); 36025db71995Sopenharmony_ci layers_enable_env_var.set_new_value("~all~"); 36035db71995Sopenharmony_ci 36045db71995Sopenharmony_ci InstWrapper inst7{env.vulkan_functions}; 36055db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst7.create_info, env.debug_log); 36065db71995Sopenharmony_ci inst7.CheckCreate(); 36075db71995Sopenharmony_ci 36085db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", explicit_json_name_1)); 36095db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Insert instance layer", explicit_layer_name_1)); 36105db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_1, "forced enabled due to env var")); 36115db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_1, "disabled because name matches filter of env var")); 36125db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", explicit_json_name_2)); 36135db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Insert instance layer", explicit_layer_name_2)); 36145db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_2, "forced enabled due to env var")); 36155db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_2, "disabled because name matches filter of env var")); 36165db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", explicit_json_name_3)); 36175db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Insert instance layer", explicit_layer_name_3)); 36185db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_3, "forced enabled due to env var")); 36195db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_3, "disabled because name matches filter of env var")); 36205db71995Sopenharmony_ci} 36215db71995Sopenharmony_ci 36225db71995Sopenharmony_ci// Verify that VK_LOADER_LAYERS_DISABLE work. To test this, make sure that an explicit layer does not affect an instance until 36235db71995Sopenharmony_ci// it is set with VK_LOADER_LAYERS_DISABLE 36245db71995Sopenharmony_ciTEST(TestLayers, EnvironLayerDisableExplicitLayer) { 36255db71995Sopenharmony_ci FrameworkEnvironment env; 36265db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA, VK_API_VERSION_1_2)) 36275db71995Sopenharmony_ci .set_icd_api_version(VK_API_VERSION_1_2) 36285db71995Sopenharmony_ci .add_physical_device(PhysicalDevice{}); 36295db71995Sopenharmony_ci 36305db71995Sopenharmony_ci const char* explicit_layer_name_1 = "VK_LAYER_LUNARG_First_layer"; 36315db71995Sopenharmony_ci const char* explicit_json_name_1 = "First_layer.json"; 36325db71995Sopenharmony_ci env.add_explicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} 36335db71995Sopenharmony_ci .set_name(explicit_layer_name_1) 36345db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) 36355db71995Sopenharmony_ci .set_api_version(VK_MAKE_API_VERSION(0, 1, 0, 0))), 36365db71995Sopenharmony_ci explicit_json_name_1); 36375db71995Sopenharmony_ci 36385db71995Sopenharmony_ci const char* explicit_layer_name_2 = "VK_LAYER_LUNARG_Second_layer"; 36395db71995Sopenharmony_ci const char* explicit_json_name_2 = "Second_layer.json"; 36405db71995Sopenharmony_ci env.add_explicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} 36415db71995Sopenharmony_ci .set_name(explicit_layer_name_2) 36425db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) 36435db71995Sopenharmony_ci .set_api_version(VK_MAKE_API_VERSION(0, 1, 0, 0))), 36445db71995Sopenharmony_ci explicit_json_name_2); 36455db71995Sopenharmony_ci 36465db71995Sopenharmony_ci const char* explicit_layer_name_3 = "VK_LAYER_LUNARG_Second_test_layer"; 36475db71995Sopenharmony_ci const char* explicit_json_name_3 = "Second_test_layer.json"; 36485db71995Sopenharmony_ci env.add_explicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} 36495db71995Sopenharmony_ci .set_name(explicit_layer_name_3) 36505db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) 36515db71995Sopenharmony_ci .set_api_version(VK_MAKE_API_VERSION(0, 1, 0, 0))), 36525db71995Sopenharmony_ci explicit_json_name_3); 36535db71995Sopenharmony_ci EnvVarWrapper layers_disable_env_var{"VK_LOADER_LAYERS_DISABLE"}; 36545db71995Sopenharmony_ci 36555db71995Sopenharmony_ci // First, test an instance/device without the layer forced on. 36565db71995Sopenharmony_ci InstWrapper inst1{env.vulkan_functions}; 36575db71995Sopenharmony_ci inst1.create_info.add_layer(explicit_layer_name_1).add_layer(explicit_layer_name_2).add_layer(explicit_layer_name_3); 36585db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst1.create_info, env.debug_log); 36595db71995Sopenharmony_ci ASSERT_NO_FATAL_FAILURE(inst1.CheckCreate()); 36605db71995Sopenharmony_ci 36615db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", explicit_json_name_1)); 36625db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Insert instance layer", explicit_layer_name_1)); 36635db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_1, "forced enabled due to env var")); 36645db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_1, "disabled because name matches filter of env var")); 36655db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", explicit_json_name_2)); 36665db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Insert instance layer", explicit_layer_name_2)); 36675db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_2, "forced enabled due to env var")); 36685db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_2, "disabled because name matches filter of env var")); 36695db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", explicit_json_name_3)); 36705db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Insert instance layer", explicit_layer_name_3)); 36715db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_3, "forced enabled due to env var")); 36725db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_3, "disabled because name matches filter of env var")); 36735db71995Sopenharmony_ci 36745db71995Sopenharmony_ci // Now force on one layer with its full name 36755db71995Sopenharmony_ci // ------------------------------------------ 36765db71995Sopenharmony_ci env.debug_log.clear(); 36775db71995Sopenharmony_ci layers_disable_env_var.set_new_value(explicit_layer_name_1); 36785db71995Sopenharmony_ci 36795db71995Sopenharmony_ci InstWrapper inst2{env.vulkan_functions}; 36805db71995Sopenharmony_ci inst2.create_info.add_layer(explicit_layer_name_1).add_layer(explicit_layer_name_2).add_layer(explicit_layer_name_3); 36815db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst2.create_info, env.debug_log); 36825db71995Sopenharmony_ci ASSERT_NO_FATAL_FAILURE(inst2.CheckCreate(VK_ERROR_LAYER_NOT_PRESENT)); 36835db71995Sopenharmony_ci 36845db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", explicit_json_name_1)); 36855db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix("Insert instance layer", explicit_layer_name_1)); 36865db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_1, "forced enabled due to env var")); 36875db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_1, "disabled because name matches filter of env var")); 36885db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", explicit_json_name_2)); 36895db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix("Insert instance layer", explicit_layer_name_2)); 36905db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_2, "forced enabled due to env var")); 36915db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_2, "disabled because name matches filter of env var")); 36925db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", explicit_json_name_3)); 36935db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix("Insert instance layer", explicit_layer_name_3)); 36945db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_3, "forced enabled due to env var")); 36955db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_3, "disabled because name matches filter of env var")); 36965db71995Sopenharmony_ci 36975db71995Sopenharmony_ci // Match prefix 36985db71995Sopenharmony_ci // ------------------------------------------ 36995db71995Sopenharmony_ci env.debug_log.clear(); 37005db71995Sopenharmony_ci layers_disable_env_var.set_new_value("VK_LAYER_LUNARG_*"); 37015db71995Sopenharmony_ci 37025db71995Sopenharmony_ci InstWrapper inst3{env.vulkan_functions}; 37035db71995Sopenharmony_ci inst3.create_info.add_layer(explicit_layer_name_1).add_layer(explicit_layer_name_2).add_layer(explicit_layer_name_3); 37045db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst3.create_info, env.debug_log); 37055db71995Sopenharmony_ci ASSERT_NO_FATAL_FAILURE(inst3.CheckCreate(VK_ERROR_LAYER_NOT_PRESENT)); 37065db71995Sopenharmony_ci 37075db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", explicit_json_name_1)); 37085db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix("Insert instance layer", explicit_layer_name_1)); 37095db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_1, "forced enabled due to env var")); 37105db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_1, "disabled because name matches filter of env var")); 37115db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", explicit_json_name_2)); 37125db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix("Insert instance layer", explicit_layer_name_2)); 37135db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_2, "forced enabled due to env var")); 37145db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_2, "disabled because name matches filter of env var")); 37155db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", explicit_json_name_3)); 37165db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix("Insert instance layer", explicit_layer_name_3)); 37175db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_3, "forced enabled due to env var")); 37185db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_3, "disabled because name matches filter of env var")); 37195db71995Sopenharmony_ci 37205db71995Sopenharmony_ci // Match suffix 37215db71995Sopenharmony_ci // ------------------------------------------ 37225db71995Sopenharmony_ci env.debug_log.clear(); 37235db71995Sopenharmony_ci layers_disable_env_var.set_new_value("*Second_layer"); 37245db71995Sopenharmony_ci 37255db71995Sopenharmony_ci InstWrapper inst4{env.vulkan_functions}; 37265db71995Sopenharmony_ci inst4.create_info.add_layer(explicit_layer_name_1).add_layer(explicit_layer_name_2).add_layer(explicit_layer_name_3); 37275db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst4.create_info, env.debug_log); 37285db71995Sopenharmony_ci ASSERT_NO_FATAL_FAILURE(inst4.CheckCreate(VK_ERROR_LAYER_NOT_PRESENT)); 37295db71995Sopenharmony_ci 37305db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", explicit_json_name_1)); 37315db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix("Insert instance layer", explicit_layer_name_1)); 37325db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_1, "forced enabled due to env var")); 37335db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_1, "disabled because name matches filter of env var")); 37345db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", explicit_json_name_2)); 37355db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix("Insert instance layer", explicit_layer_name_2)); 37365db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_2, "forced enabled due to env var")); 37375db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_2, "disabled because name matches filter of env var")); 37385db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", explicit_json_name_3)); 37395db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix("Insert instance layer", explicit_layer_name_3)); 37405db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_3, "forced enabled due to env var")); 37415db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_3, "disabled because name matches filter of env var")); 37425db71995Sopenharmony_ci 37435db71995Sopenharmony_ci // Match substring 37445db71995Sopenharmony_ci // ------------------------------------------ 37455db71995Sopenharmony_ci env.debug_log.clear(); 37465db71995Sopenharmony_ci layers_disable_env_var.set_new_value("*Second*"); 37475db71995Sopenharmony_ci 37485db71995Sopenharmony_ci InstWrapper inst5{env.vulkan_functions}; 37495db71995Sopenharmony_ci inst5.create_info.add_layer(explicit_layer_name_1).add_layer(explicit_layer_name_2).add_layer(explicit_layer_name_3); 37505db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst5.create_info, env.debug_log); 37515db71995Sopenharmony_ci ASSERT_NO_FATAL_FAILURE(inst5.CheckCreate(VK_ERROR_LAYER_NOT_PRESENT)); 37525db71995Sopenharmony_ci 37535db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", explicit_json_name_1)); 37545db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix("Insert instance layer", explicit_layer_name_1)); 37555db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_1, "forced enabled due to env var")); 37565db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_1, "disabled because name matches filter of env var")); 37575db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", explicit_json_name_2)); 37585db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix("Insert instance layer", explicit_layer_name_2)); 37595db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_2, "forced enabled due to env var")); 37605db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_2, "disabled because name matches filter of env var")); 37615db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", explicit_json_name_3)); 37625db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix("Insert instance layer", explicit_layer_name_3)); 37635db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_3, "forced enabled due to env var")); 37645db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_3, "disabled because name matches filter of env var")); 37655db71995Sopenharmony_ci 37665db71995Sopenharmony_ci // Match all with star '*' 37675db71995Sopenharmony_ci // ------------------------------------------ 37685db71995Sopenharmony_ci env.debug_log.clear(); 37695db71995Sopenharmony_ci layers_disable_env_var.set_new_value("*"); 37705db71995Sopenharmony_ci 37715db71995Sopenharmony_ci InstWrapper inst6{env.vulkan_functions}; 37725db71995Sopenharmony_ci inst6.create_info.add_layer(explicit_layer_name_1).add_layer(explicit_layer_name_2).add_layer(explicit_layer_name_3); 37735db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst6.create_info, env.debug_log); 37745db71995Sopenharmony_ci ASSERT_NO_FATAL_FAILURE(inst6.CheckCreate(VK_ERROR_LAYER_NOT_PRESENT)); 37755db71995Sopenharmony_ci 37765db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", explicit_json_name_1)); 37775db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix("Insert instance layer", explicit_layer_name_1)); 37785db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_1, "forced enabled due to env var")); 37795db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_1, "disabled because name matches filter of env var")); 37805db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", explicit_json_name_2)); 37815db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix("Insert instance layer", explicit_layer_name_2)); 37825db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_2, "forced enabled due to env var")); 37835db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_2, "disabled because name matches filter of env var")); 37845db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", explicit_json_name_3)); 37855db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix("Insert instance layer", explicit_layer_name_3)); 37865db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_3, "forced enabled due to env var")); 37875db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_3, "disabled because name matches filter of env var")); 37885db71995Sopenharmony_ci 37895db71995Sopenharmony_ci // Match all with special name 37905db71995Sopenharmony_ci // ------------------------------------------ 37915db71995Sopenharmony_ci env.debug_log.clear(); 37925db71995Sopenharmony_ci layers_disable_env_var.set_new_value("~all~"); 37935db71995Sopenharmony_ci 37945db71995Sopenharmony_ci InstWrapper inst7{env.vulkan_functions}; 37955db71995Sopenharmony_ci inst7.create_info.add_layer(explicit_layer_name_1).add_layer(explicit_layer_name_2).add_layer(explicit_layer_name_3); 37965db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst7.create_info, env.debug_log); 37975db71995Sopenharmony_ci ASSERT_NO_FATAL_FAILURE(inst7.CheckCreate(VK_ERROR_LAYER_NOT_PRESENT)); 37985db71995Sopenharmony_ci 37995db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", explicit_json_name_1)); 38005db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix("Insert instance layer", explicit_layer_name_1)); 38015db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_1, "forced enabled due to env var")); 38025db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_1, "disabled because name matches filter of env var")); 38035db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", explicit_json_name_2)); 38045db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix("Insert instance layer", explicit_layer_name_2)); 38055db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_2, "forced enabled due to env var")); 38065db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_2, "disabled because name matches filter of env var")); 38075db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", explicit_json_name_3)); 38085db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix("Insert instance layer", explicit_layer_name_3)); 38095db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_3, "forced enabled due to env var")); 38105db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_3, "disabled because name matches filter of env var")); 38115db71995Sopenharmony_ci 38125db71995Sopenharmony_ci // Match explicit special name 38135db71995Sopenharmony_ci // ------------------------------------------ 38145db71995Sopenharmony_ci env.debug_log.clear(); 38155db71995Sopenharmony_ci layers_disable_env_var.set_new_value("~explicit~"); 38165db71995Sopenharmony_ci 38175db71995Sopenharmony_ci InstWrapper inst8{env.vulkan_functions}; 38185db71995Sopenharmony_ci inst8.create_info.add_layer(explicit_layer_name_1).add_layer(explicit_layer_name_2).add_layer(explicit_layer_name_3); 38195db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst8.create_info, env.debug_log); 38205db71995Sopenharmony_ci ASSERT_NO_FATAL_FAILURE(inst8.CheckCreate(VK_ERROR_LAYER_NOT_PRESENT)); 38215db71995Sopenharmony_ci 38225db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", explicit_json_name_1)); 38235db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix("Insert instance layer", explicit_layer_name_1)); 38245db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_1, "forced enabled due to env var")); 38255db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_1, "disabled because name matches filter of env var")); 38265db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", explicit_json_name_2)); 38275db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix("Insert instance layer", explicit_layer_name_2)); 38285db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_2, "forced enabled due to env var")); 38295db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_2, "disabled because name matches filter of env var")); 38305db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", explicit_json_name_3)); 38315db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix("Insert instance layer", explicit_layer_name_3)); 38325db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_3, "forced enabled due to env var")); 38335db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_3, "disabled because name matches filter of env var")); 38345db71995Sopenharmony_ci 38355db71995Sopenharmony_ci // No match implicit special name 38365db71995Sopenharmony_ci // ------------------------------------------ 38375db71995Sopenharmony_ci env.debug_log.clear(); 38385db71995Sopenharmony_ci layers_disable_env_var.set_new_value("~implicit~"); 38395db71995Sopenharmony_ci 38405db71995Sopenharmony_ci InstWrapper inst9{env.vulkan_functions}; 38415db71995Sopenharmony_ci inst9.create_info.add_layer(explicit_layer_name_1).add_layer(explicit_layer_name_2).add_layer(explicit_layer_name_3); 38425db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst9.create_info, env.debug_log); 38435db71995Sopenharmony_ci ASSERT_NO_FATAL_FAILURE(inst9.CheckCreate()); 38445db71995Sopenharmony_ci 38455db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", explicit_json_name_1)); 38465db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Insert instance layer", explicit_layer_name_1)); 38475db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_1, "forced enabled due to env var")); 38485db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_1, "disabled because name matches filter of env var")); 38495db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", explicit_json_name_2)); 38505db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Insert instance layer", explicit_layer_name_2)); 38515db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_2, "forced enabled due to env var")); 38525db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_2, "disabled because name matches filter of env var")); 38535db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", explicit_json_name_3)); 38545db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Insert instance layer", explicit_layer_name_3)); 38555db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_3, "forced enabled due to env var")); 38565db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_3, "disabled because name matches filter of env var")); 38575db71995Sopenharmony_ci} 38585db71995Sopenharmony_ci 38595db71995Sopenharmony_ci// Verify that VK_LOADER_LAYERS_ENABLE + VK_LOADER_LAYERS_DISABLE work.(results in the layer still being 38605db71995Sopenharmony_ci// enabled) 38615db71995Sopenharmony_ciTEST(TestLayers, EnvironLayerEnableDisableExplicitLayer) { 38625db71995Sopenharmony_ci FrameworkEnvironment env; 38635db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA, VK_API_VERSION_1_2)) 38645db71995Sopenharmony_ci .set_icd_api_version(VK_API_VERSION_1_2); 38655db71995Sopenharmony_ci 38665db71995Sopenharmony_ci const char* explicit_layer_name_1 = "VK_LAYER_LUNARG_First_layer"; 38675db71995Sopenharmony_ci const char* explicit_json_name_1 = "First_layer.json"; 38685db71995Sopenharmony_ci env.add_explicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} 38695db71995Sopenharmony_ci .set_name(explicit_layer_name_1) 38705db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) 38715db71995Sopenharmony_ci .set_api_version(VK_MAKE_API_VERSION(0, 1, 0, 0))), 38725db71995Sopenharmony_ci explicit_json_name_1); 38735db71995Sopenharmony_ci 38745db71995Sopenharmony_ci const char* explicit_layer_name_2 = "VK_LAYER_LUNARG_Second_layer"; 38755db71995Sopenharmony_ci const char* explicit_json_name_2 = "Second_layer.json"; 38765db71995Sopenharmony_ci env.add_explicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} 38775db71995Sopenharmony_ci .set_name(explicit_layer_name_2) 38785db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) 38795db71995Sopenharmony_ci .set_api_version(VK_MAKE_API_VERSION(0, 1, 0, 0))), 38805db71995Sopenharmony_ci explicit_json_name_2); 38815db71995Sopenharmony_ci 38825db71995Sopenharmony_ci const char* explicit_layer_name_3 = "VK_LAYER_LUNARG_Second_test_layer"; 38835db71995Sopenharmony_ci const char* explicit_json_name_3 = "Second_test_layer.json"; 38845db71995Sopenharmony_ci env.add_explicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} 38855db71995Sopenharmony_ci .set_name(explicit_layer_name_3) 38865db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) 38875db71995Sopenharmony_ci .set_api_version(VK_MAKE_API_VERSION(0, 1, 0, 0))), 38885db71995Sopenharmony_ci explicit_json_name_3); 38895db71995Sopenharmony_ci 38905db71995Sopenharmony_ci EnvVarWrapper layers_enable_env_var{"VK_LOADER_LAYERS_ENABLE"}; 38915db71995Sopenharmony_ci EnvVarWrapper layers_disable_env_var{"VK_LOADER_LAYERS_DISABLE"}; 38925db71995Sopenharmony_ci 38935db71995Sopenharmony_ci // First, test an instance/device without the layer forced on. 38945db71995Sopenharmony_ci InstWrapper inst1{env.vulkan_functions}; 38955db71995Sopenharmony_ci inst1.create_info.add_layer(explicit_layer_name_1).add_layer(explicit_layer_name_2).add_layer(explicit_layer_name_3); 38965db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst1.create_info, env.debug_log); 38975db71995Sopenharmony_ci ASSERT_NO_FATAL_FAILURE(inst1.CheckCreate()); 38985db71995Sopenharmony_ci 38995db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", explicit_json_name_1)); 39005db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Insert instance layer", explicit_layer_name_1)); 39015db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_1, "forced enabled due to env var")); 39025db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_1, "disabled because name matches filter of env var")); 39035db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", explicit_json_name_2)); 39045db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Insert instance layer", explicit_layer_name_2)); 39055db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_2, "forced enabled due to env var")); 39065db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_2, "disabled because name matches filter of env var")); 39075db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", explicit_json_name_3)); 39085db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Insert instance layer", explicit_layer_name_3)); 39095db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_3, "forced enabled due to env var")); 39105db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_3, "disabled because name matches filter of env var")); 39115db71995Sopenharmony_ci 39125db71995Sopenharmony_ci // Disable 2 but enable 1 39135db71995Sopenharmony_ci // ------------------------------------------ 39145db71995Sopenharmony_ci env.debug_log.clear(); 39155db71995Sopenharmony_ci layers_disable_env_var.set_new_value("*Second*"); 39165db71995Sopenharmony_ci layers_enable_env_var.set_new_value("*test_layer"); 39175db71995Sopenharmony_ci 39185db71995Sopenharmony_ci InstWrapper inst2{env.vulkan_functions}; 39195db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst2.create_info, env.debug_log); 39205db71995Sopenharmony_ci ASSERT_NO_FATAL_FAILURE(inst2.CheckCreate()); 39215db71995Sopenharmony_ci 39225db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", explicit_json_name_1)); 39235db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix("Insert instance layer", explicit_layer_name_1)); 39245db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_1, "forced enabled due to env var")); 39255db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_1, "disabled because name matches filter of env var")); 39265db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", explicit_json_name_2)); 39275db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix("Insert instance layer", explicit_layer_name_2)); 39285db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_2, "forced enabled due to env var")); 39295db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_2, "disabled because name matches filter of env var")); 39305db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", explicit_json_name_3)); 39315db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Insert instance layer", explicit_layer_name_3)); 39325db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_3, "forced enabled due to env var")); 39335db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_3, "disabled because name matches filter of env var")); 39345db71995Sopenharmony_ci 39355db71995Sopenharmony_ci // Disable all but enable 2 39365db71995Sopenharmony_ci // ------------------------------------------ 39375db71995Sopenharmony_ci env.debug_log.clear(); 39385db71995Sopenharmony_ci layers_disable_env_var.set_new_value("*"); 39395db71995Sopenharmony_ci layers_enable_env_var.set_new_value("*Second*"); 39405db71995Sopenharmony_ci 39415db71995Sopenharmony_ci InstWrapper inst3{env.vulkan_functions}; 39425db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst3.create_info, env.debug_log); 39435db71995Sopenharmony_ci ASSERT_NO_FATAL_FAILURE(inst3.CheckCreate()); 39445db71995Sopenharmony_ci 39455db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", explicit_json_name_1)); 39465db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix("Insert instance layer", explicit_layer_name_1)); 39475db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_1, "forced enabled due to env var")); 39485db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_1, "disabled because name matches filter of env var")); 39495db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", explicit_json_name_2)); 39505db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Insert instance layer", explicit_layer_name_2)); 39515db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_2, "forced enabled due to env var")); 39525db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_2, "disabled because name matches filter of env var")); 39535db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", explicit_json_name_3)); 39545db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Insert instance layer", explicit_layer_name_3)); 39555db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_3, "forced enabled due to env var")); 39565db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_3, "disabled because name matches filter of env var")); 39575db71995Sopenharmony_ci 39585db71995Sopenharmony_ci // Disable all but enable 2 39595db71995Sopenharmony_ci // ------------------------------------------ 39605db71995Sopenharmony_ci env.debug_log.clear(); 39615db71995Sopenharmony_ci layers_disable_env_var.set_new_value("~all~"); 39625db71995Sopenharmony_ci layers_enable_env_var.set_new_value("*Second*"); 39635db71995Sopenharmony_ci 39645db71995Sopenharmony_ci InstWrapper inst4{env.vulkan_functions}; 39655db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst4.create_info, env.debug_log); 39665db71995Sopenharmony_ci ASSERT_NO_FATAL_FAILURE(inst4.CheckCreate()); 39675db71995Sopenharmony_ci 39685db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", explicit_json_name_1)); 39695db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix("Insert instance layer", explicit_layer_name_1)); 39705db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_1, "forced enabled due to env var")); 39715db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_1, "disabled because name matches filter of env var")); 39725db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", explicit_json_name_2)); 39735db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Insert instance layer", explicit_layer_name_2)); 39745db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_2, "forced enabled due to env var")); 39755db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_2, "disabled because name matches filter of env var")); 39765db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", explicit_json_name_3)); 39775db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Insert instance layer", explicit_layer_name_3)); 39785db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_3, "forced enabled due to env var")); 39795db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_3, "disabled because name matches filter of env var")); 39805db71995Sopenharmony_ci 39815db71995Sopenharmony_ci // Disable explicit but enable 2 39825db71995Sopenharmony_ci // ------------------------------------------ 39835db71995Sopenharmony_ci env.debug_log.clear(); 39845db71995Sopenharmony_ci layers_disable_env_var.set_new_value("~explicit~"); 39855db71995Sopenharmony_ci layers_enable_env_var.set_new_value("*Second*"); 39865db71995Sopenharmony_ci 39875db71995Sopenharmony_ci InstWrapper inst5{env.vulkan_functions}; 39885db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst5.create_info, env.debug_log); 39895db71995Sopenharmony_ci ASSERT_NO_FATAL_FAILURE(inst5.CheckCreate()); 39905db71995Sopenharmony_ci 39915db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", explicit_json_name_1)); 39925db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix("Insert instance layer", explicit_layer_name_1)); 39935db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_1, "forced enabled due to env var")); 39945db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_1, "disabled because name matches filter of env var")); 39955db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", explicit_json_name_2)); 39965db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Insert instance layer", explicit_layer_name_2)); 39975db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_2, "forced enabled due to env var")); 39985db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_2, "disabled because name matches filter of env var")); 39995db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", explicit_json_name_3)); 40005db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Insert instance layer", explicit_layer_name_3)); 40015db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_3, "forced enabled due to env var")); 40025db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_3, "disabled because name matches filter of env var")); 40035db71995Sopenharmony_ci 40045db71995Sopenharmony_ci // Disable implicit but enable 2 (should still be everything) 40055db71995Sopenharmony_ci // ------------------------------------------ 40065db71995Sopenharmony_ci env.debug_log.clear(); 40075db71995Sopenharmony_ci layers_disable_env_var.set_new_value("~implicit~"); 40085db71995Sopenharmony_ci layers_enable_env_var.set_new_value("*Second*"); 40095db71995Sopenharmony_ci 40105db71995Sopenharmony_ci InstWrapper inst6{env.vulkan_functions}; 40115db71995Sopenharmony_ci inst6.create_info.add_layer(explicit_layer_name_1).add_layer(explicit_layer_name_2).add_layer(explicit_layer_name_3); 40125db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst6.create_info, env.debug_log); 40135db71995Sopenharmony_ci ASSERT_NO_FATAL_FAILURE(inst6.CheckCreate()); 40145db71995Sopenharmony_ci 40155db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", explicit_json_name_1)); 40165db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Insert instance layer", explicit_layer_name_1)); 40175db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_1, "forced enabled due to env var")); 40185db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_1, "disabled because name matches filter of env var")); 40195db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", explicit_json_name_2)); 40205db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Insert instance layer", explicit_layer_name_2)); 40215db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_2, "forced enabled due to env var")); 40225db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_2, "disabled because name matches filter of env var")); 40235db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", explicit_json_name_3)); 40245db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Insert instance layer", explicit_layer_name_3)); 40255db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_3, "forced enabled due to env var")); 40265db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_3, "disabled because name matches filter of env var")); 40275db71995Sopenharmony_ci 40285db71995Sopenharmony_ci // Disable explicit but enable all 40295db71995Sopenharmony_ci // ------------------------------------------ 40305db71995Sopenharmony_ci env.debug_log.clear(); 40315db71995Sopenharmony_ci layers_disable_env_var.set_new_value("~explicit~"); 40325db71995Sopenharmony_ci layers_enable_env_var.set_new_value("*"); 40335db71995Sopenharmony_ci 40345db71995Sopenharmony_ci InstWrapper inst7{env.vulkan_functions}; 40355db71995Sopenharmony_ci inst7.create_info.add_layer(explicit_layer_name_1).add_layer(explicit_layer_name_2).add_layer(explicit_layer_name_3); 40365db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst7.create_info, env.debug_log); 40375db71995Sopenharmony_ci ASSERT_NO_FATAL_FAILURE(inst7.CheckCreate()); 40385db71995Sopenharmony_ci 40395db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", explicit_json_name_1)); 40405db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Insert instance layer", explicit_layer_name_1)); 40415db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_1, "forced enabled due to env var")); 40425db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_1, "disabled because name matches filter of env var")); 40435db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", explicit_json_name_2)); 40445db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Insert instance layer", explicit_layer_name_2)); 40455db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_2, "forced enabled due to env var")); 40465db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_2, "disabled because name matches filter of env var")); 40475db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", explicit_json_name_3)); 40485db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Insert instance layer", explicit_layer_name_3)); 40495db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_3, "forced enabled due to env var")); 40505db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_3, "disabled because name matches filter of env var")); 40515db71995Sopenharmony_ci} 40525db71995Sopenharmony_ci 40535db71995Sopenharmony_ci// Verify that VK_INSTANCE_LAYERS + VK_LOADER_LAYERS_DISABLE work.(results in the layer still being 40545db71995Sopenharmony_ci// enabled) 40555db71995Sopenharmony_ciTEST(TestLayers, EnvironVkInstanceLayersAndDisableFilters) { 40565db71995Sopenharmony_ci FrameworkEnvironment env; 40575db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA, VK_API_VERSION_1_2)) 40585db71995Sopenharmony_ci .set_icd_api_version(VK_API_VERSION_1_2); 40595db71995Sopenharmony_ci 40605db71995Sopenharmony_ci const char* explicit_layer_name_1 = "VK_LAYER_LUNARG_First_layer"; 40615db71995Sopenharmony_ci const char* explicit_json_name_1 = "First_layer.json"; 40625db71995Sopenharmony_ci env.add_explicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} 40635db71995Sopenharmony_ci .set_name(explicit_layer_name_1) 40645db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) 40655db71995Sopenharmony_ci .set_api_version(VK_MAKE_API_VERSION(0, 1, 0, 0))), 40665db71995Sopenharmony_ci explicit_json_name_1); 40675db71995Sopenharmony_ci 40685db71995Sopenharmony_ci const char* explicit_layer_name_2 = "VK_LAYER_LUNARG_Second_layer"; 40695db71995Sopenharmony_ci const char* explicit_json_name_2 = "Second_layer.json"; 40705db71995Sopenharmony_ci env.add_explicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} 40715db71995Sopenharmony_ci .set_name(explicit_layer_name_2) 40725db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) 40735db71995Sopenharmony_ci .set_api_version(VK_MAKE_API_VERSION(0, 1, 0, 0))), 40745db71995Sopenharmony_ci explicit_json_name_2); 40755db71995Sopenharmony_ci 40765db71995Sopenharmony_ci EnvVarWrapper layers_enable_env_var{"VK_INSTANCE_LAYERS"}; 40775db71995Sopenharmony_ci EnvVarWrapper layers_disable_env_var{"VK_LOADER_LAYERS_DISABLE"}; 40785db71995Sopenharmony_ci 40795db71995Sopenharmony_ci // First, test an instance/device without the layer forced on. 40805db71995Sopenharmony_ci InstWrapper inst1{env.vulkan_functions}; 40815db71995Sopenharmony_ci inst1.create_info.add_layer(explicit_layer_name_1); 40825db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst1.create_info, env.debug_log); 40835db71995Sopenharmony_ci ASSERT_NO_FATAL_FAILURE(inst1.CheckCreate()); 40845db71995Sopenharmony_ci 40855db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", explicit_json_name_1)); 40865db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Insert instance layer", explicit_layer_name_1)); 40875db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_1, "forced enabled due to env var")); 40885db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_1, "disabled because name matches filter of env var")); 40895db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", explicit_json_name_2)); 40905db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix("Insert instance layer", explicit_layer_name_2)); 40915db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_2, "forced enabled due to env var")); 40925db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_2, "disabled because name matches filter of env var")); 40935db71995Sopenharmony_ci 40945db71995Sopenharmony_ci // Enable the non-default enabled layer with VK_INSTANCE_LAYERS 40955db71995Sopenharmony_ci // ------------------------------------------ 40965db71995Sopenharmony_ci env.debug_log.clear(); 40975db71995Sopenharmony_ci layers_enable_env_var.set_new_value(explicit_layer_name_2); 40985db71995Sopenharmony_ci 40995db71995Sopenharmony_ci InstWrapper inst2{env.vulkan_functions}; 41005db71995Sopenharmony_ci inst2.create_info.add_layer(explicit_layer_name_1); 41015db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst2.create_info, env.debug_log); 41025db71995Sopenharmony_ci ASSERT_NO_FATAL_FAILURE(inst2.CheckCreate()); 41035db71995Sopenharmony_ci 41045db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", explicit_json_name_1)); 41055db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Insert instance layer", explicit_layer_name_1)); 41065db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_1, "forced enabled due to env var")); 41075db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_1, "disabled because name matches filter of env var")); 41085db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", explicit_json_name_2)); 41095db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Insert instance layer", explicit_layer_name_2)); 41105db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_2, "forced enabled due to env var")); 41115db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_2, "disabled because name matches filter of env var")); 41125db71995Sopenharmony_ci 41135db71995Sopenharmony_ci // Try to disable all 41145db71995Sopenharmony_ci // ------------------------------------------ 41155db71995Sopenharmony_ci env.debug_log.clear(); 41165db71995Sopenharmony_ci layers_disable_env_var.set_new_value("*"); 41175db71995Sopenharmony_ci 41185db71995Sopenharmony_ci InstWrapper inst3{env.vulkan_functions}; 41195db71995Sopenharmony_ci inst3.create_info.add_layer(explicit_layer_name_1); 41205db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst3.create_info, env.debug_log); 41215db71995Sopenharmony_ci ASSERT_NO_FATAL_FAILURE(inst3.CheckCreate(VK_ERROR_LAYER_NOT_PRESENT)); 41225db71995Sopenharmony_ci 41235db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", explicit_json_name_1)); 41245db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix("Insert instance layer", explicit_layer_name_1)); 41255db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_1, "forced enabled due to env var")); 41265db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_1, "disabled because name matches filter of env var")); 41275db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", explicit_json_name_2)); 41285db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix("Insert instance layer", explicit_layer_name_2)); 41295db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_2, "forced enabled due to env var")); 41305db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_2, "disabled because name matches filter of env var")); 41315db71995Sopenharmony_ci} 41325db71995Sopenharmony_ci 41335db71995Sopenharmony_ci// Verify that layers enabled through VK_INSTANCE_LAYERS which were not found get the proper error message 41345db71995Sopenharmony_ciTEST(TestLayers, NonExistantLayerInVK_INSTANCE_LAYERS) { 41355db71995Sopenharmony_ci FrameworkEnvironment env; 41365db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA)).add_physical_device({}); 41375db71995Sopenharmony_ci 41385db71995Sopenharmony_ci const char* layer_name = "VK_LAYER_test_layer"; 41395db71995Sopenharmony_ci env.add_explicit_layer( 41405db71995Sopenharmony_ci ManifestLayer{}.add_layer( 41415db71995Sopenharmony_ci ManifestLayer::LayerDescription{}.set_name(layer_name).set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)), 41425db71995Sopenharmony_ci "test_layer.json"); 41435db71995Sopenharmony_ci 41445db71995Sopenharmony_ci EnvVarWrapper layers_enable_env_var{"VK_INSTANCE_LAYERS", "VK_LAYER_I_dont_exist"}; 41455db71995Sopenharmony_ci { 41465db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 41475db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst.create_info, env.debug_log); 41485db71995Sopenharmony_ci inst.CheckCreate(); 41495db71995Sopenharmony_ci 41505db71995Sopenharmony_ci ASSERT_TRUE( 41515db71995Sopenharmony_ci env.debug_log.find("Layer \"VK_LAYER_I_dont_exist\" was not found but was requested by env var VK_INSTANCE_LAYERS!")); 41525db71995Sopenharmony_ci ASSERT_NO_FATAL_FAILURE(inst.GetActiveLayers(inst.GetPhysDev(), 0)); 41535db71995Sopenharmony_ci } 41545db71995Sopenharmony_ci // Make sure layers that do exist are loaded 41555db71995Sopenharmony_ci env.debug_log.clear(); 41565db71995Sopenharmony_ci layers_enable_env_var.add_to_list(layer_name); 41575db71995Sopenharmony_ci { 41585db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 41595db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst.create_info, env.debug_log); 41605db71995Sopenharmony_ci inst.CheckCreate(); 41615db71995Sopenharmony_ci ASSERT_TRUE( 41625db71995Sopenharmony_ci env.debug_log.find("Layer \"VK_LAYER_I_dont_exist\" was not found but was requested by env var VK_INSTANCE_LAYERS!")); 41635db71995Sopenharmony_ci auto layer_props = inst.GetActiveLayers(inst.GetPhysDev(), 1); 41645db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layer_props.at(0).layerName, layer_name)); 41655db71995Sopenharmony_ci } 41665db71995Sopenharmony_ci // Make sure that if the layer appears twice in the env-var nothing bad happens 41675db71995Sopenharmony_ci env.debug_log.clear(); 41685db71995Sopenharmony_ci layers_enable_env_var.add_to_list("VK_LAYER_I_dont_exist"); 41695db71995Sopenharmony_ci { 41705db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 41715db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst.create_info, env.debug_log); 41725db71995Sopenharmony_ci inst.CheckCreate(); 41735db71995Sopenharmony_ci ASSERT_TRUE( 41745db71995Sopenharmony_ci env.debug_log.find("Layer \"VK_LAYER_I_dont_exist\" was not found but was requested by env var VK_INSTANCE_LAYERS!")); 41755db71995Sopenharmony_ci auto layer_props = inst.GetActiveLayers(inst.GetPhysDev(), 1); 41765db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layer_props.at(0).layerName, layer_name)); 41775db71995Sopenharmony_ci } 41785db71995Sopenharmony_ci} 41795db71995Sopenharmony_ci 41805db71995Sopenharmony_ci// Verify that if the same layer appears twice in VK_INSTANCE_LAYERS nothing bad happens 41815db71995Sopenharmony_ciTEST(TestLayers, DuplicatesInEnvironVK_INSTANCE_LAYERS) { 41825db71995Sopenharmony_ci FrameworkEnvironment env; 41835db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA)).add_physical_device({}); 41845db71995Sopenharmony_ci 41855db71995Sopenharmony_ci const char* layer_name = "VK_LAYER_test_layer"; 41865db71995Sopenharmony_ci env.add_explicit_layer( 41875db71995Sopenharmony_ci ManifestLayer{}.add_layer( 41885db71995Sopenharmony_ci ManifestLayer::LayerDescription{}.set_name(layer_name).set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)), 41895db71995Sopenharmony_ci "test_layer.json"); 41905db71995Sopenharmony_ci 41915db71995Sopenharmony_ci EnvVarWrapper layers_enable_env_var{"VK_INSTANCE_LAYERS"}; 41925db71995Sopenharmony_ci 41935db71995Sopenharmony_ci layers_enable_env_var.add_to_list(layer_name); 41945db71995Sopenharmony_ci layers_enable_env_var.add_to_list(layer_name); 41955db71995Sopenharmony_ci 41965db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 41975db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst.create_info, env.debug_log); 41985db71995Sopenharmony_ci inst.CheckCreate(); 41995db71995Sopenharmony_ci auto layer_props = inst.GetActiveLayers(inst.GetPhysDev(), 1); 42005db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layer_props.at(0).layerName, layer_name)); 42015db71995Sopenharmony_ci} 42025db71995Sopenharmony_ci 42035db71995Sopenharmony_ciTEST(TestLayers, AppEnabledExplicitLayerFails) { 42045db71995Sopenharmony_ci FrameworkEnvironment env; 42055db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA, VK_API_VERSION_1_2)) 42065db71995Sopenharmony_ci .set_icd_api_version(VK_API_VERSION_1_2); 42075db71995Sopenharmony_ci 42085db71995Sopenharmony_ci const char* explicit_layer_name_1 = "VK_LAYER_LUNARG_First_layer"; 42095db71995Sopenharmony_ci const char* explicit_json_name_1 = "First_layer.json"; 42105db71995Sopenharmony_ci env.add_explicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} 42115db71995Sopenharmony_ci .set_name(explicit_layer_name_1) 42125db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) 42135db71995Sopenharmony_ci .set_api_version(VK_MAKE_API_VERSION(0, 1, 0, 0))), 42145db71995Sopenharmony_ci explicit_json_name_1); 42155db71995Sopenharmony_ci 42165db71995Sopenharmony_ci env.debug_log.clear(); 42175db71995Sopenharmony_ci EnvVarWrapper layers_disable_env_var{"VK_LOADER_LAYERS_DISABLE", explicit_layer_name_1}; 42185db71995Sopenharmony_ci 42195db71995Sopenharmony_ci ASSERT_NO_FATAL_FAILURE(env.GetLayerProperties(0)); 42205db71995Sopenharmony_ci 42215db71995Sopenharmony_ci InstWrapper inst3{env.vulkan_functions}; 42225db71995Sopenharmony_ci inst3.create_info.add_layer(explicit_layer_name_1); 42235db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst3.create_info, env.debug_log); 42245db71995Sopenharmony_ci ASSERT_NO_FATAL_FAILURE(inst3.CheckCreate(VK_ERROR_LAYER_NOT_PRESENT)); 42255db71995Sopenharmony_ci 42265db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", explicit_json_name_1)); 42275db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix("Insert instance layer ", explicit_layer_name_1)); 42285db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_1, "forced enabled due to env var")); 42295db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_1, "disabled because name matches filter of env var")); 42305db71995Sopenharmony_ci} 42315db71995Sopenharmony_ci 42325db71995Sopenharmony_ciTEST(TestLayers, OverrideEnabledExplicitLayerWithDisableFilter) { 42335db71995Sopenharmony_ci FrameworkEnvironment env; 42345db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA, VK_API_VERSION_1_2)) 42355db71995Sopenharmony_ci .set_icd_api_version(VK_API_VERSION_1_2); 42365db71995Sopenharmony_ci 42375db71995Sopenharmony_ci const char* explicit_layer_name_1 = "VK_LAYER_LUNARG_First_layer"; 42385db71995Sopenharmony_ci const char* explicit_json_name_1 = "First_layer.json"; 42395db71995Sopenharmony_ci env.add_explicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} 42405db71995Sopenharmony_ci .set_name(explicit_layer_name_1) 42415db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) 42425db71995Sopenharmony_ci .set_api_version(VK_MAKE_API_VERSION(0, 1, 1, 0))), 42435db71995Sopenharmony_ci explicit_json_name_1); 42445db71995Sopenharmony_ci env.add_implicit_layer( 42455db71995Sopenharmony_ci ManifestLayer{}.set_file_format_version({1, 2, 0}).add_layer(ManifestLayer::LayerDescription{} 42465db71995Sopenharmony_ci .set_name(lunarg_meta_layer_name) 42475db71995Sopenharmony_ci .set_api_version(VK_MAKE_API_VERSION(0, 1, 1, 0)) 42485db71995Sopenharmony_ci .add_component_layer(explicit_layer_name_1) 42495db71995Sopenharmony_ci .set_disable_environment("DisableMeIfYouCan")), 42505db71995Sopenharmony_ci "meta_test_layer.json"); 42515db71995Sopenharmony_ci 42525db71995Sopenharmony_ci env.debug_log.clear(); 42535db71995Sopenharmony_ci EnvVarWrapper layers_disable_env_var{"VK_LOADER_LAYERS_DISABLE", explicit_layer_name_1}; 42545db71995Sopenharmony_ci 42555db71995Sopenharmony_ci auto layers = env.GetLayerProperties(1); 42565db71995Sopenharmony_ci EXPECT_TRUE(string_eq(lunarg_meta_layer_name, layers[0].layerName)); 42575db71995Sopenharmony_ci 42585db71995Sopenharmony_ci { // both override layer and Disable env var 42595db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 42605db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst.create_info, env.debug_log); 42615db71995Sopenharmony_ci inst.CheckCreate(); 42625db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", explicit_json_name_1)); 42635db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix("Insert instance layer ", explicit_layer_name_1)); 42645db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_1, "forced enabled due to env var")); 42655db71995Sopenharmony_ci ASSERT_TRUE( 42665db71995Sopenharmony_ci env.debug_log.find_prefix_then_postfix(explicit_layer_name_1, "disabled because name matches filter of env var")); 42675db71995Sopenharmony_ci } 42685db71995Sopenharmony_ci env.debug_log.clear(); 42695db71995Sopenharmony_ci { // Now try to enable the explicit layer as well 42705db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 42715db71995Sopenharmony_ci inst.create_info.add_layer(explicit_layer_name_1); 42725db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst.create_info, env.debug_log); 42735db71995Sopenharmony_ci inst.CheckCreate(VK_ERROR_LAYER_NOT_PRESENT); 42745db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", explicit_json_name_1)); 42755db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix("Insert instance layer ", explicit_layer_name_1)); 42765db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_1, "forced enabled due to env var")); 42775db71995Sopenharmony_ci ASSERT_TRUE( 42785db71995Sopenharmony_ci env.debug_log.find_prefix_then_postfix(explicit_layer_name_1, "disabled because name matches filter of env var")); 42795db71995Sopenharmony_ci } 42805db71995Sopenharmony_ci} 42815db71995Sopenharmony_ci 42825db71995Sopenharmony_ciTEST(TestLayers, OverrideEnabledExplicitLayerWithDisableFilterForOverrideLayer) { 42835db71995Sopenharmony_ci FrameworkEnvironment env; 42845db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA, VK_API_VERSION_1_2)) 42855db71995Sopenharmony_ci .set_icd_api_version(VK_API_VERSION_1_2); 42865db71995Sopenharmony_ci 42875db71995Sopenharmony_ci const char* explicit_layer_name_1 = "VK_LAYER_LUNARG_First_layer"; 42885db71995Sopenharmony_ci const char* explicit_json_name_1 = "First_layer.json"; 42895db71995Sopenharmony_ci env.add_explicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} 42905db71995Sopenharmony_ci .set_name(explicit_layer_name_1) 42915db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) 42925db71995Sopenharmony_ci .set_api_version(VK_MAKE_API_VERSION(0, 1, 1, 0))), 42935db71995Sopenharmony_ci explicit_json_name_1); 42945db71995Sopenharmony_ci env.add_implicit_layer( 42955db71995Sopenharmony_ci ManifestLayer{}.set_file_format_version({1, 2, 0}).add_layer(ManifestLayer::LayerDescription{} 42965db71995Sopenharmony_ci .set_name(lunarg_meta_layer_name) 42975db71995Sopenharmony_ci .set_api_version(VK_MAKE_API_VERSION(0, 1, 1, 0)) 42985db71995Sopenharmony_ci .add_component_layer(explicit_layer_name_1) 42995db71995Sopenharmony_ci .set_disable_environment("DisableMeIfYouCan")), 43005db71995Sopenharmony_ci "meta_test_layer.json"); 43015db71995Sopenharmony_ci 43025db71995Sopenharmony_ci env.debug_log.clear(); 43035db71995Sopenharmony_ci EnvVarWrapper layers_disable_env_var{"VK_LOADER_LAYERS_DISABLE", lunarg_meta_layer_name}; 43045db71995Sopenharmony_ci 43055db71995Sopenharmony_ci auto layers = env.GetLayerProperties(1); 43065db71995Sopenharmony_ci EXPECT_TRUE(string_eq(explicit_layer_name_1, layers[0].layerName)); 43075db71995Sopenharmony_ci 43085db71995Sopenharmony_ci { // both override layer and Disable env var 43095db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 43105db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst.create_info, env.debug_log); 43115db71995Sopenharmony_ci inst.CheckCreate(); 43125db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", explicit_json_name_1)); 43135db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix("Insert instance layer ", explicit_layer_name_1)); 43145db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_1, "forced enabled due to env var")); 43155db71995Sopenharmony_ci ASSERT_TRUE( 43165db71995Sopenharmony_ci env.debug_log.find_prefix_then_postfix(lunarg_meta_layer_name, "disabled because name matches filter of env var")); 43175db71995Sopenharmony_ci } 43185db71995Sopenharmony_ci env.debug_log.clear(); 43195db71995Sopenharmony_ci { // Now try to enable the explicit layer as well 43205db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 43215db71995Sopenharmony_ci inst.create_info.add_layer(explicit_layer_name_1); 43225db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst.create_info, env.debug_log); 43235db71995Sopenharmony_ci inst.CheckCreate(); 43245db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", explicit_json_name_1)); 43255db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Insert instance layer ", explicit_layer_name_1)); 43265db71995Sopenharmony_ci ASSERT_FALSE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_1, "forced enabled due to env var")); 43275db71995Sopenharmony_ci ASSERT_TRUE( 43285db71995Sopenharmony_ci env.debug_log.find_prefix_then_postfix(lunarg_meta_layer_name, "disabled because name matches filter of env var")); 43295db71995Sopenharmony_ci } 43305db71995Sopenharmony_ci} 43315db71995Sopenharmony_ci 43325db71995Sopenharmony_ciTEST(TestLayers, OverrideBlacklistedLayerWithEnableFilter) { 43335db71995Sopenharmony_ci FrameworkEnvironment env; 43345db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA, VK_API_VERSION_1_2)) 43355db71995Sopenharmony_ci .set_icd_api_version(VK_API_VERSION_1_2); 43365db71995Sopenharmony_ci 43375db71995Sopenharmony_ci const char* explicit_layer_name_1 = "VK_LAYER_LUNARG_First_layer"; 43385db71995Sopenharmony_ci const char* explicit_json_name_1 = "First_layer.json"; 43395db71995Sopenharmony_ci env.add_explicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} 43405db71995Sopenharmony_ci .set_name(explicit_layer_name_1) 43415db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) 43425db71995Sopenharmony_ci .set_api_version(VK_MAKE_API_VERSION(0, 1, 1, 0))), 43435db71995Sopenharmony_ci explicit_json_name_1); 43445db71995Sopenharmony_ci env.add_implicit_layer( 43455db71995Sopenharmony_ci ManifestLayer{}.set_file_format_version({1, 2, 0}).add_layer(ManifestLayer::LayerDescription{} 43465db71995Sopenharmony_ci .set_name(lunarg_meta_layer_name) 43475db71995Sopenharmony_ci .set_api_version(VK_MAKE_API_VERSION(0, 1, 1, 0)) 43485db71995Sopenharmony_ci .add_blacklisted_layer(explicit_layer_name_1) 43495db71995Sopenharmony_ci .set_disable_environment("DisableMeIfYouCan")), 43505db71995Sopenharmony_ci "meta_test_layer.json"); 43515db71995Sopenharmony_ci 43525db71995Sopenharmony_ci env.debug_log.clear(); 43535db71995Sopenharmony_ci EnvVarWrapper layers_enable_env_var{"VK_LOADER_LAYERS_ENABLE", explicit_layer_name_1}; 43545db71995Sopenharmony_ci 43555db71995Sopenharmony_ci auto layers = env.GetLayerProperties(1); 43565db71995Sopenharmony_ci EXPECT_TRUE(string_eq(explicit_layer_name_1, layers[0].layerName)); 43575db71995Sopenharmony_ci { 43585db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 43595db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst.create_info, env.debug_log); 43605db71995Sopenharmony_ci ASSERT_NO_FATAL_FAILURE(inst.CheckCreate()); 43615db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Insert instance layer ", explicit_layer_name_1)); 43625db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", explicit_json_name_1)); 43635db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_1, "forced enabled due to env var")); 43645db71995Sopenharmony_ci ASSERT_FALSE( 43655db71995Sopenharmony_ci env.debug_log.find_prefix_then_postfix(explicit_layer_name_1, "disabled because name matches filter of env var")); 43665db71995Sopenharmony_ci } 43675db71995Sopenharmony_ci env.debug_log.clear(); 43685db71995Sopenharmony_ci { // Try to enable a blacklisted layer 43695db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 43705db71995Sopenharmony_ci inst.create_info.add_layer(explicit_layer_name_1); 43715db71995Sopenharmony_ci FillDebugUtilsCreateDetails(inst.create_info, env.debug_log); 43725db71995Sopenharmony_ci ASSERT_NO_FATAL_FAILURE(inst.CheckCreate()); 43735db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Insert instance layer ", explicit_layer_name_1)); 43745db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix("Found manifest file", explicit_json_name_1)); 43755db71995Sopenharmony_ci ASSERT_TRUE(env.debug_log.find_prefix_then_postfix(explicit_layer_name_1, "forced enabled due to env var")); 43765db71995Sopenharmony_ci ASSERT_FALSE( 43775db71995Sopenharmony_ci env.debug_log.find_prefix_then_postfix(explicit_layer_name_1, "disabled because name matches filter of env var")); 43785db71995Sopenharmony_ci } 43795db71995Sopenharmony_ci} 43805db71995Sopenharmony_ci 43815db71995Sopenharmony_ci// Add a device layer, should not work 43825db71995Sopenharmony_ciTEST(TestLayers, DoNotUseDeviceLayer) { 43835db71995Sopenharmony_ci FrameworkEnvironment env; 43845db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA, VK_API_VERSION_1_2)) 43855db71995Sopenharmony_ci .set_icd_api_version(VK_API_VERSION_1_2) 43865db71995Sopenharmony_ci .add_physical_device(PhysicalDevice{}.set_api_version(VK_API_VERSION_1_2).finish()); 43875db71995Sopenharmony_ci 43885db71995Sopenharmony_ci const char* explicit_layer_name = "VK_LAYER_LUNARG_wrap_objects"; 43895db71995Sopenharmony_ci env.add_explicit_layer( 43905db71995Sopenharmony_ci ManifestLayer{}.add_layer( 43915db71995Sopenharmony_ci ManifestLayer::LayerDescription{} 43925db71995Sopenharmony_ci .set_name(explicit_layer_name) 43935db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_WRAP_OBJECTS_3) 43945db71995Sopenharmony_ci .set_api_version(VK_MAKE_API_VERSION(0, 1, 0, 0)) 43955db71995Sopenharmony_ci .add_device_extension({VK_KHR_MAINTENANCE1_EXTENSION_NAME, 1, {"vkTrimCommandPoolKHR"}}) 43965db71995Sopenharmony_ci .add_device_extension({VK_KHR_SHARED_PRESENTABLE_IMAGE_EXTENSION_NAME, 1, {"vkGetSwapchainStatusKHR"}})), 43975db71995Sopenharmony_ci "explicit_wrap_layer_both_dev.json"); 43985db71995Sopenharmony_ci 43995db71995Sopenharmony_ci // First, test an instance/device without the layer forced on. The extensions shouldn't be present and 44005db71995Sopenharmony_ci // the function pointers should be NULL. 44015db71995Sopenharmony_ci InstWrapper inst1{env.vulkan_functions}; 44025db71995Sopenharmony_ci inst1.CheckCreate(); 44035db71995Sopenharmony_ci VkPhysicalDevice phys_dev1 = inst1.GetPhysDev(); 44045db71995Sopenharmony_ci 44055db71995Sopenharmony_ci // Make sure the extensions in the layer aren't present 44065db71995Sopenharmony_ci ASSERT_NO_FATAL_FAILURE(inst1.EnumerateDeviceExtensions(phys_dev1, 0)); 44075db71995Sopenharmony_ci 44085db71995Sopenharmony_ci // Create a device and query the function pointers 44095db71995Sopenharmony_ci DeviceWrapper dev1{inst1}; 44105db71995Sopenharmony_ci dev1.CheckCreate(phys_dev1); 44115db71995Sopenharmony_ci PFN_vkTrimCommandPoolKHR pfn_TrimCommandPoolBefore = dev1.load("vkTrimCommandPoolKHR"); 44125db71995Sopenharmony_ci PFN_vkGetSwapchainStatusKHR pfn_GetSwapchainStatusBefore = dev1.load("vkGetSwapchainStatusKHR"); 44135db71995Sopenharmony_ci handle_assert_null(pfn_TrimCommandPoolBefore); 44145db71995Sopenharmony_ci handle_assert_null(pfn_GetSwapchainStatusBefore); 44155db71995Sopenharmony_ci 44165db71995Sopenharmony_ci // Now, test an instance/device with the layer forced on. The extensions should be present and 44175db71995Sopenharmony_ci // the function pointers should be valid. 44185db71995Sopenharmony_ci InstWrapper inst2{env.vulkan_functions}; 44195db71995Sopenharmony_ci inst2.CheckCreate(); 44205db71995Sopenharmony_ci VkPhysicalDevice phys_dev2 = inst2.GetPhysDev(); 44215db71995Sopenharmony_ci 44225db71995Sopenharmony_ci // Make sure the extensions in the layer aren't present 44235db71995Sopenharmony_ci ASSERT_NO_FATAL_FAILURE(inst2.EnumerateDeviceExtensions(phys_dev2, 0)); 44245db71995Sopenharmony_ci 44255db71995Sopenharmony_ci DeviceWrapper dev2{inst2}; 44265db71995Sopenharmony_ci dev2.create_info.add_extension(VK_KHR_MAINTENANCE1_EXTENSION_NAME) 44275db71995Sopenharmony_ci .add_extension(VK_KHR_SHARED_PRESENTABLE_IMAGE_EXTENSION_NAME) 44285db71995Sopenharmony_ci .add_layer(explicit_layer_name); 44295db71995Sopenharmony_ci dev2.CheckCreate(phys_dev2, VK_ERROR_EXTENSION_NOT_PRESENT); 44305db71995Sopenharmony_ci 44315db71995Sopenharmony_ci DeviceWrapper dev3{inst2}; 44325db71995Sopenharmony_ci dev3.create_info.add_layer(explicit_layer_name); 44335db71995Sopenharmony_ci dev3.CheckCreate(phys_dev2); 44345db71995Sopenharmony_ci 44355db71995Sopenharmony_ci PFN_vkTrimCommandPoolKHR pfn_TrimCommandPoolAfter = dev3.load("vkTrimCommandPoolKHR"); 44365db71995Sopenharmony_ci PFN_vkGetSwapchainStatusKHR pfn_GetSwapchainStatusAfter = dev3.load("vkGetSwapchainStatusKHR"); 44375db71995Sopenharmony_ci handle_assert_null(pfn_TrimCommandPoolAfter); 44385db71995Sopenharmony_ci handle_assert_null(pfn_GetSwapchainStatusAfter); 44395db71995Sopenharmony_ci} 44405db71995Sopenharmony_ci 44415db71995Sopenharmony_ci// Make sure that a layer enabled as both an instance and device layer works properly. 44425db71995Sopenharmony_ciTEST(TestLayers, InstanceAndDeviceLayer) { 44435db71995Sopenharmony_ci FrameworkEnvironment env; 44445db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA, VK_API_VERSION_1_2)) 44455db71995Sopenharmony_ci .set_icd_api_version(VK_API_VERSION_1_2) 44465db71995Sopenharmony_ci .add_physical_device(PhysicalDevice{}.set_api_version(VK_API_VERSION_1_2).finish()); 44475db71995Sopenharmony_ci 44485db71995Sopenharmony_ci const char* explicit_layer_name = "VK_LAYER_LUNARG_wrap_objects"; 44495db71995Sopenharmony_ci env.add_explicit_layer( 44505db71995Sopenharmony_ci ManifestLayer{}.add_layer( 44515db71995Sopenharmony_ci ManifestLayer::LayerDescription{} 44525db71995Sopenharmony_ci .set_name(explicit_layer_name) 44535db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_WRAP_OBJECTS_3) 44545db71995Sopenharmony_ci .set_api_version(VK_MAKE_API_VERSION(0, 1, 0, 0)) 44555db71995Sopenharmony_ci .add_device_extension({VK_KHR_MAINTENANCE1_EXTENSION_NAME, 1, {"vkTrimCommandPoolKHR"}}) 44565db71995Sopenharmony_ci .add_device_extension({VK_KHR_SHARED_PRESENTABLE_IMAGE_EXTENSION_NAME, 1, {"vkGetSwapchainStatusKHR"}})), 44575db71995Sopenharmony_ci "explicit_wrap_layer_both_dev.json"); 44585db71995Sopenharmony_ci 44595db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 44605db71995Sopenharmony_ci inst.create_info.add_layer(explicit_layer_name); 44615db71995Sopenharmony_ci inst.CheckCreate(); 44625db71995Sopenharmony_ci VkPhysicalDevice phys_dev = inst.GetPhysDev(); 44635db71995Sopenharmony_ci 44645db71995Sopenharmony_ci DeviceWrapper dev{inst}; 44655db71995Sopenharmony_ci dev.create_info.add_extension(VK_KHR_MAINTENANCE1_EXTENSION_NAME) 44665db71995Sopenharmony_ci .add_extension(VK_KHR_SHARED_PRESENTABLE_IMAGE_EXTENSION_NAME) 44675db71995Sopenharmony_ci .add_layer(explicit_layer_name); 44685db71995Sopenharmony_ci dev.CheckCreate(phys_dev); 44695db71995Sopenharmony_ci 44705db71995Sopenharmony_ci PFN_vkTrimCommandPoolKHR pfn_TrimCommandPoolAfter = dev.load("vkTrimCommandPoolKHR"); 44715db71995Sopenharmony_ci PFN_vkGetSwapchainStatusKHR pfn_GetSwapchainStatusAfter = dev.load("vkGetSwapchainStatusKHR"); 44725db71995Sopenharmony_ci handle_assert_has_value(pfn_TrimCommandPoolAfter); 44735db71995Sopenharmony_ci handle_assert_has_value(pfn_GetSwapchainStatusAfter); 44745db71995Sopenharmony_ci 44755db71995Sopenharmony_ci ASSERT_EQ(VK_ERROR_NATIVE_WINDOW_IN_USE_KHR, pfn_GetSwapchainStatusAfter(dev.dev, VK_NULL_HANDLE)); 44765db71995Sopenharmony_ci} 44775db71995Sopenharmony_ci 44785db71995Sopenharmony_ci// Make sure loader does not throw an error for a device layer that is not present 44795db71995Sopenharmony_ciTEST(TestLayers, DeviceLayerNotPresent) { 44805db71995Sopenharmony_ci FrameworkEnvironment env; 44815db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA, VK_API_VERSION_1_2)) 44825db71995Sopenharmony_ci .set_icd_api_version(VK_API_VERSION_1_2) 44835db71995Sopenharmony_ci .add_physical_device(PhysicalDevice{}.set_api_version(VK_API_VERSION_1_2).finish()); 44845db71995Sopenharmony_ci const char* explicit_layer_name = "VK_LAYER_LUNARG_wrap_objects"; 44855db71995Sopenharmony_ci 44865db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 44875db71995Sopenharmony_ci inst.CheckCreate(); 44885db71995Sopenharmony_ci VkPhysicalDevice phys_dev = inst.GetPhysDev(); 44895db71995Sopenharmony_ci 44905db71995Sopenharmony_ci DeviceWrapper dev{inst}; 44915db71995Sopenharmony_ci dev.create_info.add_layer(explicit_layer_name); 44925db71995Sopenharmony_ci dev.CheckCreate(phys_dev); 44935db71995Sopenharmony_ci} 44945db71995Sopenharmony_ci 44955db71995Sopenharmony_ciTEST(LayerPhysDeviceMod, AddPhysicalDevices) { 44965db71995Sopenharmony_ci FrameworkEnvironment env; 44975db71995Sopenharmony_ci env.add_implicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} 44985db71995Sopenharmony_ci .set_name("VK_LAYER_LunarG_add_phys_dev") 44995db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) 45005db71995Sopenharmony_ci .set_api_version(VK_API_VERSION_1_1) 45015db71995Sopenharmony_ci .set_disable_environment("TEST_DISABLE_ADD_PHYS_DEV")), 45025db71995Sopenharmony_ci "test_layer_add.json"); 45035db71995Sopenharmony_ci 45045db71995Sopenharmony_ci auto& layer = env.get_test_layer(0); 45055db71995Sopenharmony_ci layer.set_add_phys_devs(true); 45065db71995Sopenharmony_ci 45075db71995Sopenharmony_ci for (uint32_t icd = 0; icd < 2; ++icd) { 45085db71995Sopenharmony_ci auto& cur_icd = 45095db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2, VK_API_VERSION_1_2)).set_icd_api_version(VK_API_VERSION_1_2); 45105db71995Sopenharmony_ci VkPhysicalDeviceProperties properties{}; 45115db71995Sopenharmony_ci properties.apiVersion = VK_API_VERSION_1_2; 45125db71995Sopenharmony_ci properties.vendorID = 0x11000000 + (icd << 6); 45135db71995Sopenharmony_ci for (uint32_t dev = 0; dev < 3; ++dev) { 45145db71995Sopenharmony_ci properties.deviceID = properties.vendorID + dev; 45155db71995Sopenharmony_ci properties.deviceType = VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU; 45165db71995Sopenharmony_ci auto dev_name = std::string("physdev_") + std::to_string(icd) + "_" + std::to_string(dev); 45175db71995Sopenharmony_ci#if defined(_WIN32) 45185db71995Sopenharmony_ci strncpy_s(properties.deviceName, VK_MAX_PHYSICAL_DEVICE_NAME_SIZE, dev_name.c_str(), dev_name.length() + 1); 45195db71995Sopenharmony_ci#else 45205db71995Sopenharmony_ci strncpy(properties.deviceName, dev_name.c_str(), VK_MAX_PHYSICAL_DEVICE_NAME_SIZE); 45215db71995Sopenharmony_ci#endif 45225db71995Sopenharmony_ci cur_icd.add_physical_device({}); 45235db71995Sopenharmony_ci cur_icd.physical_devices.back().set_properties(properties); 45245db71995Sopenharmony_ci } 45255db71995Sopenharmony_ci cur_icd.physical_device_groups.emplace_back(cur_icd.physical_devices[0]); 45265db71995Sopenharmony_ci cur_icd.physical_device_groups.emplace_back(cur_icd.physical_devices[1]); 45275db71995Sopenharmony_ci cur_icd.physical_device_groups.back().use_physical_device(cur_icd.physical_devices[2]); 45285db71995Sopenharmony_ci } 45295db71995Sopenharmony_ci const uint32_t icd_devices = 6; 45305db71995Sopenharmony_ci 45315db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 45325db71995Sopenharmony_ci inst.create_info.set_api_version(VK_API_VERSION_1_1); 45335db71995Sopenharmony_ci inst.CheckCreate(); 45345db71995Sopenharmony_ci 45355db71995Sopenharmony_ci uint32_t dev_count = 0; 45365db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, inst->vkEnumeratePhysicalDevices(inst, &dev_count, nullptr)); 45375db71995Sopenharmony_ci ASSERT_GT(dev_count, icd_devices); 45385db71995Sopenharmony_ci 45395db71995Sopenharmony_ci auto not_exp_physical_devices = std::vector<VkPhysicalDevice>(icd_devices); 45405db71995Sopenharmony_ci uint32_t returned_phys_dev_count = icd_devices; 45415db71995Sopenharmony_ci ASSERT_EQ(VK_INCOMPLETE, inst->vkEnumeratePhysicalDevices(inst, &returned_phys_dev_count, not_exp_physical_devices.data())); 45425db71995Sopenharmony_ci ASSERT_EQ(icd_devices, returned_phys_dev_count); 45435db71995Sopenharmony_ci 45445db71995Sopenharmony_ci auto physical_devices = std::vector<VkPhysicalDevice>(dev_count); 45455db71995Sopenharmony_ci returned_phys_dev_count = dev_count; 45465db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, inst->vkEnumeratePhysicalDevices(inst, &returned_phys_dev_count, physical_devices.data())); 45475db71995Sopenharmony_ci ASSERT_EQ(dev_count, returned_phys_dev_count); 45485db71995Sopenharmony_ci 45495db71995Sopenharmony_ci uint32_t diff_count = dev_count - icd_devices; 45505db71995Sopenharmony_ci uint32_t found_incomplete = 0; 45515db71995Sopenharmony_ci uint32_t found_added_count = 0; 45525db71995Sopenharmony_ci for (uint32_t dev = 0; dev < dev_count; ++dev) { 45535db71995Sopenharmony_ci VkPhysicalDeviceProperties props{}; 45545db71995Sopenharmony_ci inst->vkGetPhysicalDeviceProperties(physical_devices[dev], &props); 45555db71995Sopenharmony_ci if (string_eq(props.deviceName, "physdev_added_xx")) { 45565db71995Sopenharmony_ci found_added_count++; 45575db71995Sopenharmony_ci } 45585db71995Sopenharmony_ci for (uint32_t incomp = 0; incomp < icd_devices; ++incomp) { 45595db71995Sopenharmony_ci if (not_exp_physical_devices[incomp] == physical_devices[dev]) { 45605db71995Sopenharmony_ci found_incomplete++; 45615db71995Sopenharmony_ci break; 45625db71995Sopenharmony_ci } 45635db71995Sopenharmony_ci } 45645db71995Sopenharmony_ci } 45655db71995Sopenharmony_ci 45665db71995Sopenharmony_ci // We should have added the number of diff items, and the incomplete count should match the number of 45675db71995Sopenharmony_ci // original physical devices. 45685db71995Sopenharmony_ci ASSERT_EQ(found_added_count, diff_count); 45695db71995Sopenharmony_ci ASSERT_EQ(found_incomplete, icd_devices); 45705db71995Sopenharmony_ci} 45715db71995Sopenharmony_ci 45725db71995Sopenharmony_ciTEST(LayerPhysDeviceMod, RemovePhysicalDevices) { 45735db71995Sopenharmony_ci FrameworkEnvironment env; 45745db71995Sopenharmony_ci env.add_implicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} 45755db71995Sopenharmony_ci .set_name("VK_LAYER_LunarG_remove_phys_dev") 45765db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) 45775db71995Sopenharmony_ci .set_api_version(VK_API_VERSION_1_1) 45785db71995Sopenharmony_ci .set_disable_environment("TEST_DISABLE_REMOVE_PHYS_DEV")), 45795db71995Sopenharmony_ci "test_layer_remove.json"); 45805db71995Sopenharmony_ci 45815db71995Sopenharmony_ci auto& layer = env.get_test_layer(0); 45825db71995Sopenharmony_ci layer.set_remove_phys_devs(true); 45835db71995Sopenharmony_ci 45845db71995Sopenharmony_ci for (uint32_t icd = 0; icd < 2; ++icd) { 45855db71995Sopenharmony_ci auto& cur_icd = 45865db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2, VK_API_VERSION_1_2)).set_icd_api_version(VK_API_VERSION_1_2); 45875db71995Sopenharmony_ci VkPhysicalDeviceProperties properties{}; 45885db71995Sopenharmony_ci properties.apiVersion = VK_API_VERSION_1_2; 45895db71995Sopenharmony_ci properties.vendorID = 0x11000000 + (icd << 6); 45905db71995Sopenharmony_ci for (uint32_t dev = 0; dev < 3; ++dev) { 45915db71995Sopenharmony_ci properties.deviceID = properties.vendorID + dev; 45925db71995Sopenharmony_ci properties.deviceType = VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU; 45935db71995Sopenharmony_ci auto dev_name = std::string("physdev_") + std::to_string(icd) + "_" + std::to_string(dev); 45945db71995Sopenharmony_ci#if defined(_WIN32) 45955db71995Sopenharmony_ci strncpy_s(properties.deviceName, VK_MAX_PHYSICAL_DEVICE_NAME_SIZE, dev_name.c_str(), dev_name.length() + 1); 45965db71995Sopenharmony_ci#else 45975db71995Sopenharmony_ci strncpy(properties.deviceName, dev_name.c_str(), VK_MAX_PHYSICAL_DEVICE_NAME_SIZE); 45985db71995Sopenharmony_ci#endif 45995db71995Sopenharmony_ci cur_icd.add_physical_device({}); 46005db71995Sopenharmony_ci cur_icd.physical_devices.back().set_properties(properties); 46015db71995Sopenharmony_ci } 46025db71995Sopenharmony_ci cur_icd.physical_device_groups.emplace_back(cur_icd.physical_devices[0]); 46035db71995Sopenharmony_ci cur_icd.physical_device_groups.emplace_back(cur_icd.physical_devices[1]); 46045db71995Sopenharmony_ci cur_icd.physical_device_groups.back().use_physical_device(cur_icd.physical_devices[2]); 46055db71995Sopenharmony_ci } 46065db71995Sopenharmony_ci const uint32_t icd_devices = 6; 46075db71995Sopenharmony_ci 46085db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 46095db71995Sopenharmony_ci inst.create_info.set_api_version(VK_API_VERSION_1_1); 46105db71995Sopenharmony_ci inst.CheckCreate(); 46115db71995Sopenharmony_ci 46125db71995Sopenharmony_ci uint32_t dev_count = 0; 46135db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, inst->vkEnumeratePhysicalDevices(inst, &dev_count, nullptr)); 46145db71995Sopenharmony_ci ASSERT_LT(dev_count, icd_devices); 46155db71995Sopenharmony_ci 46165db71995Sopenharmony_ci auto physical_devices = std::vector<VkPhysicalDevice>(dev_count); 46175db71995Sopenharmony_ci uint32_t returned_phys_dev_count = dev_count; 46185db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, inst->vkEnumeratePhysicalDevices(inst, &returned_phys_dev_count, physical_devices.data())); 46195db71995Sopenharmony_ci ASSERT_EQ(dev_count, returned_phys_dev_count); 46205db71995Sopenharmony_ci} 46215db71995Sopenharmony_ci 46225db71995Sopenharmony_ciTEST(LayerPhysDeviceMod, ReorderPhysicalDevices) { 46235db71995Sopenharmony_ci FrameworkEnvironment env; 46245db71995Sopenharmony_ci env.add_implicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} 46255db71995Sopenharmony_ci .set_name("VK_LAYER_LunarG_reorder_phys_dev") 46265db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) 46275db71995Sopenharmony_ci .set_api_version(VK_API_VERSION_1_1) 46285db71995Sopenharmony_ci .set_disable_environment("TEST_DISABLE_REORDER_PHYS_DEV")), 46295db71995Sopenharmony_ci "test_layer_reorder.json"); 46305db71995Sopenharmony_ci 46315db71995Sopenharmony_ci auto& layer = env.get_test_layer(0); 46325db71995Sopenharmony_ci layer.set_reorder_phys_devs(true); 46335db71995Sopenharmony_ci 46345db71995Sopenharmony_ci for (uint32_t icd = 0; icd < 2; ++icd) { 46355db71995Sopenharmony_ci auto& cur_icd = 46365db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2, VK_API_VERSION_1_2)).set_icd_api_version(VK_API_VERSION_1_2); 46375db71995Sopenharmony_ci VkPhysicalDeviceProperties properties{}; 46385db71995Sopenharmony_ci properties.apiVersion = VK_API_VERSION_1_2; 46395db71995Sopenharmony_ci properties.vendorID = 0x11000000 + (icd << 6); 46405db71995Sopenharmony_ci for (uint32_t dev = 0; dev < 3; ++dev) { 46415db71995Sopenharmony_ci properties.deviceID = properties.vendorID + dev; 46425db71995Sopenharmony_ci properties.deviceType = VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU; 46435db71995Sopenharmony_ci auto dev_name = std::string("physdev_") + std::to_string(icd) + "_" + std::to_string(dev); 46445db71995Sopenharmony_ci#if defined(_WIN32) 46455db71995Sopenharmony_ci strncpy_s(properties.deviceName, VK_MAX_PHYSICAL_DEVICE_NAME_SIZE, dev_name.c_str(), dev_name.length() + 1); 46465db71995Sopenharmony_ci#else 46475db71995Sopenharmony_ci strncpy(properties.deviceName, dev_name.c_str(), VK_MAX_PHYSICAL_DEVICE_NAME_SIZE); 46485db71995Sopenharmony_ci#endif 46495db71995Sopenharmony_ci cur_icd.add_physical_device({}); 46505db71995Sopenharmony_ci cur_icd.physical_devices.back().set_properties(properties); 46515db71995Sopenharmony_ci } 46525db71995Sopenharmony_ci cur_icd.physical_device_groups.emplace_back(cur_icd.physical_devices[0]); 46535db71995Sopenharmony_ci cur_icd.physical_device_groups.emplace_back(cur_icd.physical_devices[1]); 46545db71995Sopenharmony_ci cur_icd.physical_device_groups.back().use_physical_device(cur_icd.physical_devices[2]); 46555db71995Sopenharmony_ci } 46565db71995Sopenharmony_ci const uint32_t icd_devices = 6; 46575db71995Sopenharmony_ci 46585db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 46595db71995Sopenharmony_ci inst.create_info.set_api_version(VK_API_VERSION_1_1); 46605db71995Sopenharmony_ci inst.CheckCreate(); 46615db71995Sopenharmony_ci 46625db71995Sopenharmony_ci uint32_t dev_count = 0; 46635db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, inst->vkEnumeratePhysicalDevices(inst, &dev_count, nullptr)); 46645db71995Sopenharmony_ci ASSERT_EQ(dev_count, icd_devices); 46655db71995Sopenharmony_ci 46665db71995Sopenharmony_ci auto physical_devices = std::vector<VkPhysicalDevice>(dev_count); 46675db71995Sopenharmony_ci uint32_t returned_phys_dev_count = dev_count; 46685db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, inst->vkEnumeratePhysicalDevices(inst, &returned_phys_dev_count, physical_devices.data())); 46695db71995Sopenharmony_ci ASSERT_EQ(dev_count, returned_phys_dev_count); 46705db71995Sopenharmony_ci} 46715db71995Sopenharmony_ci 46725db71995Sopenharmony_ciTEST(LayerPhysDeviceMod, AddRemoveAndReorderPhysicalDevices) { 46735db71995Sopenharmony_ci FrameworkEnvironment env; 46745db71995Sopenharmony_ci env.add_implicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} 46755db71995Sopenharmony_ci .set_name("VK_LAYER_LunarG_all_phys_dev") 46765db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) 46775db71995Sopenharmony_ci .set_api_version(VK_API_VERSION_1_1) 46785db71995Sopenharmony_ci .set_disable_environment("TEST_DISABLE_ALL_PHYS_DEV")), 46795db71995Sopenharmony_ci "test_layer_all.json"); 46805db71995Sopenharmony_ci 46815db71995Sopenharmony_ci auto& layer = env.get_test_layer(0); 46825db71995Sopenharmony_ci layer.set_add_phys_devs(true).set_remove_phys_devs(true).set_reorder_phys_devs(true); 46835db71995Sopenharmony_ci 46845db71995Sopenharmony_ci for (uint32_t icd = 0; icd < 2; ++icd) { 46855db71995Sopenharmony_ci auto& cur_icd = 46865db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2, VK_API_VERSION_1_2)).set_icd_api_version(VK_API_VERSION_1_2); 46875db71995Sopenharmony_ci VkPhysicalDeviceProperties properties{}; 46885db71995Sopenharmony_ci properties.apiVersion = VK_API_VERSION_1_2; 46895db71995Sopenharmony_ci properties.vendorID = 0x11000000 + (icd << 6); 46905db71995Sopenharmony_ci for (uint32_t dev = 0; dev < 3; ++dev) { 46915db71995Sopenharmony_ci properties.deviceID = properties.vendorID + dev; 46925db71995Sopenharmony_ci properties.deviceType = VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU; 46935db71995Sopenharmony_ci auto dev_name = std::string("physdev_") + std::to_string(icd) + "_" + std::to_string(dev); 46945db71995Sopenharmony_ci#if defined(_WIN32) 46955db71995Sopenharmony_ci strncpy_s(properties.deviceName, VK_MAX_PHYSICAL_DEVICE_NAME_SIZE, dev_name.c_str(), dev_name.length() + 1); 46965db71995Sopenharmony_ci#else 46975db71995Sopenharmony_ci strncpy(properties.deviceName, dev_name.c_str(), VK_MAX_PHYSICAL_DEVICE_NAME_SIZE); 46985db71995Sopenharmony_ci#endif 46995db71995Sopenharmony_ci cur_icd.add_physical_device({}); 47005db71995Sopenharmony_ci cur_icd.physical_devices.back().set_properties(properties); 47015db71995Sopenharmony_ci } 47025db71995Sopenharmony_ci cur_icd.physical_device_groups.emplace_back(cur_icd.physical_devices[0]); 47035db71995Sopenharmony_ci cur_icd.physical_device_groups.emplace_back(cur_icd.physical_devices[1]); 47045db71995Sopenharmony_ci cur_icd.physical_device_groups.back().use_physical_device(cur_icd.physical_devices[2]); 47055db71995Sopenharmony_ci } 47065db71995Sopenharmony_ci const uint32_t icd_devices = 6; 47075db71995Sopenharmony_ci 47085db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 47095db71995Sopenharmony_ci inst.create_info.set_api_version(VK_API_VERSION_1_1); 47105db71995Sopenharmony_ci inst.CheckCreate(); 47115db71995Sopenharmony_ci 47125db71995Sopenharmony_ci uint32_t dev_count = 0; 47135db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, inst->vkEnumeratePhysicalDevices(inst, &dev_count, nullptr)); 47145db71995Sopenharmony_ci ASSERT_GT(dev_count, icd_devices); 47155db71995Sopenharmony_ci 47165db71995Sopenharmony_ci auto physical_devices = std::vector<VkPhysicalDevice>(dev_count); 47175db71995Sopenharmony_ci uint32_t returned_phys_dev_count = dev_count; 47185db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, inst->vkEnumeratePhysicalDevices(inst, &returned_phys_dev_count, physical_devices.data())); 47195db71995Sopenharmony_ci ASSERT_EQ(dev_count, returned_phys_dev_count); 47205db71995Sopenharmony_ci 47215db71995Sopenharmony_ci uint32_t found_added_count = 0; 47225db71995Sopenharmony_ci for (uint32_t dev = 0; dev < dev_count; ++dev) { 47235db71995Sopenharmony_ci VkPhysicalDeviceProperties props{}; 47245db71995Sopenharmony_ci inst->vkGetPhysicalDeviceProperties(physical_devices[dev], &props); 47255db71995Sopenharmony_ci if (string_eq(props.deviceName, "physdev_added_xx")) { 47265db71995Sopenharmony_ci found_added_count++; 47275db71995Sopenharmony_ci } 47285db71995Sopenharmony_ci } 47295db71995Sopenharmony_ci 47305db71995Sopenharmony_ci // Should see 2 removed, but 3 added so a diff count of 1 47315db71995Sopenharmony_ci uint32_t diff_count = dev_count - icd_devices; 47325db71995Sopenharmony_ci ASSERT_EQ(1U, diff_count); 47335db71995Sopenharmony_ci ASSERT_EQ(found_added_count, 3U); 47345db71995Sopenharmony_ci} 47355db71995Sopenharmony_ci 47365db71995Sopenharmony_cibool GroupsAreTheSame(VkPhysicalDeviceGroupProperties a, VkPhysicalDeviceGroupProperties b) { 47375db71995Sopenharmony_ci if (a.physicalDeviceCount != b.physicalDeviceCount) { 47385db71995Sopenharmony_ci return false; 47395db71995Sopenharmony_ci } 47405db71995Sopenharmony_ci for (uint32_t dev = 0; dev < a.physicalDeviceCount; ++dev) { 47415db71995Sopenharmony_ci if (a.physicalDevices[dev] != b.physicalDevices[dev]) { 47425db71995Sopenharmony_ci return false; 47435db71995Sopenharmony_ci } 47445db71995Sopenharmony_ci } 47455db71995Sopenharmony_ci return true; 47465db71995Sopenharmony_ci} 47475db71995Sopenharmony_ci 47485db71995Sopenharmony_ciTEST(LayerPhysDeviceMod, AddPhysicalDeviceGroups) { 47495db71995Sopenharmony_ci FrameworkEnvironment env; 47505db71995Sopenharmony_ci env.add_implicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} 47515db71995Sopenharmony_ci .set_name("VK_LAYER_LunarG_add_phys_dev") 47525db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) 47535db71995Sopenharmony_ci .set_api_version(VK_API_VERSION_1_1) 47545db71995Sopenharmony_ci .set_disable_environment("TEST_DISABLE_ADD_PHYS_DEV")), 47555db71995Sopenharmony_ci "test_layer_remove.json"); 47565db71995Sopenharmony_ci 47575db71995Sopenharmony_ci auto& layer = env.get_test_layer(0); 47585db71995Sopenharmony_ci layer.set_add_phys_devs(true); 47595db71995Sopenharmony_ci 47605db71995Sopenharmony_ci for (uint32_t icd = 0; icd < 2; ++icd) { 47615db71995Sopenharmony_ci auto& cur_icd = 47625db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2, VK_API_VERSION_1_2)).set_icd_api_version(VK_API_VERSION_1_2); 47635db71995Sopenharmony_ci VkPhysicalDeviceProperties properties{}; 47645db71995Sopenharmony_ci properties.apiVersion = VK_API_VERSION_1_2; 47655db71995Sopenharmony_ci properties.vendorID = 0x11000000 + (icd << 6); 47665db71995Sopenharmony_ci for (uint32_t dev = 0; dev < 3; ++dev) { 47675db71995Sopenharmony_ci properties.deviceID = properties.vendorID + dev; 47685db71995Sopenharmony_ci properties.deviceType = VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU; 47695db71995Sopenharmony_ci auto dev_name = std::string("physdev_") + std::to_string(icd) + "_" + std::to_string(dev); 47705db71995Sopenharmony_ci#if defined(_WIN32) 47715db71995Sopenharmony_ci strncpy_s(properties.deviceName, VK_MAX_PHYSICAL_DEVICE_NAME_SIZE, dev_name.c_str(), dev_name.length() + 1); 47725db71995Sopenharmony_ci#else 47735db71995Sopenharmony_ci strncpy(properties.deviceName, dev_name.c_str(), VK_MAX_PHYSICAL_DEVICE_NAME_SIZE); 47745db71995Sopenharmony_ci#endif 47755db71995Sopenharmony_ci cur_icd.add_physical_device({}); 47765db71995Sopenharmony_ci cur_icd.physical_devices.back().set_properties(properties); 47775db71995Sopenharmony_ci } 47785db71995Sopenharmony_ci cur_icd.physical_device_groups.emplace_back(cur_icd.physical_devices[0]); 47795db71995Sopenharmony_ci cur_icd.physical_device_groups.emplace_back(cur_icd.physical_devices[1]); 47805db71995Sopenharmony_ci cur_icd.physical_device_groups.back().use_physical_device(cur_icd.physical_devices[2]); 47815db71995Sopenharmony_ci } 47825db71995Sopenharmony_ci const uint32_t icd_groups = 4; 47835db71995Sopenharmony_ci 47845db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 47855db71995Sopenharmony_ci inst.create_info.set_api_version(VK_API_VERSION_1_1); 47865db71995Sopenharmony_ci inst.CheckCreate(); 47875db71995Sopenharmony_ci 47885db71995Sopenharmony_ci uint32_t grp_count = 0; 47895db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, inst->vkEnumeratePhysicalDeviceGroups(inst, &grp_count, nullptr)); 47905db71995Sopenharmony_ci ASSERT_GT(grp_count, icd_groups); 47915db71995Sopenharmony_ci 47925db71995Sopenharmony_ci auto not_exp_phys_dev_groups = 47935db71995Sopenharmony_ci std::vector<VkPhysicalDeviceGroupProperties>(icd_groups, {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GROUP_PROPERTIES}); 47945db71995Sopenharmony_ci 47955db71995Sopenharmony_ci uint32_t returned_group_count = icd_groups; 47965db71995Sopenharmony_ci ASSERT_EQ(VK_INCOMPLETE, inst->vkEnumeratePhysicalDeviceGroups(inst, &returned_group_count, not_exp_phys_dev_groups.data())); 47975db71995Sopenharmony_ci ASSERT_EQ(icd_groups, returned_group_count); 47985db71995Sopenharmony_ci 47995db71995Sopenharmony_ci auto phys_dev_groups = 48005db71995Sopenharmony_ci std::vector<VkPhysicalDeviceGroupProperties>(grp_count, {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GROUP_PROPERTIES}); 48015db71995Sopenharmony_ci 48025db71995Sopenharmony_ci returned_group_count = grp_count; 48035db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, inst->vkEnumeratePhysicalDeviceGroups(inst, &returned_group_count, phys_dev_groups.data())); 48045db71995Sopenharmony_ci ASSERT_EQ(grp_count, returned_group_count); 48055db71995Sopenharmony_ci 48065db71995Sopenharmony_ci uint32_t diff_count = grp_count - icd_groups; 48075db71995Sopenharmony_ci uint32_t found_incomplete = 0; 48085db71995Sopenharmony_ci uint32_t found_added_count = 0; 48095db71995Sopenharmony_ci for (uint32_t grp = 0; grp < grp_count; ++grp) { 48105db71995Sopenharmony_ci // Shortcut, only groups with 1 device could be added in the newly added count 48115db71995Sopenharmony_ci if (1 == phys_dev_groups[grp].physicalDeviceCount) { 48125db71995Sopenharmony_ci for (uint32_t dev = 0; dev < phys_dev_groups[grp].physicalDeviceCount; ++dev) { 48135db71995Sopenharmony_ci VkPhysicalDeviceProperties props{}; 48145db71995Sopenharmony_ci inst->vkGetPhysicalDeviceProperties(phys_dev_groups[grp].physicalDevices[dev], &props); 48155db71995Sopenharmony_ci if (string_eq(props.deviceName, "physdev_added_xx")) { 48165db71995Sopenharmony_ci found_added_count++; 48175db71995Sopenharmony_ci } 48185db71995Sopenharmony_ci } 48195db71995Sopenharmony_ci } 48205db71995Sopenharmony_ci for (uint32_t incomp = 0; incomp < icd_groups; ++incomp) { 48215db71995Sopenharmony_ci if (GroupsAreTheSame(not_exp_phys_dev_groups[incomp], phys_dev_groups[grp])) { 48225db71995Sopenharmony_ci found_incomplete++; 48235db71995Sopenharmony_ci break; 48245db71995Sopenharmony_ci } 48255db71995Sopenharmony_ci } 48265db71995Sopenharmony_ci } 48275db71995Sopenharmony_ci 48285db71995Sopenharmony_ci // We should have added the number of diff items, and the incomplete count should match the number of 48295db71995Sopenharmony_ci // original physical devices. 48305db71995Sopenharmony_ci ASSERT_EQ(found_added_count, diff_count); 48315db71995Sopenharmony_ci ASSERT_EQ(found_incomplete, icd_groups); 48325db71995Sopenharmony_ci} 48335db71995Sopenharmony_ci 48345db71995Sopenharmony_ciTEST(LayerPhysDeviceMod, RemovePhysicalDeviceGroups) { 48355db71995Sopenharmony_ci FrameworkEnvironment env; 48365db71995Sopenharmony_ci EnvVarWrapper disable_linux_sort("VK_LOADER_DISABLE_SELECT", "1"); 48375db71995Sopenharmony_ci env.add_implicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} 48385db71995Sopenharmony_ci .set_name("VK_LAYER_LunarG_remove_phys_dev") 48395db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) 48405db71995Sopenharmony_ci .set_api_version(VK_API_VERSION_1_1) 48415db71995Sopenharmony_ci .set_disable_environment("TEST_DISABLE_REMOVE_PHYS_DEV")), 48425db71995Sopenharmony_ci "test_layer_remove.json"); 48435db71995Sopenharmony_ci 48445db71995Sopenharmony_ci auto& layer = env.get_test_layer(0); 48455db71995Sopenharmony_ci layer.set_remove_phys_devs(true); 48465db71995Sopenharmony_ci 48475db71995Sopenharmony_ci for (uint32_t icd = 0; icd < 2; ++icd) { 48485db71995Sopenharmony_ci auto& cur_icd = 48495db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2, VK_API_VERSION_1_2)).set_icd_api_version(VK_API_VERSION_1_2); 48505db71995Sopenharmony_ci VkPhysicalDeviceProperties properties{}; 48515db71995Sopenharmony_ci properties.apiVersion = VK_API_VERSION_1_2; 48525db71995Sopenharmony_ci properties.vendorID = 0x11000000 + (icd << 6); 48535db71995Sopenharmony_ci for (uint32_t dev = 0; dev < 3; ++dev) { 48545db71995Sopenharmony_ci properties.deviceID = properties.vendorID + dev; 48555db71995Sopenharmony_ci properties.deviceType = VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU; 48565db71995Sopenharmony_ci auto dev_name = std::string("physdev_") + std::to_string(icd) + "_" + std::to_string(dev); 48575db71995Sopenharmony_ci#if defined(_WIN32) 48585db71995Sopenharmony_ci strncpy_s(properties.deviceName, dev_name.c_str(), VK_MAX_PHYSICAL_DEVICE_NAME_SIZE); 48595db71995Sopenharmony_ci#else 48605db71995Sopenharmony_ci strncpy(properties.deviceName, dev_name.c_str(), VK_MAX_PHYSICAL_DEVICE_NAME_SIZE); 48615db71995Sopenharmony_ci#endif 48625db71995Sopenharmony_ci cur_icd.add_physical_device({}); 48635db71995Sopenharmony_ci cur_icd.physical_devices.back().set_properties(properties); 48645db71995Sopenharmony_ci } 48655db71995Sopenharmony_ci cur_icd.physical_device_groups.emplace_back(cur_icd.physical_devices[0]); 48665db71995Sopenharmony_ci cur_icd.physical_device_groups.emplace_back(cur_icd.physical_devices[1]); 48675db71995Sopenharmony_ci cur_icd.physical_device_groups.back().use_physical_device(cur_icd.physical_devices[2]); 48685db71995Sopenharmony_ci } 48695db71995Sopenharmony_ci const uint32_t icd_groups = 3; 48705db71995Sopenharmony_ci 48715db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 48725db71995Sopenharmony_ci inst.create_info.set_api_version(VK_API_VERSION_1_1); 48735db71995Sopenharmony_ci inst.CheckCreate(); 48745db71995Sopenharmony_ci 48755db71995Sopenharmony_ci uint32_t grp_count = 0; 48765db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, inst->vkEnumeratePhysicalDeviceGroups(inst, &grp_count, nullptr)); 48775db71995Sopenharmony_ci ASSERT_EQ(grp_count, icd_groups); 48785db71995Sopenharmony_ci 48795db71995Sopenharmony_ci auto phys_dev_groups = 48805db71995Sopenharmony_ci std::vector<VkPhysicalDeviceGroupProperties>(grp_count, {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GROUP_PROPERTIES}); 48815db71995Sopenharmony_ci 48825db71995Sopenharmony_ci uint32_t returned_group_count = grp_count; 48835db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, inst->vkEnumeratePhysicalDeviceGroups(inst, &returned_group_count, phys_dev_groups.data())); 48845db71995Sopenharmony_ci ASSERT_EQ(grp_count, returned_group_count); 48855db71995Sopenharmony_ci} 48865db71995Sopenharmony_ci 48875db71995Sopenharmony_ciTEST(LayerPhysDeviceMod, ReorderPhysicalDeviceGroups) { 48885db71995Sopenharmony_ci FrameworkEnvironment env; 48895db71995Sopenharmony_ci env.add_implicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} 48905db71995Sopenharmony_ci .set_name("VK_LAYER_LunarG_reorder_phys_dev") 48915db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) 48925db71995Sopenharmony_ci .set_api_version(VK_API_VERSION_1_1) 48935db71995Sopenharmony_ci .set_disable_environment("TEST_DISABLE_REORDER_PHYS_DEV")), 48945db71995Sopenharmony_ci "test_layer_reorder.json"); 48955db71995Sopenharmony_ci 48965db71995Sopenharmony_ci auto& layer = env.get_test_layer(0); 48975db71995Sopenharmony_ci layer.set_reorder_phys_devs(true); 48985db71995Sopenharmony_ci 48995db71995Sopenharmony_ci for (uint32_t icd = 0; icd < 2; ++icd) { 49005db71995Sopenharmony_ci auto& cur_icd = 49015db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2, VK_API_VERSION_1_2)).set_icd_api_version(VK_API_VERSION_1_2); 49025db71995Sopenharmony_ci VkPhysicalDeviceProperties properties{}; 49035db71995Sopenharmony_ci properties.apiVersion = VK_API_VERSION_1_2; 49045db71995Sopenharmony_ci properties.vendorID = 0x11000000 + (icd << 6); 49055db71995Sopenharmony_ci for (uint32_t dev = 0; dev < 3; ++dev) { 49065db71995Sopenharmony_ci properties.deviceID = properties.vendorID + dev; 49075db71995Sopenharmony_ci properties.deviceType = VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU; 49085db71995Sopenharmony_ci auto dev_name = std::string("physdev_") + std::to_string(icd) + "_" + std::to_string(dev); 49095db71995Sopenharmony_ci#if defined(_WIN32) 49105db71995Sopenharmony_ci strncpy_s(properties.deviceName, VK_MAX_PHYSICAL_DEVICE_NAME_SIZE, dev_name.c_str(), dev_name.length() + 1); 49115db71995Sopenharmony_ci#else 49125db71995Sopenharmony_ci strncpy(properties.deviceName, dev_name.c_str(), VK_MAX_PHYSICAL_DEVICE_NAME_SIZE); 49135db71995Sopenharmony_ci#endif 49145db71995Sopenharmony_ci cur_icd.add_physical_device({}); 49155db71995Sopenharmony_ci cur_icd.physical_devices.back().set_properties(properties); 49165db71995Sopenharmony_ci } 49175db71995Sopenharmony_ci cur_icd.physical_device_groups.emplace_back(cur_icd.physical_devices[0]); 49185db71995Sopenharmony_ci cur_icd.physical_device_groups.emplace_back(cur_icd.physical_devices[1]); 49195db71995Sopenharmony_ci cur_icd.physical_device_groups.back().use_physical_device(cur_icd.physical_devices[2]); 49205db71995Sopenharmony_ci } 49215db71995Sopenharmony_ci const uint32_t icd_groups = 4; 49225db71995Sopenharmony_ci 49235db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 49245db71995Sopenharmony_ci inst.create_info.set_api_version(VK_API_VERSION_1_1); 49255db71995Sopenharmony_ci inst.CheckCreate(); 49265db71995Sopenharmony_ci 49275db71995Sopenharmony_ci uint32_t grp_count = 0; 49285db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, inst->vkEnumeratePhysicalDeviceGroups(inst, &grp_count, nullptr)); 49295db71995Sopenharmony_ci ASSERT_EQ(grp_count, icd_groups); 49305db71995Sopenharmony_ci 49315db71995Sopenharmony_ci auto phys_dev_groups = 49325db71995Sopenharmony_ci std::vector<VkPhysicalDeviceGroupProperties>(grp_count, {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GROUP_PROPERTIES}); 49335db71995Sopenharmony_ci 49345db71995Sopenharmony_ci uint32_t returned_group_count = grp_count; 49355db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, inst->vkEnumeratePhysicalDeviceGroups(inst, &returned_group_count, phys_dev_groups.data())); 49365db71995Sopenharmony_ci ASSERT_EQ(grp_count, returned_group_count); 49375db71995Sopenharmony_ci} 49385db71995Sopenharmony_ci 49395db71995Sopenharmony_ciTEST(LayerPhysDeviceMod, AddRemoveAndReorderPhysicalDeviceGroups) { 49405db71995Sopenharmony_ci FrameworkEnvironment env; 49415db71995Sopenharmony_ci env.add_implicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} 49425db71995Sopenharmony_ci .set_name("VK_LAYER_LunarG_all_phys_dev") 49435db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) 49445db71995Sopenharmony_ci .set_api_version(VK_API_VERSION_1_1) 49455db71995Sopenharmony_ci .set_disable_environment("TEST_DISABLE_ALL_PHYS_DEV")), 49465db71995Sopenharmony_ci "test_layer_all.json"); 49475db71995Sopenharmony_ci 49485db71995Sopenharmony_ci auto& layer = env.get_test_layer(0); 49495db71995Sopenharmony_ci layer.set_add_phys_devs(true).set_remove_phys_devs(true).set_reorder_phys_devs(true); 49505db71995Sopenharmony_ci 49515db71995Sopenharmony_ci for (uint32_t icd = 0; icd < 2; ++icd) { 49525db71995Sopenharmony_ci auto& cur_icd = 49535db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2, VK_API_VERSION_1_2)).set_icd_api_version(VK_API_VERSION_1_2); 49545db71995Sopenharmony_ci VkPhysicalDeviceProperties properties{}; 49555db71995Sopenharmony_ci properties.apiVersion = VK_API_VERSION_1_2; 49565db71995Sopenharmony_ci properties.vendorID = 0x11000000 + (icd << 6); 49575db71995Sopenharmony_ci for (uint32_t dev = 0; dev < 3; ++dev) { 49585db71995Sopenharmony_ci properties.deviceID = properties.vendorID + dev; 49595db71995Sopenharmony_ci properties.deviceType = VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU; 49605db71995Sopenharmony_ci auto dev_name = std::string("physdev_") + std::to_string(icd) + "_" + std::to_string(dev); 49615db71995Sopenharmony_ci#if defined(_WIN32) 49625db71995Sopenharmony_ci strncpy_s(properties.deviceName, VK_MAX_PHYSICAL_DEVICE_NAME_SIZE, dev_name.c_str(), dev_name.length() + 1); 49635db71995Sopenharmony_ci#else 49645db71995Sopenharmony_ci strncpy(properties.deviceName, dev_name.c_str(), VK_MAX_PHYSICAL_DEVICE_NAME_SIZE); 49655db71995Sopenharmony_ci#endif 49665db71995Sopenharmony_ci cur_icd.add_physical_device({}); 49675db71995Sopenharmony_ci cur_icd.physical_devices.back().set_properties(properties); 49685db71995Sopenharmony_ci } 49695db71995Sopenharmony_ci cur_icd.physical_device_groups.emplace_back(cur_icd.physical_devices[0]); 49705db71995Sopenharmony_ci cur_icd.physical_device_groups.back().use_physical_device(cur_icd.physical_devices[1]); 49715db71995Sopenharmony_ci cur_icd.physical_device_groups.emplace_back(cur_icd.physical_devices[2]); 49725db71995Sopenharmony_ci } 49735db71995Sopenharmony_ci const uint32_t icd_groups = 4; 49745db71995Sopenharmony_ci 49755db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 49765db71995Sopenharmony_ci inst.create_info.set_api_version(VK_API_VERSION_1_1); 49775db71995Sopenharmony_ci inst.CheckCreate(); 49785db71995Sopenharmony_ci 49795db71995Sopenharmony_ci uint32_t grp_count = 0; 49805db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, inst->vkEnumeratePhysicalDeviceGroups(inst, &grp_count, nullptr)); 49815db71995Sopenharmony_ci ASSERT_GT(grp_count, icd_groups); 49825db71995Sopenharmony_ci 49835db71995Sopenharmony_ci auto phys_dev_groups = 49845db71995Sopenharmony_ci std::vector<VkPhysicalDeviceGroupProperties>(grp_count, {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GROUP_PROPERTIES}); 49855db71995Sopenharmony_ci 49865db71995Sopenharmony_ci uint32_t returned_group_count = grp_count; 49875db71995Sopenharmony_ci ASSERT_EQ(VK_SUCCESS, inst->vkEnumeratePhysicalDeviceGroups(inst, &returned_group_count, phys_dev_groups.data())); 49885db71995Sopenharmony_ci ASSERT_EQ(grp_count, returned_group_count); 49895db71995Sopenharmony_ci 49905db71995Sopenharmony_ci uint32_t diff_count = grp_count - icd_groups; 49915db71995Sopenharmony_ci uint32_t found_added_count = 0; 49925db71995Sopenharmony_ci for (uint32_t grp = 0; grp < grp_count; ++grp) { 49935db71995Sopenharmony_ci // Shortcut, only groups with 1 device could be added in the newly added count 49945db71995Sopenharmony_ci if (1 == phys_dev_groups[grp].physicalDeviceCount) { 49955db71995Sopenharmony_ci for (uint32_t dev = 0; dev < phys_dev_groups[grp].physicalDeviceCount; ++dev) { 49965db71995Sopenharmony_ci VkPhysicalDeviceProperties props{}; 49975db71995Sopenharmony_ci inst->vkGetPhysicalDeviceProperties(phys_dev_groups[grp].physicalDevices[dev], &props); 49985db71995Sopenharmony_ci if (string_eq(props.deviceName, "physdev_added_xx")) { 49995db71995Sopenharmony_ci found_added_count++; 50005db71995Sopenharmony_ci } 50015db71995Sopenharmony_ci } 50025db71995Sopenharmony_ci } 50035db71995Sopenharmony_ci } 50045db71995Sopenharmony_ci 50055db71995Sopenharmony_ci // Should see 2 devices removed which should result in 1 group removed and since 3 50065db71995Sopenharmony_ci // devices were added we should have 3 new groups. So we should have a diff of 2 50075db71995Sopenharmony_ci // groups and 3 new groups 50085db71995Sopenharmony_ci ASSERT_EQ(2U, diff_count); 50095db71995Sopenharmony_ci ASSERT_EQ(found_added_count, 3U); 50105db71995Sopenharmony_ci} 50115db71995Sopenharmony_ci 50125db71995Sopenharmony_ciTEST(TestLayers, AllowFilterWithExplicitLayer) { 50135db71995Sopenharmony_ci FrameworkEnvironment env; 50145db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2)).add_physical_device({}); 50155db71995Sopenharmony_ci const char* layer_name = "VK_LAYER_test_layer"; 50165db71995Sopenharmony_ci env.add_explicit_layer( 50175db71995Sopenharmony_ci ManifestLayer{}.add_layer( 50185db71995Sopenharmony_ci ManifestLayer::LayerDescription{}.set_name(layer_name).set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)), 50195db71995Sopenharmony_ci "test_layer_all.json"); 50205db71995Sopenharmony_ci 50215db71995Sopenharmony_ci EnvVarWrapper allow{"VK_LOADER_LAYERS_ALLOW", layer_name}; 50225db71995Sopenharmony_ci { 50235db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 50245db71995Sopenharmony_ci inst.CheckCreate(); 50255db71995Sopenharmony_ci 50265db71995Sopenharmony_ci ASSERT_NO_FATAL_FAILURE(inst.GetActiveLayers(inst.GetPhysDev(), 0)); 50275db71995Sopenharmony_ci } 50285db71995Sopenharmony_ci { 50295db71995Sopenharmony_ci EnvVarWrapper disable{"VK_LOADER_LAYERS_DISABLE", layer_name}; 50305db71995Sopenharmony_ci 50315db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 50325db71995Sopenharmony_ci inst.CheckCreate(); 50335db71995Sopenharmony_ci 50345db71995Sopenharmony_ci ASSERT_NO_FATAL_FAILURE(inst.GetActiveLayers(inst.GetPhysDev(), 0)); 50355db71995Sopenharmony_ci } 50365db71995Sopenharmony_ci { 50375db71995Sopenharmony_ci EnvVarWrapper disable{"VK_LOADER_LAYERS_DISABLE", layer_name}; 50385db71995Sopenharmony_ci EnvVarWrapper enable{"VK_LOADER_LAYERS_ENABLE", layer_name}; 50395db71995Sopenharmony_ci 50405db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 50415db71995Sopenharmony_ci inst.CheckCreate(); 50425db71995Sopenharmony_ci 50435db71995Sopenharmony_ci auto layers = inst.GetActiveLayers(inst.GetPhysDev(), 1); 50445db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layers.at(0).layerName, layer_name)); 50455db71995Sopenharmony_ci } 50465db71995Sopenharmony_ci { 50475db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 50485db71995Sopenharmony_ci inst.create_info.add_layer(layer_name); 50495db71995Sopenharmony_ci inst.CheckCreate(); 50505db71995Sopenharmony_ci 50515db71995Sopenharmony_ci auto layers = inst.GetActiveLayers(inst.GetPhysDev(), 1); 50525db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layers.at(0).layerName, layer_name)); 50535db71995Sopenharmony_ci } 50545db71995Sopenharmony_ci { 50555db71995Sopenharmony_ci env.loader_settings.add_app_specific_setting(AppSpecificSettings{}.add_stderr_log_filter("all").add_layer_configuration( 50565db71995Sopenharmony_ci LoaderSettingsLayerConfiguration{} 50575db71995Sopenharmony_ci .set_name(layer_name) 50585db71995Sopenharmony_ci .set_control("on") 50595db71995Sopenharmony_ci .set_path(env.get_shimmed_layer_manifest_path(0).str()) 50605db71995Sopenharmony_ci .set_treat_as_implicit_manifest(false))); 50615db71995Sopenharmony_ci env.update_loader_settings(env.loader_settings); 50625db71995Sopenharmony_ci 50635db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 50645db71995Sopenharmony_ci inst.CheckCreate(); 50655db71995Sopenharmony_ci 50665db71995Sopenharmony_ci auto layers = inst.GetActiveLayers(inst.GetPhysDev(), 1); 50675db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layers.at(0).layerName, layer_name)); 50685db71995Sopenharmony_ci } 50695db71995Sopenharmony_ci { 50705db71995Sopenharmony_ci env.loader_settings.app_specific_settings.at(0).layer_configurations.at(0).set_control("off"); 50715db71995Sopenharmony_ci env.update_loader_settings(env.loader_settings); 50725db71995Sopenharmony_ci 50735db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 50745db71995Sopenharmony_ci inst.CheckCreate(); 50755db71995Sopenharmony_ci 50765db71995Sopenharmony_ci ASSERT_NO_FATAL_FAILURE(inst.GetActiveLayers(inst.GetPhysDev(), 0)); 50775db71995Sopenharmony_ci } 50785db71995Sopenharmony_ci { 50795db71995Sopenharmony_ci env.loader_settings.app_specific_settings.at(0).layer_configurations.at(0).set_control("auto"); 50805db71995Sopenharmony_ci env.update_loader_settings(env.loader_settings); 50815db71995Sopenharmony_ci 50825db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 50835db71995Sopenharmony_ci inst.CheckCreate(); 50845db71995Sopenharmony_ci 50855db71995Sopenharmony_ci ASSERT_NO_FATAL_FAILURE(inst.GetActiveLayers(inst.GetPhysDev(), 0)); 50865db71995Sopenharmony_ci } 50875db71995Sopenharmony_ci} 50885db71995Sopenharmony_ci 50895db71995Sopenharmony_ciTEST(TestLayers, AllowFilterWithImplicitLayer) { 50905db71995Sopenharmony_ci FrameworkEnvironment env; 50915db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2)).add_physical_device({}); 50925db71995Sopenharmony_ci const char* layer_name = "VK_LAYER_test_layer"; 50935db71995Sopenharmony_ci const char* disable_env_var = "TEST_DISABLE_ENV_VAR"; 50945db71995Sopenharmony_ci env.add_implicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} 50955db71995Sopenharmony_ci .set_name(layer_name) 50965db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) 50975db71995Sopenharmony_ci .set_disable_environment(disable_env_var)), 50985db71995Sopenharmony_ci "test_layer_all.json"); 50995db71995Sopenharmony_ci 51005db71995Sopenharmony_ci EnvVarWrapper allow{"VK_LOADER_LAYERS_ALLOW", layer_name}; 51015db71995Sopenharmony_ci 51025db71995Sopenharmony_ci { 51035db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 51045db71995Sopenharmony_ci inst.CheckCreate(); 51055db71995Sopenharmony_ci 51065db71995Sopenharmony_ci auto layers = inst.GetActiveLayers(inst.GetPhysDev(), 1); 51075db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layers.at(0).layerName, layer_name)); 51085db71995Sopenharmony_ci } 51095db71995Sopenharmony_ci { 51105db71995Sopenharmony_ci EnvVarWrapper disable{"VK_LOADER_LAYERS_DISABLE", layer_name}; 51115db71995Sopenharmony_ci 51125db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 51135db71995Sopenharmony_ci inst.CheckCreate(); 51145db71995Sopenharmony_ci 51155db71995Sopenharmony_ci auto layers = inst.GetActiveLayers(inst.GetPhysDev(), 1); 51165db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layers.at(0).layerName, layer_name)); 51175db71995Sopenharmony_ci } 51185db71995Sopenharmony_ci { 51195db71995Sopenharmony_ci EnvVarWrapper disable{"VK_LOADER_LAYERS_DISABLE", layer_name}; 51205db71995Sopenharmony_ci EnvVarWrapper enable{"VK_LOADER_LAYERS_ENABLE", layer_name}; 51215db71995Sopenharmony_ci 51225db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 51235db71995Sopenharmony_ci inst.CheckCreate(); 51245db71995Sopenharmony_ci 51255db71995Sopenharmony_ci auto layers = inst.GetActiveLayers(inst.GetPhysDev(), 1); 51265db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layers.at(0).layerName, layer_name)); 51275db71995Sopenharmony_ci } 51285db71995Sopenharmony_ci { 51295db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 51305db71995Sopenharmony_ci inst.create_info.add_layer(layer_name); 51315db71995Sopenharmony_ci inst.CheckCreate(); 51325db71995Sopenharmony_ci 51335db71995Sopenharmony_ci auto layers = inst.GetActiveLayers(inst.GetPhysDev(), 1); 51345db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layers.at(0).layerName, layer_name)); 51355db71995Sopenharmony_ci } 51365db71995Sopenharmony_ci { 51375db71995Sopenharmony_ci env.loader_settings.add_app_specific_setting(AppSpecificSettings{}.add_stderr_log_filter("all").add_layer_configuration( 51385db71995Sopenharmony_ci LoaderSettingsLayerConfiguration{} 51395db71995Sopenharmony_ci .set_name(layer_name) 51405db71995Sopenharmony_ci .set_control("on") 51415db71995Sopenharmony_ci .set_path(env.get_shimmed_layer_manifest_path(0).str()) 51425db71995Sopenharmony_ci .set_treat_as_implicit_manifest(true))); 51435db71995Sopenharmony_ci env.update_loader_settings(env.loader_settings); 51445db71995Sopenharmony_ci 51455db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 51465db71995Sopenharmony_ci inst.CheckCreate(); 51475db71995Sopenharmony_ci 51485db71995Sopenharmony_ci auto layers = inst.GetActiveLayers(inst.GetPhysDev(), 1); 51495db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layers.at(0).layerName, layer_name)); 51505db71995Sopenharmony_ci } 51515db71995Sopenharmony_ci { 51525db71995Sopenharmony_ci env.loader_settings.app_specific_settings.at(0).layer_configurations.at(0).set_control("off"); 51535db71995Sopenharmony_ci env.update_loader_settings(env.loader_settings); 51545db71995Sopenharmony_ci 51555db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 51565db71995Sopenharmony_ci inst.CheckCreate(); 51575db71995Sopenharmony_ci 51585db71995Sopenharmony_ci ASSERT_NO_FATAL_FAILURE(inst.GetActiveLayers(inst.GetPhysDev(), 0)); 51595db71995Sopenharmony_ci } 51605db71995Sopenharmony_ci { 51615db71995Sopenharmony_ci env.loader_settings.app_specific_settings.at(0).layer_configurations.at(0).set_control("auto"); 51625db71995Sopenharmony_ci env.update_loader_settings(env.loader_settings); 51635db71995Sopenharmony_ci 51645db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 51655db71995Sopenharmony_ci inst.CheckCreate(); 51665db71995Sopenharmony_ci 51675db71995Sopenharmony_ci auto layers = inst.GetActiveLayers(inst.GetPhysDev(), 1); 51685db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layers.at(0).layerName, layer_name)); 51695db71995Sopenharmony_ci } 51705db71995Sopenharmony_ci 51715db71995Sopenharmony_ci env.remove_loader_settings(); 51725db71995Sopenharmony_ci 51735db71995Sopenharmony_ci // Set the disable_environment variable 51745db71995Sopenharmony_ci EnvVarWrapper set_disable_env_var{disable_env_var, "1"}; 51755db71995Sopenharmony_ci 51765db71995Sopenharmony_ci { 51775db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 51785db71995Sopenharmony_ci inst.CheckCreate(); 51795db71995Sopenharmony_ci 51805db71995Sopenharmony_ci ASSERT_NO_FATAL_FAILURE(inst.GetActiveLayers(inst.GetPhysDev(), 0)); 51815db71995Sopenharmony_ci } 51825db71995Sopenharmony_ci { 51835db71995Sopenharmony_ci EnvVarWrapper disable{"VK_LOADER_LAYERS_DISABLE", layer_name}; 51845db71995Sopenharmony_ci 51855db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 51865db71995Sopenharmony_ci inst.CheckCreate(); 51875db71995Sopenharmony_ci 51885db71995Sopenharmony_ci ASSERT_NO_FATAL_FAILURE(inst.GetActiveLayers(inst.GetPhysDev(), 0)); 51895db71995Sopenharmony_ci } 51905db71995Sopenharmony_ci { 51915db71995Sopenharmony_ci EnvVarWrapper disable{"VK_LOADER_LAYERS_DISABLE", layer_name}; 51925db71995Sopenharmony_ci EnvVarWrapper enable{"VK_LOADER_LAYERS_ENABLE", layer_name}; 51935db71995Sopenharmony_ci 51945db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 51955db71995Sopenharmony_ci inst.CheckCreate(); 51965db71995Sopenharmony_ci 51975db71995Sopenharmony_ci // layer's disable_environment takes priority 51985db71995Sopenharmony_ci ASSERT_NO_FATAL_FAILURE(inst.GetActiveLayers(inst.GetPhysDev(), 0)); 51995db71995Sopenharmony_ci } 52005db71995Sopenharmony_ci { 52015db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 52025db71995Sopenharmony_ci inst.create_info.add_layer(layer_name); 52035db71995Sopenharmony_ci inst.CheckCreate(); 52045db71995Sopenharmony_ci 52055db71995Sopenharmony_ci auto layers = inst.GetActiveLayers(inst.GetPhysDev(), 1); 52065db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layers.at(0).layerName, layer_name)); 52075db71995Sopenharmony_ci } 52085db71995Sopenharmony_ci { 52095db71995Sopenharmony_ci env.loader_settings.add_app_specific_setting(AppSpecificSettings{}.add_stderr_log_filter("all").add_layer_configuration( 52105db71995Sopenharmony_ci LoaderSettingsLayerConfiguration{} 52115db71995Sopenharmony_ci .set_name(layer_name) 52125db71995Sopenharmony_ci .set_control("on") 52135db71995Sopenharmony_ci .set_path(env.get_shimmed_layer_manifest_path(0).str()) 52145db71995Sopenharmony_ci .set_treat_as_implicit_manifest(true))); 52155db71995Sopenharmony_ci env.update_loader_settings(env.loader_settings); 52165db71995Sopenharmony_ci 52175db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 52185db71995Sopenharmony_ci inst.CheckCreate(); 52195db71995Sopenharmony_ci 52205db71995Sopenharmony_ci ASSERT_NO_FATAL_FAILURE(inst.GetActiveLayers(inst.GetPhysDev(), 0)); 52215db71995Sopenharmony_ci } 52225db71995Sopenharmony_ci { 52235db71995Sopenharmony_ci env.loader_settings.app_specific_settings.at(0).layer_configurations.at(0).set_control("off"); 52245db71995Sopenharmony_ci env.update_loader_settings(env.loader_settings); 52255db71995Sopenharmony_ci 52265db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 52275db71995Sopenharmony_ci inst.CheckCreate(); 52285db71995Sopenharmony_ci 52295db71995Sopenharmony_ci ASSERT_NO_FATAL_FAILURE(inst.GetActiveLayers(inst.GetPhysDev(), 0)); 52305db71995Sopenharmony_ci } 52315db71995Sopenharmony_ci { 52325db71995Sopenharmony_ci env.loader_settings.app_specific_settings.at(0).layer_configurations.at(0).set_control("auto"); 52335db71995Sopenharmony_ci env.update_loader_settings(env.loader_settings); 52345db71995Sopenharmony_ci 52355db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 52365db71995Sopenharmony_ci inst.CheckCreate(); 52375db71995Sopenharmony_ci 52385db71995Sopenharmony_ci ASSERT_NO_FATAL_FAILURE(inst.GetActiveLayers(inst.GetPhysDev(), 0)); 52395db71995Sopenharmony_ci } 52405db71995Sopenharmony_ci} 52415db71995Sopenharmony_ci 52425db71995Sopenharmony_ciTEST(TestLayers, AllowFilterWithConditionallyImlicitLayer) { 52435db71995Sopenharmony_ci FrameworkEnvironment env; 52445db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2)).add_physical_device({}); 52455db71995Sopenharmony_ci const char* layer_name = "VK_LAYER_test_layer"; 52465db71995Sopenharmony_ci const char* enable_env_var = "TEST_ENABLE_ENV_VAR"; 52475db71995Sopenharmony_ci env.add_implicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} 52485db71995Sopenharmony_ci .set_name(layer_name) 52495db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) 52505db71995Sopenharmony_ci .set_disable_environment("TEST_DISABLE_ENV_VAR") 52515db71995Sopenharmony_ci .set_enable_environment(enable_env_var)), 52525db71995Sopenharmony_ci "test_layer_all.json"); 52535db71995Sopenharmony_ci 52545db71995Sopenharmony_ci EnvVarWrapper allow{"VK_LOADER_LAYERS_ALLOW", layer_name}; 52555db71995Sopenharmony_ci 52565db71995Sopenharmony_ci { 52575db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 52585db71995Sopenharmony_ci inst.CheckCreate(); 52595db71995Sopenharmony_ci 52605db71995Sopenharmony_ci ASSERT_NO_FATAL_FAILURE(inst.GetActiveLayers(inst.GetPhysDev(), 0)); 52615db71995Sopenharmony_ci } 52625db71995Sopenharmony_ci { 52635db71995Sopenharmony_ci EnvVarWrapper disable{"VK_LOADER_LAYERS_DISABLE", layer_name}; 52645db71995Sopenharmony_ci 52655db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 52665db71995Sopenharmony_ci inst.CheckCreate(); 52675db71995Sopenharmony_ci 52685db71995Sopenharmony_ci ASSERT_NO_FATAL_FAILURE(inst.GetActiveLayers(inst.GetPhysDev(), 0)); 52695db71995Sopenharmony_ci } 52705db71995Sopenharmony_ci { 52715db71995Sopenharmony_ci EnvVarWrapper disable{"VK_LOADER_LAYERS_DISABLE", layer_name}; 52725db71995Sopenharmony_ci EnvVarWrapper enable{"VK_LOADER_LAYERS_ENABLE", layer_name}; 52735db71995Sopenharmony_ci 52745db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 52755db71995Sopenharmony_ci inst.CheckCreate(); 52765db71995Sopenharmony_ci 52775db71995Sopenharmony_ci auto layers = inst.GetActiveLayers(inst.GetPhysDev(), 1); 52785db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layers.at(0).layerName, layer_name)); 52795db71995Sopenharmony_ci } 52805db71995Sopenharmony_ci { 52815db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 52825db71995Sopenharmony_ci inst.create_info.add_layer(layer_name); 52835db71995Sopenharmony_ci inst.CheckCreate(); 52845db71995Sopenharmony_ci 52855db71995Sopenharmony_ci auto layers = inst.GetActiveLayers(inst.GetPhysDev(), 1); 52865db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layers.at(0).layerName, layer_name)); 52875db71995Sopenharmony_ci } 52885db71995Sopenharmony_ci { 52895db71995Sopenharmony_ci env.loader_settings.add_app_specific_setting(AppSpecificSettings{}.add_stderr_log_filter("all").add_layer_configuration( 52905db71995Sopenharmony_ci LoaderSettingsLayerConfiguration{} 52915db71995Sopenharmony_ci .set_name(layer_name) 52925db71995Sopenharmony_ci .set_control("on") 52935db71995Sopenharmony_ci .set_path(env.get_shimmed_layer_manifest_path(0).str()) 52945db71995Sopenharmony_ci .set_treat_as_implicit_manifest(true))); 52955db71995Sopenharmony_ci env.update_loader_settings(env.loader_settings); 52965db71995Sopenharmony_ci 52975db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 52985db71995Sopenharmony_ci inst.CheckCreate(); 52995db71995Sopenharmony_ci 53005db71995Sopenharmony_ci auto layers = inst.GetActiveLayers(inst.GetPhysDev(), 1); 53015db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layers.at(0).layerName, layer_name)); 53025db71995Sopenharmony_ci } 53035db71995Sopenharmony_ci { 53045db71995Sopenharmony_ci env.loader_settings.app_specific_settings.at(0).layer_configurations.at(0).set_control("off"); 53055db71995Sopenharmony_ci env.update_loader_settings(env.loader_settings); 53065db71995Sopenharmony_ci 53075db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 53085db71995Sopenharmony_ci inst.CheckCreate(); 53095db71995Sopenharmony_ci 53105db71995Sopenharmony_ci ASSERT_NO_FATAL_FAILURE(inst.GetActiveLayers(inst.GetPhysDev(), 0)); 53115db71995Sopenharmony_ci } 53125db71995Sopenharmony_ci { 53135db71995Sopenharmony_ci env.loader_settings.app_specific_settings.at(0).layer_configurations.at(0).set_control("auto"); 53145db71995Sopenharmony_ci env.update_loader_settings(env.loader_settings); 53155db71995Sopenharmony_ci 53165db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 53175db71995Sopenharmony_ci inst.CheckCreate(); 53185db71995Sopenharmony_ci 53195db71995Sopenharmony_ci ASSERT_NO_FATAL_FAILURE(inst.GetActiveLayers(inst.GetPhysDev(), 0)); 53205db71995Sopenharmony_ci } 53215db71995Sopenharmony_ci 53225db71995Sopenharmony_ci env.remove_loader_settings(); 53235db71995Sopenharmony_ci 53245db71995Sopenharmony_ci // Repeate the above tests but with the enable_environment variable set 53255db71995Sopenharmony_ci EnvVarWrapper set_enable_env_var{enable_env_var, "1"}; 53265db71995Sopenharmony_ci 53275db71995Sopenharmony_ci { 53285db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 53295db71995Sopenharmony_ci inst.CheckCreate(); 53305db71995Sopenharmony_ci 53315db71995Sopenharmony_ci auto layers = inst.GetActiveLayers(inst.GetPhysDev(), 1); 53325db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layers.at(0).layerName, layer_name)); 53335db71995Sopenharmony_ci } 53345db71995Sopenharmony_ci { 53355db71995Sopenharmony_ci EnvVarWrapper disable{"VK_LOADER_LAYERS_DISABLE", layer_name}; 53365db71995Sopenharmony_ci 53375db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 53385db71995Sopenharmony_ci inst.CheckCreate(); 53395db71995Sopenharmony_ci 53405db71995Sopenharmony_ci auto layers = inst.GetActiveLayers(inst.GetPhysDev(), 1); 53415db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layers.at(0).layerName, layer_name)); 53425db71995Sopenharmony_ci } 53435db71995Sopenharmony_ci { 53445db71995Sopenharmony_ci EnvVarWrapper disable{"VK_LOADER_LAYERS_DISABLE", layer_name}; 53455db71995Sopenharmony_ci EnvVarWrapper enable{"VK_LOADER_LAYERS_ENABLE", layer_name}; 53465db71995Sopenharmony_ci 53475db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 53485db71995Sopenharmony_ci inst.CheckCreate(); 53495db71995Sopenharmony_ci 53505db71995Sopenharmony_ci auto layers = inst.GetActiveLayers(inst.GetPhysDev(), 1); 53515db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layers.at(0).layerName, layer_name)); 53525db71995Sopenharmony_ci } 53535db71995Sopenharmony_ci { 53545db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 53555db71995Sopenharmony_ci inst.create_info.add_layer(layer_name); 53565db71995Sopenharmony_ci inst.CheckCreate(); 53575db71995Sopenharmony_ci 53585db71995Sopenharmony_ci auto layers = inst.GetActiveLayers(inst.GetPhysDev(), 1); 53595db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layers.at(0).layerName, layer_name)); 53605db71995Sopenharmony_ci } 53615db71995Sopenharmony_ci { 53625db71995Sopenharmony_ci env.loader_settings.add_app_specific_setting(AppSpecificSettings{}.add_stderr_log_filter("all").add_layer_configuration( 53635db71995Sopenharmony_ci LoaderSettingsLayerConfiguration{} 53645db71995Sopenharmony_ci .set_name(layer_name) 53655db71995Sopenharmony_ci .set_control("on") 53665db71995Sopenharmony_ci .set_path(env.get_shimmed_layer_manifest_path(0).str()) 53675db71995Sopenharmony_ci .set_treat_as_implicit_manifest(true))); 53685db71995Sopenharmony_ci env.update_loader_settings(env.loader_settings); 53695db71995Sopenharmony_ci 53705db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 53715db71995Sopenharmony_ci inst.CheckCreate(); 53725db71995Sopenharmony_ci 53735db71995Sopenharmony_ci auto layers = inst.GetActiveLayers(inst.GetPhysDev(), 1); 53745db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layers.at(0).layerName, layer_name)); 53755db71995Sopenharmony_ci } 53765db71995Sopenharmony_ci { 53775db71995Sopenharmony_ci env.loader_settings.app_specific_settings.at(0).layer_configurations.at(0).set_control("off"); 53785db71995Sopenharmony_ci env.update_loader_settings(env.loader_settings); 53795db71995Sopenharmony_ci 53805db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 53815db71995Sopenharmony_ci inst.CheckCreate(); 53825db71995Sopenharmony_ci 53835db71995Sopenharmony_ci ASSERT_NO_FATAL_FAILURE(inst.GetActiveLayers(inst.GetPhysDev(), 0)); 53845db71995Sopenharmony_ci } 53855db71995Sopenharmony_ci { 53865db71995Sopenharmony_ci env.loader_settings.app_specific_settings.at(0).layer_configurations.at(0).set_control("auto"); 53875db71995Sopenharmony_ci env.update_loader_settings(env.loader_settings); 53885db71995Sopenharmony_ci 53895db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 53905db71995Sopenharmony_ci inst.CheckCreate(); 53915db71995Sopenharmony_ci 53925db71995Sopenharmony_ci auto layers = inst.GetActiveLayers(inst.GetPhysDev(), 1); 53935db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layers.at(0).layerName, layer_name)); 53945db71995Sopenharmony_ci } 53955db71995Sopenharmony_ci} 53965db71995Sopenharmony_ci 53975db71995Sopenharmony_ciTEST(TestLayers, AllowFilterWithConditionallyImlicitLayerWithOverrideLayer) { 53985db71995Sopenharmony_ci FrameworkEnvironment env; 53995db71995Sopenharmony_ci env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2)).add_physical_device({}); 54005db71995Sopenharmony_ci const char* layer_name = "VK_LAYER_test_layer"; 54015db71995Sopenharmony_ci const char* enable_env_var = "TEST_ENABLE_ENV_VAR"; 54025db71995Sopenharmony_ci env.add_implicit_layer(TestLayerDetails{ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{} 54035db71995Sopenharmony_ci .set_name(layer_name) 54045db71995Sopenharmony_ci .set_api_version(VK_API_VERSION_1_1) 54055db71995Sopenharmony_ci .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2) 54065db71995Sopenharmony_ci .set_disable_environment("TEST_DISABLE_ENV_VAR") 54075db71995Sopenharmony_ci .set_enable_environment(enable_env_var)), 54085db71995Sopenharmony_ci "test_layer_all.json"} 54095db71995Sopenharmony_ci .set_discovery_type(ManifestDiscoveryType::override_folder)); 54105db71995Sopenharmony_ci 54115db71995Sopenharmony_ci env.add_implicit_layer( 54125db71995Sopenharmony_ci ManifestLayer{}.set_file_format_version({1, 2, 0}).add_layer( 54135db71995Sopenharmony_ci ManifestLayer::LayerDescription{} 54145db71995Sopenharmony_ci .set_name(lunarg_meta_layer_name) 54155db71995Sopenharmony_ci .set_api_version(VK_MAKE_API_VERSION(0, 1, 1, 0)) 54165db71995Sopenharmony_ci .add_component_layer(layer_name) 54175db71995Sopenharmony_ci .set_disable_environment("DisableMeIfYouCan") 54185db71995Sopenharmony_ci .add_override_path(fs::make_native(env.get_folder(ManifestLocation::override_layer).location().str()))), 54195db71995Sopenharmony_ci "meta_test_layer.json"); 54205db71995Sopenharmony_ci 54215db71995Sopenharmony_ci EnvVarWrapper allow{"VK_LOADER_LAYERS_ALLOW", layer_name}; 54225db71995Sopenharmony_ci 54235db71995Sopenharmony_ci { 54245db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 54255db71995Sopenharmony_ci inst.CheckCreate(); 54265db71995Sopenharmony_ci 54275db71995Sopenharmony_ci auto layers = inst.GetActiveLayers(inst.GetPhysDev(), 2); 54285db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layers.at(0).layerName, layer_name)); 54295db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layers.at(1).layerName, lunarg_meta_layer_name)); 54305db71995Sopenharmony_ci } 54315db71995Sopenharmony_ci { 54325db71995Sopenharmony_ci EnvVarWrapper disable{"VK_LOADER_LAYERS_DISABLE", layer_name}; 54335db71995Sopenharmony_ci 54345db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 54355db71995Sopenharmony_ci inst.CheckCreate(); 54365db71995Sopenharmony_ci 54375db71995Sopenharmony_ci auto layers = inst.GetActiveLayers(inst.GetPhysDev(), 2); 54385db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layers.at(0).layerName, layer_name)); 54395db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layers.at(1).layerName, lunarg_meta_layer_name)); 54405db71995Sopenharmony_ci } 54415db71995Sopenharmony_ci { 54425db71995Sopenharmony_ci EnvVarWrapper disable{"VK_LOADER_LAYERS_DISABLE", layer_name}; 54435db71995Sopenharmony_ci EnvVarWrapper enable{"VK_LOADER_LAYERS_ENABLE", layer_name}; 54445db71995Sopenharmony_ci 54455db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 54465db71995Sopenharmony_ci inst.CheckCreate(); 54475db71995Sopenharmony_ci 54485db71995Sopenharmony_ci auto layers = inst.GetActiveLayers(inst.GetPhysDev(), 2); 54495db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layers.at(0).layerName, layer_name)); 54505db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layers.at(1).layerName, lunarg_meta_layer_name)); 54515db71995Sopenharmony_ci } 54525db71995Sopenharmony_ci { 54535db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 54545db71995Sopenharmony_ci inst.create_info.add_layer(layer_name); 54555db71995Sopenharmony_ci inst.CheckCreate(); 54565db71995Sopenharmony_ci 54575db71995Sopenharmony_ci auto layers = inst.GetActiveLayers(inst.GetPhysDev(), 2); 54585db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layers.at(0).layerName, layer_name)); 54595db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layers.at(1).layerName, lunarg_meta_layer_name)); 54605db71995Sopenharmony_ci } 54615db71995Sopenharmony_ci { 54625db71995Sopenharmony_ci env.loader_settings.add_app_specific_setting(AppSpecificSettings{}.add_stderr_log_filter("all").add_layer_configuration( 54635db71995Sopenharmony_ci LoaderSettingsLayerConfiguration{} 54645db71995Sopenharmony_ci .set_name(layer_name) 54655db71995Sopenharmony_ci .set_control("on") 54665db71995Sopenharmony_ci .set_path(env.get_shimmed_layer_manifest_path(0).str()) 54675db71995Sopenharmony_ci .set_treat_as_implicit_manifest(true))); 54685db71995Sopenharmony_ci env.update_loader_settings(env.loader_settings); 54695db71995Sopenharmony_ci 54705db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 54715db71995Sopenharmony_ci inst.CheckCreate(); 54725db71995Sopenharmony_ci 54735db71995Sopenharmony_ci auto layers = inst.GetActiveLayers(inst.GetPhysDev(), 1); 54745db71995Sopenharmony_ci ASSERT_TRUE(string_eq(layers.at(0).layerName, layer_name)); 54755db71995Sopenharmony_ci } 54765db71995Sopenharmony_ci { 54775db71995Sopenharmony_ci env.loader_settings.app_specific_settings.at(0).layer_configurations.at(0).set_control("off"); 54785db71995Sopenharmony_ci env.update_loader_settings(env.loader_settings); 54795db71995Sopenharmony_ci 54805db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 54815db71995Sopenharmony_ci inst.CheckCreate(); 54825db71995Sopenharmony_ci 54835db71995Sopenharmony_ci ASSERT_NO_FATAL_FAILURE(inst.GetActiveLayers(inst.GetPhysDev(), 0)); 54845db71995Sopenharmony_ci } 54855db71995Sopenharmony_ci { 54865db71995Sopenharmony_ci env.loader_settings.app_specific_settings.at(0).layer_configurations.at(0).set_control("auto"); 54875db71995Sopenharmony_ci env.update_loader_settings(env.loader_settings); 54885db71995Sopenharmony_ci 54895db71995Sopenharmony_ci InstWrapper inst{env.vulkan_functions}; 54905db71995Sopenharmony_ci inst.CheckCreate(); 54915db71995Sopenharmony_ci 54925db71995Sopenharmony_ci ASSERT_NO_FATAL_FAILURE(inst.GetActiveLayers(inst.GetPhysDev(), 0)); 54935db71995Sopenharmony_ci } 54945db71995Sopenharmony_ci} 5495