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