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 * Copyright (c) 2021-2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
65db71995Sopenharmony_ci * Copyright (c) 2023-2023 RasterGrid Kft.
75db71995Sopenharmony_ci *
85db71995Sopenharmony_ci * Permission is hereby granted, free of charge, to any person obtaining a copy
95db71995Sopenharmony_ci * of this software and/or associated documentation files (the "Materials"), to
105db71995Sopenharmony_ci * deal in the Materials without restriction, including without limitation the
115db71995Sopenharmony_ci * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
125db71995Sopenharmony_ci * sell copies of the Materials, and to permit persons to whom the Materials are
135db71995Sopenharmony_ci * furnished to do so, subject to the following conditions:
145db71995Sopenharmony_ci *
155db71995Sopenharmony_ci * The above copyright notice(s) and this permission notice shall be included in
165db71995Sopenharmony_ci * all copies or substantial portions of the Materials.
175db71995Sopenharmony_ci *
185db71995Sopenharmony_ci * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
195db71995Sopenharmony_ci * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
205db71995Sopenharmony_ci * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
215db71995Sopenharmony_ci *
225db71995Sopenharmony_ci * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
235db71995Sopenharmony_ci * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
245db71995Sopenharmony_ci * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE
255db71995Sopenharmony_ci * USE OR OTHER DEALINGS IN THE MATERIALS.
265db71995Sopenharmony_ci *
275db71995Sopenharmony_ci * Author: Charles Giessen <charles@lunarg.com>
285db71995Sopenharmony_ci */
295db71995Sopenharmony_ci
305db71995Sopenharmony_ci#include "test_environment.h"
315db71995Sopenharmony_ci
325db71995Sopenharmony_ci// Test case origin
335db71995Sopenharmony_ci// LX = lunar exchange
345db71995Sopenharmony_ci// LVLGH = loader and validation github
355db71995Sopenharmony_ci// LVLGL = loader and validation gitlab
365db71995Sopenharmony_ci// VL = Vulkan Loader github
375db71995Sopenharmony_ci// VVL = Vulkan Validation Layers github
385db71995Sopenharmony_ci
395db71995Sopenharmony_ciTEST(CreateInstance, BasicRun) {
405db71995Sopenharmony_ci    FrameworkEnvironment env{};
415db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2)).set_min_icd_interface_version(5);
425db71995Sopenharmony_ci
435db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
445db71995Sopenharmony_ci    inst.CheckCreate();
455db71995Sopenharmony_ci}
465db71995Sopenharmony_ci
475db71995Sopenharmony_ci// LX435
485db71995Sopenharmony_ciTEST(CreateInstance, ConstInstanceInfo) {
495db71995Sopenharmony_ci    FrameworkEnvironment env{};
505db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2));
515db71995Sopenharmony_ci    VkInstance inst = VK_NULL_HANDLE;
525db71995Sopenharmony_ci    VkInstanceCreateInfo const info = {VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO, nullptr, 0, nullptr, 0, nullptr, 0, nullptr};
535db71995Sopenharmony_ci    ASSERT_EQ(env.vulkan_functions.vkCreateInstance(&info, VK_NULL_HANDLE, &inst), VK_SUCCESS);
545db71995Sopenharmony_ci    // Must clean up
555db71995Sopenharmony_ci    env.vulkan_functions.vkDestroyInstance(inst, nullptr);
565db71995Sopenharmony_ci}
575db71995Sopenharmony_ci
585db71995Sopenharmony_ci// VUID-vkDestroyInstance-instance-parameter, VUID-vkDestroyInstance-pAllocator-parameter
595db71995Sopenharmony_ciTEST(CreateInstance, DestroyInstanceNullHandle) {
605db71995Sopenharmony_ci    FrameworkEnvironment env{};
615db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2));
625db71995Sopenharmony_ci    env.vulkan_functions.vkDestroyInstance(VK_NULL_HANDLE, nullptr);
635db71995Sopenharmony_ci}
645db71995Sopenharmony_ci
655db71995Sopenharmony_ci// VUID-vkDestroyDevice-device-parameter, VUID-vkDestroyDevice-pAllocator-parameter
665db71995Sopenharmony_ciTEST(CreateInstance, DestroyDeviceNullHandle) {
675db71995Sopenharmony_ci    FrameworkEnvironment env{};
685db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2));
695db71995Sopenharmony_ci    env.vulkan_functions.vkDestroyDevice(VK_NULL_HANDLE, nullptr);
705db71995Sopenharmony_ci}
715db71995Sopenharmony_ci
725db71995Sopenharmony_ci// VUID-vkCreateInstance-ppEnabledExtensionNames-01388
735db71995Sopenharmony_ciTEST(CreateInstance, ExtensionNotPresent) {
745db71995Sopenharmony_ci    FrameworkEnvironment env{};
755db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2));
765db71995Sopenharmony_ci    {
775db71995Sopenharmony_ci        InstWrapper inst{env.vulkan_functions};
785db71995Sopenharmony_ci        inst.create_info.add_extension("VK_EXT_validation_features");  // test icd won't report this as supported
795db71995Sopenharmony_ci        inst.CheckCreate(VK_ERROR_EXTENSION_NOT_PRESENT);
805db71995Sopenharmony_ci    }
815db71995Sopenharmony_ci    {
825db71995Sopenharmony_ci        InstWrapper inst{env.vulkan_functions};
835db71995Sopenharmony_ci        inst.create_info.add_extension("Non_existant_extension");  // unknown instance extension
845db71995Sopenharmony_ci        inst.CheckCreate(VK_ERROR_EXTENSION_NOT_PRESENT);
855db71995Sopenharmony_ci    }
865db71995Sopenharmony_ci}
875db71995Sopenharmony_ci
885db71995Sopenharmony_ciTEST(CreateInstance, LayerNotPresent) {
895db71995Sopenharmony_ci    FrameworkEnvironment env{};
905db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2));
915db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
925db71995Sopenharmony_ci    inst.create_info.add_layer("VK_NON_EXISTANT_LAYER");
935db71995Sopenharmony_ci    inst.CheckCreate(VK_ERROR_LAYER_NOT_PRESENT);
945db71995Sopenharmony_ci}
955db71995Sopenharmony_ci
965db71995Sopenharmony_ciTEST(CreateInstance, LayerPresent) {
975db71995Sopenharmony_ci    FrameworkEnvironment env{};
985db71995Sopenharmony_ci    env.add_icd(TestICDDetails{TEST_ICD_PATH_VERSION_2}).add_physical_device({});
995db71995Sopenharmony_ci
1005db71995Sopenharmony_ci    const char* layer_name = "TestLayer";
1015db71995Sopenharmony_ci    env.add_explicit_layer(
1025db71995Sopenharmony_ci        ManifestLayer{}.add_layer(
1035db71995Sopenharmony_ci            ManifestLayer::LayerDescription{}.set_name(layer_name).set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)),
1045db71995Sopenharmony_ci        "test_layer.json");
1055db71995Sopenharmony_ci
1065db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
1075db71995Sopenharmony_ci    inst.create_info.add_layer(layer_name);
1085db71995Sopenharmony_ci    inst.CheckCreate();
1095db71995Sopenharmony_ci}
1105db71995Sopenharmony_ci
1115db71995Sopenharmony_ciTEST(CreateInstance, RelativePaths) {
1125db71995Sopenharmony_ci    FrameworkEnvironment env{};
1135db71995Sopenharmony_ci    env.add_icd(TestICDDetails{TEST_ICD_PATH_VERSION_2}.set_library_path_type(LibraryPathType::relative)).add_physical_device({});
1145db71995Sopenharmony_ci
1155db71995Sopenharmony_ci    const char* layer_name = "VK_LAYER_TestLayer";
1165db71995Sopenharmony_ci    env.add_explicit_layer(
1175db71995Sopenharmony_ci        TestLayerDetails{ManifestLayer{}.add_layer(
1185db71995Sopenharmony_ci                             ManifestLayer::LayerDescription{}.set_name(layer_name).set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)),
1195db71995Sopenharmony_ci                         "test_layer.json"}
1205db71995Sopenharmony_ci            .set_library_path_type(LibraryPathType::relative));
1215db71995Sopenharmony_ci
1225db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
1235db71995Sopenharmony_ci    inst.create_info.add_layer(layer_name);
1245db71995Sopenharmony_ci    inst.CheckCreate();
1255db71995Sopenharmony_ci
1265db71995Sopenharmony_ci    auto layers = inst.GetActiveLayers(inst.GetPhysDev(), 1);
1275db71995Sopenharmony_ci    ASSERT_TRUE(string_eq(layers.at(0).layerName, layer_name));
1285db71995Sopenharmony_ci}
1295db71995Sopenharmony_ci
1305db71995Sopenharmony_ciTEST(CreateInstance, ApiVersionBelow1_0) {
1315db71995Sopenharmony_ci    FrameworkEnvironment env{};
1325db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2)).set_min_icd_interface_version(5);
1335db71995Sopenharmony_ci
1345db71995Sopenharmony_ci    DebugUtilsLogger debug_log{VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT};
1355db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
1365db71995Sopenharmony_ci    FillDebugUtilsCreateDetails(inst.create_info, debug_log);
1375db71995Sopenharmony_ci    inst.create_info.api_version = 1;
1385db71995Sopenharmony_ci    inst.CheckCreate();
1395db71995Sopenharmony_ci    ASSERT_TRUE(
1405db71995Sopenharmony_ci        debug_log.find("VkInstanceCreateInfo::pApplicationInfo::apiVersion has value of 1 which is not permitted. If apiVersion is "
1415db71995Sopenharmony_ci                       "not 0, then it must be "
1425db71995Sopenharmony_ci                       "greater than or equal to the value of VK_API_VERSION_1_0 [VUID-VkApplicationInfo-apiVersion]"));
1435db71995Sopenharmony_ci}
1445db71995Sopenharmony_ci
1455db71995Sopenharmony_ciTEST(CreateInstance, ConsecutiveCreate) {
1465db71995Sopenharmony_ci    FrameworkEnvironment env{};
1475db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2));
1485db71995Sopenharmony_ci
1495db71995Sopenharmony_ci    for (uint32_t i = 0; i < 100; i++) {
1505db71995Sopenharmony_ci        InstWrapper inst{env.vulkan_functions};
1515db71995Sopenharmony_ci        inst.CheckCreate();
1525db71995Sopenharmony_ci    }
1535db71995Sopenharmony_ci}
1545db71995Sopenharmony_ci
1555db71995Sopenharmony_ciTEST(CreateInstance, ConsecutiveCreateWithoutDestruction) {
1565db71995Sopenharmony_ci    FrameworkEnvironment env{};
1575db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2));
1585db71995Sopenharmony_ci
1595db71995Sopenharmony_ci    std::vector<InstWrapper> instances;
1605db71995Sopenharmony_ci    for (uint32_t i = 0; i < 100; i++) {
1615db71995Sopenharmony_ci        instances.emplace_back(env.vulkan_functions);
1625db71995Sopenharmony_ci        instances.back().CheckCreate();
1635db71995Sopenharmony_ci    }
1645db71995Sopenharmony_ci}
1655db71995Sopenharmony_ci
1665db71995Sopenharmony_ciTEST(NoDrivers, CreateInstance) {
1675db71995Sopenharmony_ci    FrameworkEnvironment env{};
1685db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
1695db71995Sopenharmony_ci    inst.CheckCreate(VK_ERROR_INCOMPATIBLE_DRIVER);
1705db71995Sopenharmony_ci}
1715db71995Sopenharmony_ci
1725db71995Sopenharmony_ciTEST(EnumerateInstanceLayerProperties, UsageChecks) {
1735db71995Sopenharmony_ci    FrameworkEnvironment env{};
1745db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2));
1755db71995Sopenharmony_ci
1765db71995Sopenharmony_ci    const char* layer_name_1 = "TestLayer1";
1775db71995Sopenharmony_ci    const char* layer_name_2 = "TestLayer1";
1785db71995Sopenharmony_ci
1795db71995Sopenharmony_ci    env.add_explicit_layer(
1805db71995Sopenharmony_ci        ManifestLayer{}.add_layer(
1815db71995Sopenharmony_ci            ManifestLayer::LayerDescription{}.set_name(layer_name_1).set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)),
1825db71995Sopenharmony_ci        "test_layer_1.json");
1835db71995Sopenharmony_ci
1845db71995Sopenharmony_ci    env.add_explicit_layer(
1855db71995Sopenharmony_ci        ManifestLayer{}.add_layer(
1865db71995Sopenharmony_ci            ManifestLayer::LayerDescription{}.set_name(layer_name_2).set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)),
1875db71995Sopenharmony_ci        "test_layer_2.json");
1885db71995Sopenharmony_ci
1895db71995Sopenharmony_ci    {  // OnePass
1905db71995Sopenharmony_ci        VkLayerProperties layer_props[2] = {};
1915db71995Sopenharmony_ci        uint32_t layer_count = 2;
1925db71995Sopenharmony_ci        ASSERT_EQ(VK_SUCCESS, env.vulkan_functions.vkEnumerateInstanceLayerProperties(&layer_count, layer_props));
1935db71995Sopenharmony_ci        ASSERT_EQ(layer_count, 2U);
1945db71995Sopenharmony_ci        auto layers = env.GetLayerProperties(2);
1955db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(layer_name_1, layer_props[0].layerName));
1965db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(layer_name_2, layer_props[1].layerName));
1975db71995Sopenharmony_ci    }
1985db71995Sopenharmony_ci    {  // OnePass
1995db71995Sopenharmony_ci        uint32_t layer_count = 0;
2005db71995Sopenharmony_ci        ASSERT_EQ(VK_SUCCESS, env.vulkan_functions.vkEnumerateInstanceLayerProperties(&layer_count, nullptr));
2015db71995Sopenharmony_ci        ASSERT_EQ(layer_count, 2U);
2025db71995Sopenharmony_ci
2035db71995Sopenharmony_ci        VkLayerProperties layer_props[2] = {};
2045db71995Sopenharmony_ci        ASSERT_EQ(VK_SUCCESS, env.vulkan_functions.vkEnumerateInstanceLayerProperties(&layer_count, layer_props));
2055db71995Sopenharmony_ci        ASSERT_EQ(layer_count, 2U);
2065db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(layer_name_1, layer_props[0].layerName));
2075db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(layer_name_2, layer_props[1].layerName));
2085db71995Sopenharmony_ci    }
2095db71995Sopenharmony_ci    {  // PropertyCountLessThanAvailable
2105db71995Sopenharmony_ci        VkLayerProperties layer_props{};
2115db71995Sopenharmony_ci        uint32_t layer_count = 1;
2125db71995Sopenharmony_ci        ASSERT_EQ(VK_INCOMPLETE, env.vulkan_functions.vkEnumerateInstanceLayerProperties(&layer_count, &layer_props));
2135db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(layer_name_1, layer_props.layerName));
2145db71995Sopenharmony_ci    }
2155db71995Sopenharmony_ci}
2165db71995Sopenharmony_ci
2175db71995Sopenharmony_ciTEST(EnumerateInstanceExtensionProperties, UsageChecks) {
2185db71995Sopenharmony_ci    FrameworkEnvironment env{};
2195db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2));
2205db71995Sopenharmony_ci
2215db71995Sopenharmony_ci    Extension first_ext{"VK_EXT_validation_features"};  // known instance extensions
2225db71995Sopenharmony_ci    Extension second_ext{"VK_EXT_headless_surface"};
2235db71995Sopenharmony_ci    env.reset_icd().add_instance_extensions({first_ext, second_ext});
2245db71995Sopenharmony_ci
2255db71995Sopenharmony_ci    {  // One Pass
2265db71995Sopenharmony_ci        uint32_t extension_count = 6;
2275db71995Sopenharmony_ci        std::array<VkExtensionProperties, 6> extensions;
2285db71995Sopenharmony_ci        ASSERT_EQ(VK_SUCCESS,
2295db71995Sopenharmony_ci                  env.vulkan_functions.vkEnumerateInstanceExtensionProperties(nullptr, &extension_count, extensions.data()));
2305db71995Sopenharmony_ci        ASSERT_EQ(extension_count, 6U);  // default extensions + our two extensions
2315db71995Sopenharmony_ci
2325db71995Sopenharmony_ci        EXPECT_TRUE(string_eq(extensions.at(0).extensionName, first_ext.extensionName.c_str()));
2335db71995Sopenharmony_ci        EXPECT_TRUE(string_eq(extensions.at(1).extensionName, second_ext.extensionName.c_str()));
2345db71995Sopenharmony_ci        EXPECT_TRUE(string_eq(extensions.at(2).extensionName, VK_EXT_DEBUG_REPORT_EXTENSION_NAME));
2355db71995Sopenharmony_ci        EXPECT_TRUE(string_eq(extensions.at(3).extensionName, VK_EXT_DEBUG_UTILS_EXTENSION_NAME));
2365db71995Sopenharmony_ci        EXPECT_TRUE(string_eq(extensions.at(4).extensionName, VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME));
2375db71995Sopenharmony_ci        EXPECT_TRUE(string_eq(extensions.at(5).extensionName, VK_LUNARG_DIRECT_DRIVER_LOADING_EXTENSION_NAME));
2385db71995Sopenharmony_ci    }
2395db71995Sopenharmony_ci    {  // Two Pass
2405db71995Sopenharmony_ci        auto extensions = env.GetInstanceExtensions(6);
2415db71995Sopenharmony_ci        // loader always adds the debug report & debug utils extensions
2425db71995Sopenharmony_ci        EXPECT_TRUE(string_eq(extensions.at(0).extensionName, first_ext.extensionName.c_str()));
2435db71995Sopenharmony_ci        EXPECT_TRUE(string_eq(extensions.at(1).extensionName, second_ext.extensionName.c_str()));
2445db71995Sopenharmony_ci        EXPECT_TRUE(string_eq(extensions.at(2).extensionName, VK_EXT_DEBUG_REPORT_EXTENSION_NAME));
2455db71995Sopenharmony_ci        EXPECT_TRUE(string_eq(extensions.at(3).extensionName, VK_EXT_DEBUG_UTILS_EXTENSION_NAME));
2465db71995Sopenharmony_ci        EXPECT_TRUE(string_eq(extensions.at(4).extensionName, VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME));
2475db71995Sopenharmony_ci        EXPECT_TRUE(string_eq(extensions.at(5).extensionName, VK_LUNARG_DIRECT_DRIVER_LOADING_EXTENSION_NAME));
2485db71995Sopenharmony_ci    }
2495db71995Sopenharmony_ci}
2505db71995Sopenharmony_ci
2515db71995Sopenharmony_ciTEST(EnumerateInstanceExtensionProperties, PropertyCountLessThanAvailable) {
2525db71995Sopenharmony_ci    FrameworkEnvironment env{};
2535db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2));
2545db71995Sopenharmony_ci
2555db71995Sopenharmony_ci    uint32_t extension_count = 0;
2565db71995Sopenharmony_ci    std::array<VkExtensionProperties, 4> extensions;
2575db71995Sopenharmony_ci    {  // use nullptr for null string
2585db71995Sopenharmony_ci        ASSERT_EQ(VK_SUCCESS, env.vulkan_functions.vkEnumerateInstanceExtensionProperties(nullptr, &extension_count, nullptr));
2595db71995Sopenharmony_ci        ASSERT_EQ(extension_count, 4U);  // return debug report & debug utils & portability enumeration & direct driver loading
2605db71995Sopenharmony_ci        extension_count = 1;             // artificially remove one extension
2615db71995Sopenharmony_ci
2625db71995Sopenharmony_ci        ASSERT_EQ(VK_INCOMPLETE,
2635db71995Sopenharmony_ci                  env.vulkan_functions.vkEnumerateInstanceExtensionProperties(nullptr, &extension_count, extensions.data()));
2645db71995Sopenharmony_ci        ASSERT_EQ(extension_count, 1U);
2655db71995Sopenharmony_ci        // loader always adds the debug report & debug utils extensions
2665db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(extensions[0].extensionName, "VK_EXT_debug_report"));
2675db71995Sopenharmony_ci    }
2685db71995Sopenharmony_ci    {  // use "" for null string
2695db71995Sopenharmony_ci        ASSERT_EQ(VK_SUCCESS, env.vulkan_functions.vkEnumerateInstanceExtensionProperties("", &extension_count, nullptr));
2705db71995Sopenharmony_ci        ASSERT_EQ(extension_count, 4U);  // return debug report & debug utils & portability enumeration & direct driver loading
2715db71995Sopenharmony_ci        extension_count = 1;             // artificially remove one extension
2725db71995Sopenharmony_ci
2735db71995Sopenharmony_ci        ASSERT_EQ(VK_INCOMPLETE,
2745db71995Sopenharmony_ci                  env.vulkan_functions.vkEnumerateInstanceExtensionProperties("", &extension_count, extensions.data()));
2755db71995Sopenharmony_ci        ASSERT_EQ(extension_count, 1U);
2765db71995Sopenharmony_ci        // loader always adds the debug report & debug utils extensions
2775db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(extensions[0].extensionName, "VK_EXT_debug_report"));
2785db71995Sopenharmony_ci    }
2795db71995Sopenharmony_ci}
2805db71995Sopenharmony_ci
2815db71995Sopenharmony_ciTEST(EnumerateInstanceExtensionProperties, FilterUnkownInstanceExtensions) {
2825db71995Sopenharmony_ci    FrameworkEnvironment env{};
2835db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2));
2845db71995Sopenharmony_ci
2855db71995Sopenharmony_ci    Extension first_ext{"FirstTestExtension"};  // unknown instance extensions
2865db71995Sopenharmony_ci    Extension second_ext{"SecondTestExtension"};
2875db71995Sopenharmony_ci    env.reset_icd().add_instance_extensions({first_ext, second_ext});
2885db71995Sopenharmony_ci    {
2895db71995Sopenharmony_ci        auto extensions = env.GetInstanceExtensions(4);
2905db71995Sopenharmony_ci        // loader always adds the debug report & debug utils extensions
2915db71995Sopenharmony_ci        EXPECT_TRUE(string_eq(extensions.at(0).extensionName, VK_EXT_DEBUG_REPORT_EXTENSION_NAME));
2925db71995Sopenharmony_ci        EXPECT_TRUE(string_eq(extensions.at(1).extensionName, VK_EXT_DEBUG_UTILS_EXTENSION_NAME));
2935db71995Sopenharmony_ci        EXPECT_TRUE(string_eq(extensions.at(2).extensionName, VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME));
2945db71995Sopenharmony_ci        EXPECT_TRUE(string_eq(extensions.at(3).extensionName, VK_LUNARG_DIRECT_DRIVER_LOADING_EXTENSION_NAME));
2955db71995Sopenharmony_ci    }
2965db71995Sopenharmony_ci    {  // Disable unknown instance extension filtering
2975db71995Sopenharmony_ci        EnvVarWrapper disable_inst_ext_filter_env_var{"VK_LOADER_DISABLE_INST_EXT_FILTER", "1"};
2985db71995Sopenharmony_ci
2995db71995Sopenharmony_ci        auto extensions = env.GetInstanceExtensions(6);
3005db71995Sopenharmony_ci        EXPECT_TRUE(string_eq(extensions.at(0).extensionName, first_ext.extensionName.c_str()));
3015db71995Sopenharmony_ci        EXPECT_TRUE(string_eq(extensions.at(1).extensionName, second_ext.extensionName.c_str()));
3025db71995Sopenharmony_ci        EXPECT_TRUE(string_eq(extensions.at(2).extensionName, VK_EXT_DEBUG_REPORT_EXTENSION_NAME));
3035db71995Sopenharmony_ci        EXPECT_TRUE(string_eq(extensions.at(3).extensionName, VK_EXT_DEBUG_UTILS_EXTENSION_NAME));
3045db71995Sopenharmony_ci        EXPECT_TRUE(string_eq(extensions.at(4).extensionName, VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME));
3055db71995Sopenharmony_ci        EXPECT_TRUE(string_eq(extensions.at(5).extensionName, VK_LUNARG_DIRECT_DRIVER_LOADING_EXTENSION_NAME));
3065db71995Sopenharmony_ci    }
3075db71995Sopenharmony_ci}
3085db71995Sopenharmony_ci
3095db71995Sopenharmony_ciTEST(EnumerateDeviceLayerProperties, LayersMatch) {
3105db71995Sopenharmony_ci    FrameworkEnvironment env{};
3115db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2)).add_physical_device("physical_device_0");
3125db71995Sopenharmony_ci
3135db71995Sopenharmony_ci    const char* layer_name = "TestLayer";
3145db71995Sopenharmony_ci    env.add_explicit_layer(
3155db71995Sopenharmony_ci        ManifestLayer{}.add_layer(
3165db71995Sopenharmony_ci            ManifestLayer::LayerDescription{}.set_name(layer_name).set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)),
3175db71995Sopenharmony_ci        "test_layer.json");
3185db71995Sopenharmony_ci
3195db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
3205db71995Sopenharmony_ci    inst.create_info.add_layer(layer_name);
3215db71995Sopenharmony_ci    inst.CheckCreate();
3225db71995Sopenharmony_ci
3235db71995Sopenharmony_ci    VkPhysicalDevice phys_dev = inst.GetPhysDev();
3245db71995Sopenharmony_ci    {  // LayersMatch
3255db71995Sopenharmony_ci        auto layer_props = inst.GetActiveLayers(phys_dev, 1);
3265db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(layer_props.at(0).layerName, layer_name));
3275db71995Sopenharmony_ci    }
3285db71995Sopenharmony_ci    {  // Property count less than available
3295db71995Sopenharmony_ci        VkLayerProperties layer_props;
3305db71995Sopenharmony_ci        uint32_t layer_count = 0;
3315db71995Sopenharmony_ci        ASSERT_EQ(VK_INCOMPLETE, env.vulkan_functions.vkEnumerateDeviceLayerProperties(phys_dev, &layer_count, &layer_props));
3325db71995Sopenharmony_ci        ASSERT_EQ(layer_count, 0U);
3335db71995Sopenharmony_ci    }
3345db71995Sopenharmony_ci}
3355db71995Sopenharmony_ci
3365db71995Sopenharmony_ciTEST(EnumerateDeviceExtensionProperties, DeviceExtensionEnumerated) {
3375db71995Sopenharmony_ci    FrameworkEnvironment env{};
3385db71995Sopenharmony_ci    auto& driver = env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2)).add_physical_device("physical_device_0");
3395db71995Sopenharmony_ci
3405db71995Sopenharmony_ci    std::array<Extension, 2> device_extensions = {Extension{"MyExtension0", 4}, Extension{"MyExtension1", 7}};
3415db71995Sopenharmony_ci    for (auto& ext : device_extensions) {
3425db71995Sopenharmony_ci        driver.physical_devices.front().extensions.push_back(ext);
3435db71995Sopenharmony_ci    }
3445db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
3455db71995Sopenharmony_ci    inst.CheckCreate();
3465db71995Sopenharmony_ci
3475db71995Sopenharmony_ci    uint32_t driver_count = 1;
3485db71995Sopenharmony_ci    VkPhysicalDevice physical_device;
3495db71995Sopenharmony_ci    ASSERT_EQ(VK_SUCCESS, inst->vkEnumeratePhysicalDevices(inst, &driver_count, &physical_device));
3505db71995Sopenharmony_ci
3515db71995Sopenharmony_ci    uint32_t extension_count = 0;
3525db71995Sopenharmony_ci    ASSERT_EQ(VK_SUCCESS, inst->vkEnumerateDeviceExtensionProperties(physical_device, nullptr, &extension_count, nullptr));
3535db71995Sopenharmony_ci    ASSERT_EQ(extension_count, device_extensions.size());
3545db71995Sopenharmony_ci
3555db71995Sopenharmony_ci    std::array<VkExtensionProperties, 2> enumerated_device_exts;
3565db71995Sopenharmony_ci    ASSERT_EQ(VK_SUCCESS, inst->vkEnumerateDeviceExtensionProperties(physical_device, nullptr, &extension_count,
3575db71995Sopenharmony_ci                                                                     enumerated_device_exts.data()));
3585db71995Sopenharmony_ci    ASSERT_EQ(extension_count, device_extensions.size());
3595db71995Sopenharmony_ci    ASSERT_TRUE(device_extensions[0].extensionName == enumerated_device_exts[0].extensionName);
3605db71995Sopenharmony_ci    ASSERT_TRUE(device_extensions[0].specVersion == enumerated_device_exts[0].specVersion);
3615db71995Sopenharmony_ci}
3625db71995Sopenharmony_ci
3635db71995Sopenharmony_ciTEST(EnumerateDeviceExtensionProperties, PropertyCountLessThanAvailable) {
3645db71995Sopenharmony_ci    FrameworkEnvironment env{};
3655db71995Sopenharmony_ci    auto& driver = env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2)).add_physical_device("physical_device_0");
3665db71995Sopenharmony_ci
3675db71995Sopenharmony_ci    std::array<Extension, 2> device_extensions = {Extension{"MyExtension0", 4}, Extension{"MyExtension1", 7}};
3685db71995Sopenharmony_ci    for (auto& ext : device_extensions) {
3695db71995Sopenharmony_ci        driver.physical_devices.front().extensions.push_back(ext);
3705db71995Sopenharmony_ci    }
3715db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
3725db71995Sopenharmony_ci    inst.CheckCreate();
3735db71995Sopenharmony_ci
3745db71995Sopenharmony_ci    uint32_t driver_count = 1;
3755db71995Sopenharmony_ci    VkPhysicalDevice physical_device;
3765db71995Sopenharmony_ci    ASSERT_EQ(VK_SUCCESS, inst->vkEnumeratePhysicalDevices(inst, &driver_count, &physical_device));
3775db71995Sopenharmony_ci
3785db71995Sopenharmony_ci    uint32_t extension_count = 0;
3795db71995Sopenharmony_ci    ASSERT_EQ(VK_SUCCESS, inst->vkEnumerateDeviceExtensionProperties(physical_device, "", &extension_count, nullptr));
3805db71995Sopenharmony_ci    ASSERT_EQ(extension_count, device_extensions.size());
3815db71995Sopenharmony_ci    extension_count -= 1;
3825db71995Sopenharmony_ci
3835db71995Sopenharmony_ci    std::array<VkExtensionProperties, 2> enumerated_device_exts;
3845db71995Sopenharmony_ci    ASSERT_EQ(VK_INCOMPLETE,
3855db71995Sopenharmony_ci              inst->vkEnumerateDeviceExtensionProperties(physical_device, "", &extension_count, enumerated_device_exts.data()));
3865db71995Sopenharmony_ci    ASSERT_EQ(extension_count, device_extensions.size() - 1);
3875db71995Sopenharmony_ci    ASSERT_TRUE(device_extensions[0].extensionName == enumerated_device_exts[0].extensionName);
3885db71995Sopenharmony_ci    ASSERT_TRUE(device_extensions[0].specVersion == enumerated_device_exts[0].specVersion);
3895db71995Sopenharmony_ci}
3905db71995Sopenharmony_ci
3915db71995Sopenharmony_ciTEST(EnumerateDeviceExtensionProperties, ZeroPhysicalDeviceExtensions) {
3925db71995Sopenharmony_ci    FrameworkEnvironment env{};
3935db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2)).add_physical_device({});
3945db71995Sopenharmony_ci
3955db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
3965db71995Sopenharmony_ci    inst.create_info.set_api_version(VK_MAKE_API_VERSION(0, 1, 1, 0));
3975db71995Sopenharmony_ci    inst.CheckCreate(VK_SUCCESS);
3985db71995Sopenharmony_ci
3995db71995Sopenharmony_ci    auto phys_dev = inst.GetPhysDev();
4005db71995Sopenharmony_ci    DeviceWrapper dev{inst};
4015db71995Sopenharmony_ci    dev.CheckCreate(phys_dev);
4025db71995Sopenharmony_ci
4035db71995Sopenharmony_ci    uint32_t ext_count = 0;
4045db71995Sopenharmony_ci    ASSERT_EQ(VK_SUCCESS, env.vulkan_functions.vkEnumerateDeviceExtensionProperties(phys_dev, nullptr, &ext_count, nullptr));
4055db71995Sopenharmony_ci    ASSERT_EQ(ext_count, 0U);
4065db71995Sopenharmony_ci    VkExtensionProperties ext_props{};
4075db71995Sopenharmony_ci    ASSERT_EQ(VK_SUCCESS, env.vulkan_functions.vkEnumerateDeviceExtensionProperties(phys_dev, nullptr, &ext_count, &ext_props));
4085db71995Sopenharmony_ci    ASSERT_EQ(ext_count, 0U);
4095db71995Sopenharmony_ci}
4105db71995Sopenharmony_ci
4115db71995Sopenharmony_civoid exercise_EnumerateDeviceExtensionProperties(InstWrapper& inst, VkPhysicalDevice physical_device,
4125db71995Sopenharmony_ci                                                 std::vector<Extension>& exts_to_expect) {
4135db71995Sopenharmony_ci    {  // "expected enumeration pattern"
4145db71995Sopenharmony_ci        uint32_t extension_count = 0;
4155db71995Sopenharmony_ci        ASSERT_EQ(VK_SUCCESS, inst->vkEnumerateDeviceExtensionProperties(physical_device, nullptr, &extension_count, nullptr));
4165db71995Sopenharmony_ci        ASSERT_EQ(extension_count, exts_to_expect.size());
4175db71995Sopenharmony_ci
4185db71995Sopenharmony_ci        std::vector<VkExtensionProperties> enumerated_device_exts{extension_count};
4195db71995Sopenharmony_ci        ASSERT_EQ(VK_SUCCESS, inst->vkEnumerateDeviceExtensionProperties(physical_device, nullptr, &extension_count,
4205db71995Sopenharmony_ci                                                                         enumerated_device_exts.data()));
4215db71995Sopenharmony_ci        ASSERT_EQ(extension_count, exts_to_expect.size());
4225db71995Sopenharmony_ci        for (uint32_t i = 0; i < exts_to_expect.size(); i++) {
4235db71995Sopenharmony_ci            ASSERT_TRUE(exts_to_expect[i].extensionName == enumerated_device_exts[i].extensionName);
4245db71995Sopenharmony_ci            ASSERT_EQ(exts_to_expect[i].specVersion, enumerated_device_exts[i].specVersion);
4255db71995Sopenharmony_ci        }
4265db71995Sopenharmony_ci    }
4275db71995Sopenharmony_ci    {  // "Single call pattern"
4285db71995Sopenharmony_ci        uint32_t extension_count = static_cast<uint32_t>(exts_to_expect.size());
4295db71995Sopenharmony_ci        std::vector<VkExtensionProperties> enumerated_device_exts{extension_count};
4305db71995Sopenharmony_ci        ASSERT_EQ(VK_SUCCESS, inst->vkEnumerateDeviceExtensionProperties(physical_device, nullptr, &extension_count,
4315db71995Sopenharmony_ci                                                                         enumerated_device_exts.data()));
4325db71995Sopenharmony_ci        ASSERT_EQ(extension_count, exts_to_expect.size());
4335db71995Sopenharmony_ci        enumerated_device_exts.resize(extension_count);
4345db71995Sopenharmony_ci
4355db71995Sopenharmony_ci        ASSERT_EQ(extension_count, exts_to_expect.size());
4365db71995Sopenharmony_ci        for (uint32_t i = 0; i < exts_to_expect.size(); i++) {
4375db71995Sopenharmony_ci            ASSERT_TRUE(exts_to_expect[i].extensionName == enumerated_device_exts[i].extensionName);
4385db71995Sopenharmony_ci            ASSERT_EQ(exts_to_expect[i].specVersion, enumerated_device_exts[i].specVersion);
4395db71995Sopenharmony_ci        }
4405db71995Sopenharmony_ci    }
4415db71995Sopenharmony_ci    {  // pPropertiesCount == NULL
4425db71995Sopenharmony_ci        ASSERT_EQ(VK_INCOMPLETE, inst->vkEnumerateDeviceExtensionProperties(physical_device, nullptr, nullptr, nullptr));
4435db71995Sopenharmony_ci    }
4445db71995Sopenharmony_ci    {  // 2nd call pass in way more than in reality
4455db71995Sopenharmony_ci        uint32_t extension_count = std::numeric_limits<uint32_t>::max();
4465db71995Sopenharmony_ci        ASSERT_EQ(VK_SUCCESS, inst->vkEnumerateDeviceExtensionProperties(physical_device, nullptr, &extension_count, nullptr));
4475db71995Sopenharmony_ci        ASSERT_EQ(extension_count, exts_to_expect.size());
4485db71995Sopenharmony_ci
4495db71995Sopenharmony_ci        // reset size to a not earthshatteringly large number of extensions
4505db71995Sopenharmony_ci        extension_count = static_cast<uint32_t>(exts_to_expect.size()) * 4;
4515db71995Sopenharmony_ci        std::vector<VkExtensionProperties> enumerated_device_exts{extension_count};
4525db71995Sopenharmony_ci
4535db71995Sopenharmony_ci        ASSERT_EQ(VK_SUCCESS, inst->vkEnumerateDeviceExtensionProperties(physical_device, nullptr, &extension_count,
4545db71995Sopenharmony_ci                                                                         enumerated_device_exts.data()));
4555db71995Sopenharmony_ci        ASSERT_EQ(extension_count, exts_to_expect.size());
4565db71995Sopenharmony_ci        for (uint32_t i = 0; i < exts_to_expect.size(); i++) {
4575db71995Sopenharmony_ci            ASSERT_TRUE(exts_to_expect[i].extensionName == enumerated_device_exts[i].extensionName);
4585db71995Sopenharmony_ci            ASSERT_EQ(exts_to_expect[i].specVersion, enumerated_device_exts[i].specVersion);
4595db71995Sopenharmony_ci        }
4605db71995Sopenharmony_ci    }
4615db71995Sopenharmony_ci    {  // 2nd call pass in not enough, go through all possible values from 0 to exts_to_expect.size()
4625db71995Sopenharmony_ci        uint32_t extension_count = std::numeric_limits<uint32_t>::max();
4635db71995Sopenharmony_ci        ASSERT_EQ(VK_SUCCESS, inst->vkEnumerateDeviceExtensionProperties(physical_device, nullptr, &extension_count, nullptr));
4645db71995Sopenharmony_ci        ASSERT_EQ(extension_count, exts_to_expect.size());
4655db71995Sopenharmony_ci        std::vector<VkExtensionProperties> enumerated_device_exts{extension_count};
4665db71995Sopenharmony_ci        for (uint32_t i = 0; i < exts_to_expect.size() - 1; i++) {
4675db71995Sopenharmony_ci            extension_count = i;
4685db71995Sopenharmony_ci            ASSERT_EQ(VK_INCOMPLETE, inst->vkEnumerateDeviceExtensionProperties(physical_device, nullptr, &extension_count,
4695db71995Sopenharmony_ci                                                                                enumerated_device_exts.data()));
4705db71995Sopenharmony_ci            ASSERT_EQ(extension_count, i);
4715db71995Sopenharmony_ci            for (uint32_t j = 0; j < i; j++) {
4725db71995Sopenharmony_ci                ASSERT_TRUE(exts_to_expect[j].extensionName == enumerated_device_exts[j].extensionName);
4735db71995Sopenharmony_ci                ASSERT_EQ(exts_to_expect[j].specVersion, enumerated_device_exts[j].specVersion);
4745db71995Sopenharmony_ci            }
4755db71995Sopenharmony_ci        }
4765db71995Sopenharmony_ci    }
4775db71995Sopenharmony_ci}
4785db71995Sopenharmony_ci
4795db71995Sopenharmony_ciTEST(EnumerateDeviceExtensionProperties, ImplicitLayerPresentNoExtensions) {
4805db71995Sopenharmony_ci    FrameworkEnvironment env{};
4815db71995Sopenharmony_ci
4825db71995Sopenharmony_ci    std::vector<Extension> exts = {Extension{"MyDriverExtension0", 4}, Extension{"MyDriverExtension1", 7},
4835db71995Sopenharmony_ci                                   Extension{"MyDriverExtension2", 6}, Extension{"MyDriverExtension3", 10}};
4845db71995Sopenharmony_ci
4855db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2))
4865db71995Sopenharmony_ci        .add_physical_device("physical_device_0")
4875db71995Sopenharmony_ci        .physical_devices.at(0)
4885db71995Sopenharmony_ci        .add_extensions(exts);
4895db71995Sopenharmony_ci
4905db71995Sopenharmony_ci    env.add_implicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{}
4915db71995Sopenharmony_ci                                                         .set_name("implicit_layer_name")
4925db71995Sopenharmony_ci                                                         .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)
4935db71995Sopenharmony_ci                                                         .set_disable_environment("DISABLE_ME")),
4945db71995Sopenharmony_ci                           "implicit_test_layer.json");
4955db71995Sopenharmony_ci
4965db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
4975db71995Sopenharmony_ci    inst.CheckCreate();
4985db71995Sopenharmony_ci
4995db71995Sopenharmony_ci    exercise_EnumerateDeviceExtensionProperties(inst, inst.GetPhysDev(), exts);
5005db71995Sopenharmony_ci}
5015db71995Sopenharmony_ci
5025db71995Sopenharmony_ciTEST(EnumerateDeviceExtensionProperties, ImplicitLayerPresentWithExtensions) {
5035db71995Sopenharmony_ci    FrameworkEnvironment env{};
5045db71995Sopenharmony_ci    auto& driver = env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2)).add_physical_device({});
5055db71995Sopenharmony_ci
5065db71995Sopenharmony_ci    std::vector<Extension> exts;
5075db71995Sopenharmony_ci    std::vector<ManifestLayer::LayerDescription::Extension> layer_exts;
5085db71995Sopenharmony_ci    for (uint32_t i = 0; i < 6; i++) {
5095db71995Sopenharmony_ci        exts.emplace_back(std::string("LayerExtNumba") + std::to_string(i), i + 10);
5105db71995Sopenharmony_ci        layer_exts.emplace_back(std::string("LayerExtNumba") + std::to_string(i), i + 10);
5115db71995Sopenharmony_ci    }
5125db71995Sopenharmony_ci    env.add_implicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{}
5135db71995Sopenharmony_ci                                                         .set_name("implicit_layer_name")
5145db71995Sopenharmony_ci                                                         .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)
5155db71995Sopenharmony_ci                                                         .set_disable_environment("DISABLE_ME")
5165db71995Sopenharmony_ci                                                         .add_device_extensions({layer_exts})),
5175db71995Sopenharmony_ci                           "implicit_test_layer.json");
5185db71995Sopenharmony_ci    auto& layer = env.get_test_layer();
5195db71995Sopenharmony_ci    layer.device_extensions = exts;
5205db71995Sopenharmony_ci
5215db71995Sopenharmony_ci    driver.physical_devices.front().extensions.emplace_back("MyDriverExtension0", 4);
5225db71995Sopenharmony_ci    driver.physical_devices.front().extensions.emplace_back("MyDriverExtension1", 7);
5235db71995Sopenharmony_ci
5245db71995Sopenharmony_ci    exts.insert(exts.begin(), driver.physical_devices.front().extensions.begin(), driver.physical_devices.front().extensions.end());
5255db71995Sopenharmony_ci
5265db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
5275db71995Sopenharmony_ci    inst.CheckCreate();
5285db71995Sopenharmony_ci
5295db71995Sopenharmony_ci    VkPhysicalDevice physical_device = inst.GetPhysDev();
5305db71995Sopenharmony_ci    exercise_EnumerateDeviceExtensionProperties(inst, physical_device, exts);
5315db71995Sopenharmony_ci}
5325db71995Sopenharmony_ci
5335db71995Sopenharmony_ciTEST(EnumerateDeviceExtensionProperties, ImplicitLayerPresentWithLotsOfExtensions) {
5345db71995Sopenharmony_ci    FrameworkEnvironment env{};
5355db71995Sopenharmony_ci    auto& driver = env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2)).add_physical_device({});
5365db71995Sopenharmony_ci
5375db71995Sopenharmony_ci    std::vector<Extension> exts;
5385db71995Sopenharmony_ci    std::vector<ManifestLayer::LayerDescription::Extension> layer_exts;
5395db71995Sopenharmony_ci    for (uint32_t i = 0; i < 26; i++) {
5405db71995Sopenharmony_ci        exts.emplace_back(std::string("LayerExtNumba") + std::to_string(i), i + 10);
5415db71995Sopenharmony_ci        layer_exts.emplace_back(std::string("LayerExtNumba") + std::to_string(i), i + 10);
5425db71995Sopenharmony_ci    }
5435db71995Sopenharmony_ci    env.add_implicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{}
5445db71995Sopenharmony_ci                                                         .set_name("implicit_layer_name")
5455db71995Sopenharmony_ci                                                         .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)
5465db71995Sopenharmony_ci                                                         .set_disable_environment("DISABLE_ME")
5475db71995Sopenharmony_ci                                                         .add_device_extensions({layer_exts})),
5485db71995Sopenharmony_ci                           "implicit_test_layer.json");
5495db71995Sopenharmony_ci    auto& layer = env.get_test_layer();
5505db71995Sopenharmony_ci    layer.device_extensions = exts;
5515db71995Sopenharmony_ci
5525db71995Sopenharmony_ci    driver.physical_devices.front().extensions.emplace_back("MyDriverExtension0", 4);
5535db71995Sopenharmony_ci    driver.physical_devices.front().extensions.emplace_back("MyDriverExtension1", 7);
5545db71995Sopenharmony_ci    driver.physical_devices.front().extensions.emplace_back("MyDriverExtension2", 6);
5555db71995Sopenharmony_ci    driver.physical_devices.front().extensions.emplace_back("MyDriverExtension3", 9);
5565db71995Sopenharmony_ci
5575db71995Sopenharmony_ci    exts.insert(exts.begin(), driver.physical_devices.front().extensions.begin(), driver.physical_devices.front().extensions.end());
5585db71995Sopenharmony_ci
5595db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
5605db71995Sopenharmony_ci    inst.CheckCreate();
5615db71995Sopenharmony_ci
5625db71995Sopenharmony_ci    VkPhysicalDevice physical_device = inst.GetPhysDev();
5635db71995Sopenharmony_ci    exercise_EnumerateDeviceExtensionProperties(inst, physical_device, exts);
5645db71995Sopenharmony_ci}
5655db71995Sopenharmony_ci
5665db71995Sopenharmony_ciTEST(EnumerateDeviceExtensionProperties, NoDriverExtensionsImplicitLayerPresentWithExtensions) {
5675db71995Sopenharmony_ci    FrameworkEnvironment env{};
5685db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2)).add_physical_device({});
5695db71995Sopenharmony_ci
5705db71995Sopenharmony_ci    std::vector<Extension> exts;
5715db71995Sopenharmony_ci    std::vector<ManifestLayer::LayerDescription::Extension> layer_exts;
5725db71995Sopenharmony_ci    for (uint32_t i = 0; i < 6; i++) {
5735db71995Sopenharmony_ci        exts.emplace_back(std::string("LayerExtNumba") + std::to_string(i), i + 10);
5745db71995Sopenharmony_ci        layer_exts.emplace_back(std::string("LayerExtNumba") + std::to_string(i), i + 10);
5755db71995Sopenharmony_ci    }
5765db71995Sopenharmony_ci    env.add_implicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{}
5775db71995Sopenharmony_ci                                                         .set_name("implicit_layer_name")
5785db71995Sopenharmony_ci                                                         .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)
5795db71995Sopenharmony_ci                                                         .set_disable_environment("DISABLE_ME")
5805db71995Sopenharmony_ci                                                         .add_device_extensions({layer_exts})),
5815db71995Sopenharmony_ci                           "implicit_test_layer.json");
5825db71995Sopenharmony_ci    auto& layer = env.get_test_layer();
5835db71995Sopenharmony_ci    layer.device_extensions = exts;
5845db71995Sopenharmony_ci
5855db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
5865db71995Sopenharmony_ci    inst.CheckCreate();
5875db71995Sopenharmony_ci
5885db71995Sopenharmony_ci    VkPhysicalDevice physical_device = inst.GetPhysDev();
5895db71995Sopenharmony_ci    exercise_EnumerateDeviceExtensionProperties(inst, physical_device, exts);
5905db71995Sopenharmony_ci}
5915db71995Sopenharmony_ci
5925db71995Sopenharmony_ciTEST(EnumerateDeviceExtensionProperties, NoDriverExtensionsImplicitLayerPresentWithLotsOfExtensions) {
5935db71995Sopenharmony_ci    FrameworkEnvironment env{};
5945db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2)).add_physical_device({});
5955db71995Sopenharmony_ci
5965db71995Sopenharmony_ci    std::vector<Extension> exts;
5975db71995Sopenharmony_ci    std::vector<ManifestLayer::LayerDescription::Extension> layer_exts;
5985db71995Sopenharmony_ci    for (uint32_t i = 0; i < 6; i++) {
5995db71995Sopenharmony_ci        exts.emplace_back(std::string("LayerExtNumba") + std::to_string(i), i + 10);
6005db71995Sopenharmony_ci        layer_exts.emplace_back(std::string("LayerExtNumba") + std::to_string(i), i + 10);
6015db71995Sopenharmony_ci    }
6025db71995Sopenharmony_ci    env.add_implicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{}
6035db71995Sopenharmony_ci                                                         .set_name("implicit_layer_name")
6045db71995Sopenharmony_ci                                                         .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)
6055db71995Sopenharmony_ci                                                         .set_disable_environment("DISABLE_ME")
6065db71995Sopenharmony_ci                                                         .add_device_extensions({layer_exts})),
6075db71995Sopenharmony_ci                           "implicit_test_layer.json");
6085db71995Sopenharmony_ci    auto& layer = env.get_test_layer();
6095db71995Sopenharmony_ci    layer.device_extensions = exts;
6105db71995Sopenharmony_ci
6115db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
6125db71995Sopenharmony_ci    inst.CheckCreate();
6135db71995Sopenharmony_ci
6145db71995Sopenharmony_ci    VkPhysicalDevice physical_device = inst.GetPhysDev();
6155db71995Sopenharmony_ci    exercise_EnumerateDeviceExtensionProperties(inst, physical_device, exts);
6165db71995Sopenharmony_ci}
6175db71995Sopenharmony_ci
6185db71995Sopenharmony_ciTEST(EnumerateDeviceExtensionProperties, ImplicitLayerPresentWithDuplicateExtensions) {
6195db71995Sopenharmony_ci    FrameworkEnvironment env{};
6205db71995Sopenharmony_ci    auto& driver = env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2)).add_physical_device({});
6215db71995Sopenharmony_ci
6225db71995Sopenharmony_ci    std::vector<Extension> exts;
6235db71995Sopenharmony_ci    std::vector<ManifestLayer::LayerDescription::Extension> layer_exts;
6245db71995Sopenharmony_ci    for (uint32_t i = 0; i < 26; i++) {
6255db71995Sopenharmony_ci        exts.emplace_back(std::string("LayerExtNumba") + std::to_string(i), i + 10);
6265db71995Sopenharmony_ci        layer_exts.emplace_back(std::string("LayerExtNumba") + std::to_string(i), i + 10);
6275db71995Sopenharmony_ci    }
6285db71995Sopenharmony_ci    env.add_implicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{}
6295db71995Sopenharmony_ci                                                         .set_name("implicit_layer_name")
6305db71995Sopenharmony_ci                                                         .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)
6315db71995Sopenharmony_ci                                                         .set_disable_environment("DISABLE_ME")
6325db71995Sopenharmony_ci                                                         .add_device_extensions({layer_exts})),
6335db71995Sopenharmony_ci                           "implicit_test_layer.json");
6345db71995Sopenharmony_ci    auto& layer = env.get_test_layer();
6355db71995Sopenharmony_ci    layer.device_extensions = exts;
6365db71995Sopenharmony_ci
6375db71995Sopenharmony_ci    driver.physical_devices.front().extensions.emplace_back("MyDriverExtension0", 4);
6385db71995Sopenharmony_ci    driver.physical_devices.front().extensions.emplace_back("MyDriverExtension1", 7);
6395db71995Sopenharmony_ci
6405db71995Sopenharmony_ci    driver.physical_devices.front().extensions.insert(driver.physical_devices.front().extensions.end(), exts.begin(), exts.end());
6415db71995Sopenharmony_ci    exts.emplace_back("MyDriverExtension0", 4);
6425db71995Sopenharmony_ci    exts.emplace_back("MyDriverExtension1", 7);
6435db71995Sopenharmony_ci
6445db71995Sopenharmony_ci    driver.physical_devices.front().extensions = exts;
6455db71995Sopenharmony_ci
6465db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
6475db71995Sopenharmony_ci    inst.CheckCreate();
6485db71995Sopenharmony_ci
6495db71995Sopenharmony_ci    VkPhysicalDevice physical_device = inst.GetPhysDev();
6505db71995Sopenharmony_ci    exercise_EnumerateDeviceExtensionProperties(inst, physical_device, exts);
6515db71995Sopenharmony_ci}
6525db71995Sopenharmony_ci
6535db71995Sopenharmony_ciTEST(EnumerateDeviceExtensionProperties, ImplicitLayerPresentWithOnlyDuplicateExtensions) {
6545db71995Sopenharmony_ci    FrameworkEnvironment env{};
6555db71995Sopenharmony_ci    auto& driver = env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2)).add_physical_device({});
6565db71995Sopenharmony_ci
6575db71995Sopenharmony_ci    std::vector<Extension> exts;
6585db71995Sopenharmony_ci    std::vector<ManifestLayer::LayerDescription::Extension> layer_exts;
6595db71995Sopenharmony_ci    for (uint32_t i = 0; i < 26; i++) {
6605db71995Sopenharmony_ci        exts.emplace_back(std::string("LayerExtNumba") + std::to_string(i), i + 10);
6615db71995Sopenharmony_ci        layer_exts.emplace_back(std::string("LayerExtNumba") + std::to_string(i), i + 10);
6625db71995Sopenharmony_ci    }
6635db71995Sopenharmony_ci    env.add_implicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{}
6645db71995Sopenharmony_ci                                                         .set_name("implicit_layer_name")
6655db71995Sopenharmony_ci                                                         .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)
6665db71995Sopenharmony_ci                                                         .set_disable_environment("DISABLE_ME")
6675db71995Sopenharmony_ci                                                         .add_device_extensions({layer_exts})),
6685db71995Sopenharmony_ci                           "implicit_test_layer.json");
6695db71995Sopenharmony_ci    auto& layer = env.get_test_layer();
6705db71995Sopenharmony_ci    layer.device_extensions = exts;
6715db71995Sopenharmony_ci
6725db71995Sopenharmony_ci    driver.physical_devices.front().extensions = exts;
6735db71995Sopenharmony_ci
6745db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
6755db71995Sopenharmony_ci    inst.CheckCreate();
6765db71995Sopenharmony_ci
6775db71995Sopenharmony_ci    VkPhysicalDevice physical_device = inst.GetPhysDev();
6785db71995Sopenharmony_ci    exercise_EnumerateDeviceExtensionProperties(inst, physical_device, exts);
6795db71995Sopenharmony_ci}
6805db71995Sopenharmony_ci
6815db71995Sopenharmony_ciTEST(EnumeratePhysicalDevices, OneCall) {
6825db71995Sopenharmony_ci    FrameworkEnvironment env{};
6835db71995Sopenharmony_ci    auto& driver = env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2)).set_min_icd_interface_version(5);
6845db71995Sopenharmony_ci
6855db71995Sopenharmony_ci    driver.add_physical_device("physical_device_0");
6865db71995Sopenharmony_ci    driver.add_physical_device("physical_device_1");
6875db71995Sopenharmony_ci    driver.add_physical_device("physical_device_2");
6885db71995Sopenharmony_ci    driver.add_physical_device("physical_device_3");
6895db71995Sopenharmony_ci
6905db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
6915db71995Sopenharmony_ci    inst.CheckCreate();
6925db71995Sopenharmony_ci
6935db71995Sopenharmony_ci    uint32_t physical_count = static_cast<uint32_t>(driver.physical_devices.size());
6945db71995Sopenharmony_ci    uint32_t returned_physical_count = static_cast<uint32_t>(driver.physical_devices.size());
6955db71995Sopenharmony_ci    std::vector<VkPhysicalDevice> physical_device_handles = std::vector<VkPhysicalDevice>(physical_count);
6965db71995Sopenharmony_ci    ASSERT_EQ(VK_SUCCESS, inst->vkEnumeratePhysicalDevices(inst, &returned_physical_count, physical_device_handles.data()));
6975db71995Sopenharmony_ci    ASSERT_EQ(physical_count, returned_physical_count);
6985db71995Sopenharmony_ci}
6995db71995Sopenharmony_ci
7005db71995Sopenharmony_ciTEST(EnumeratePhysicalDevices, TwoCall) {
7015db71995Sopenharmony_ci    FrameworkEnvironment env{};
7025db71995Sopenharmony_ci    auto& driver = env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2))
7035db71995Sopenharmony_ci                       .set_min_icd_interface_version(5)
7045db71995Sopenharmony_ci                       .add_instance_extension({VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME});
7055db71995Sopenharmony_ci
7065db71995Sopenharmony_ci    const uint32_t real_device_count = 2;
7075db71995Sopenharmony_ci    for (uint32_t i = 0; i < real_device_count; i++) {
7085db71995Sopenharmony_ci        driver.add_physical_device(std::string("physical_device_") + std::to_string(i));
7095db71995Sopenharmony_ci        driver.physical_devices.back().extensions.push_back({VK_EXT_PCI_BUS_INFO_EXTENSION_NAME, 0});
7105db71995Sopenharmony_ci    }
7115db71995Sopenharmony_ci
7125db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
7135db71995Sopenharmony_ci    inst.CheckCreate();
7145db71995Sopenharmony_ci
7155db71995Sopenharmony_ci    uint32_t physical_count = static_cast<uint32_t>(driver.physical_devices.size());
7165db71995Sopenharmony_ci    uint32_t returned_physical_count = 0;
7175db71995Sopenharmony_ci    ASSERT_EQ(VK_SUCCESS, inst->vkEnumeratePhysicalDevices(inst.inst, &returned_physical_count, nullptr));
7185db71995Sopenharmony_ci    ASSERT_EQ(physical_count, returned_physical_count);
7195db71995Sopenharmony_ci
7205db71995Sopenharmony_ci    std::array<VkPhysicalDevice, real_device_count> physical_device_handles;
7215db71995Sopenharmony_ci    ASSERT_EQ(VK_SUCCESS,
7225db71995Sopenharmony_ci              env.vulkan_functions.vkEnumeratePhysicalDevices(inst.inst, &returned_physical_count, physical_device_handles.data()));
7235db71995Sopenharmony_ci    ASSERT_EQ(physical_count, returned_physical_count);
7245db71995Sopenharmony_ci}
7255db71995Sopenharmony_ci
7265db71995Sopenharmony_ciTEST(EnumeratePhysicalDevices, MatchOneAndTwoCallNumbers) {
7275db71995Sopenharmony_ci    FrameworkEnvironment env{};
7285db71995Sopenharmony_ci    auto& driver = env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2))
7295db71995Sopenharmony_ci                       .set_min_icd_interface_version(5)
7305db71995Sopenharmony_ci                       .add_instance_extension({VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME});
7315db71995Sopenharmony_ci
7325db71995Sopenharmony_ci    const uint32_t real_device_count = 3;
7335db71995Sopenharmony_ci    for (uint32_t i = 0; i < real_device_count; i++) {
7345db71995Sopenharmony_ci        driver.add_physical_device(std::string("physical_device_") + std::to_string(i));
7355db71995Sopenharmony_ci        driver.physical_devices.back().extensions.push_back({VK_EXT_PCI_BUS_INFO_EXTENSION_NAME, 0});
7365db71995Sopenharmony_ci    }
7375db71995Sopenharmony_ci
7385db71995Sopenharmony_ci    InstWrapper inst1{env.vulkan_functions};
7395db71995Sopenharmony_ci    inst1.CheckCreate();
7405db71995Sopenharmony_ci
7415db71995Sopenharmony_ci    uint32_t physical_count_one_call = static_cast<uint32_t>(driver.physical_devices.size());
7425db71995Sopenharmony_ci    std::array<VkPhysicalDevice, real_device_count> physical_device_handles_one_call;
7435db71995Sopenharmony_ci    ASSERT_EQ(VK_SUCCESS,
7445db71995Sopenharmony_ci              inst1->vkEnumeratePhysicalDevices(inst1, &physical_count_one_call, physical_device_handles_one_call.data()));
7455db71995Sopenharmony_ci    ASSERT_EQ(real_device_count, physical_count_one_call);
7465db71995Sopenharmony_ci
7475db71995Sopenharmony_ci    InstWrapper inst2{env.vulkan_functions};
7485db71995Sopenharmony_ci    inst2.CheckCreate();
7495db71995Sopenharmony_ci
7505db71995Sopenharmony_ci    uint32_t physical_count = static_cast<uint32_t>(driver.physical_devices.size());
7515db71995Sopenharmony_ci    uint32_t returned_physical_count = 0;
7525db71995Sopenharmony_ci    ASSERT_EQ(VK_SUCCESS, inst2->vkEnumeratePhysicalDevices(inst2, &returned_physical_count, nullptr));
7535db71995Sopenharmony_ci    ASSERT_EQ(physical_count, returned_physical_count);
7545db71995Sopenharmony_ci
7555db71995Sopenharmony_ci    std::array<VkPhysicalDevice, real_device_count> physical_device_handles;
7565db71995Sopenharmony_ci    ASSERT_EQ(VK_SUCCESS, inst2->vkEnumeratePhysicalDevices(inst2, &returned_physical_count, physical_device_handles.data()));
7575db71995Sopenharmony_ci    ASSERT_EQ(real_device_count, returned_physical_count);
7585db71995Sopenharmony_ci
7595db71995Sopenharmony_ci    ASSERT_EQ(physical_count_one_call, returned_physical_count);
7605db71995Sopenharmony_ci}
7615db71995Sopenharmony_ci
7625db71995Sopenharmony_ciTEST(EnumeratePhysicalDevices, TwoCallIncomplete) {
7635db71995Sopenharmony_ci    FrameworkEnvironment env{};
7645db71995Sopenharmony_ci    auto& driver = env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2))
7655db71995Sopenharmony_ci                       .set_min_icd_interface_version(5)
7665db71995Sopenharmony_ci                       .add_instance_extension({VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME});
7675db71995Sopenharmony_ci
7685db71995Sopenharmony_ci    const uint32_t real_device_count = 2;
7695db71995Sopenharmony_ci    for (uint32_t i = 0; i < real_device_count; i++) {
7705db71995Sopenharmony_ci        driver.physical_devices.emplace_back(std::string("physical_device_") + std::to_string(i));
7715db71995Sopenharmony_ci        driver.physical_devices.back().extensions.push_back({VK_EXT_PCI_BUS_INFO_EXTENSION_NAME, 0});
7725db71995Sopenharmony_ci    }
7735db71995Sopenharmony_ci
7745db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
7755db71995Sopenharmony_ci    inst.CheckCreate();
7765db71995Sopenharmony_ci
7775db71995Sopenharmony_ci    uint32_t physical_count = 0;
7785db71995Sopenharmony_ci    ASSERT_EQ(VK_SUCCESS, inst->vkEnumeratePhysicalDevices(inst, &physical_count, nullptr));
7795db71995Sopenharmony_ci    ASSERT_EQ(physical_count, driver.physical_devices.size());
7805db71995Sopenharmony_ci
7815db71995Sopenharmony_ci    std::array<VkPhysicalDevice, real_device_count> physical;
7825db71995Sopenharmony_ci
7835db71995Sopenharmony_ci    auto temp_ptr = std::unique_ptr<int>(new int());
7845db71995Sopenharmony_ci    physical[0] = reinterpret_cast<VkPhysicalDevice>(temp_ptr.get());
7855db71995Sopenharmony_ci    physical[1] = reinterpret_cast<VkPhysicalDevice>(temp_ptr.get());
7865db71995Sopenharmony_ci
7875db71995Sopenharmony_ci    // Use zero for the device count so we can get the VK_INCOMPLETE message and verify nothing was written into physical
7885db71995Sopenharmony_ci    physical_count = 0;
7895db71995Sopenharmony_ci    ASSERT_EQ(VK_INCOMPLETE, inst->vkEnumeratePhysicalDevices(inst, &physical_count, physical.data()));
7905db71995Sopenharmony_ci    ASSERT_EQ(physical_count, 0U);
7915db71995Sopenharmony_ci    ASSERT_EQ(static_cast<void*>(physical[0]), static_cast<void*>(temp_ptr.get()));
7925db71995Sopenharmony_ci    ASSERT_EQ(static_cast<void*>(physical[1]), static_cast<void*>(temp_ptr.get()));
7935db71995Sopenharmony_ci
7945db71995Sopenharmony_ci    // Remove one from the physical device count so we can get the VK_INCOMPLETE message
7955db71995Sopenharmony_ci    physical_count = 1;
7965db71995Sopenharmony_ci    ASSERT_EQ(VK_INCOMPLETE, inst->vkEnumeratePhysicalDevices(inst, &physical_count, physical.data()));
7975db71995Sopenharmony_ci    ASSERT_EQ(physical_count, 1U);
7985db71995Sopenharmony_ci    ASSERT_EQ(static_cast<void*>(physical[1]), static_cast<void*>(temp_ptr.get()));
7995db71995Sopenharmony_ci
8005db71995Sopenharmony_ci    physical_count = 2;
8015db71995Sopenharmony_ci    std::array<VkPhysicalDevice, real_device_count> physical_2;
8025db71995Sopenharmony_ci    ASSERT_EQ(VK_SUCCESS, inst->vkEnumeratePhysicalDevices(inst, &physical_count, physical_2.data()));
8035db71995Sopenharmony_ci
8045db71995Sopenharmony_ci    // Verify that the first physical device shows up in the list of the second ones
8055db71995Sopenharmony_ci    ASSERT_TRUE(std::find(physical_2.begin(), physical_2.end(), physical[0]) != physical_2.end());
8065db71995Sopenharmony_ci}
8075db71995Sopenharmony_ci
8085db71995Sopenharmony_ciTEST(EnumeratePhysicalDevices, ZeroPhysicalDevices) {
8095db71995Sopenharmony_ci    FrameworkEnvironment env{};
8105db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2));
8115db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
8125db71995Sopenharmony_ci    inst.create_info.set_api_version(VK_MAKE_API_VERSION(0, 1, 1, 0));
8135db71995Sopenharmony_ci    inst.CheckCreate(VK_SUCCESS);
8145db71995Sopenharmony_ci
8155db71995Sopenharmony_ci    uint32_t count = 0;
8165db71995Sopenharmony_ci    ASSERT_EQ(VK_ERROR_INITIALIZATION_FAILED, env.vulkan_functions.vkEnumeratePhysicalDevices(inst, &count, nullptr));
8175db71995Sopenharmony_ci    ASSERT_EQ(count, 0U);
8185db71995Sopenharmony_ci}
8195db71995Sopenharmony_ci
8205db71995Sopenharmony_ciTEST(EnumeratePhysicalDevices, ZeroPhysicalDevicesAfterCreateInstance) {
8215db71995Sopenharmony_ci    FrameworkEnvironment env{};
8225db71995Sopenharmony_ci    auto& driver = env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2, VK_API_VERSION_1_1)).set_min_icd_interface_version(5);
8235db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
8245db71995Sopenharmony_ci    inst.create_info.set_api_version(VK_API_VERSION_1_1);
8255db71995Sopenharmony_ci    inst.CheckCreate();
8265db71995Sopenharmony_ci    driver.physical_devices.clear();
8275db71995Sopenharmony_ci
8285db71995Sopenharmony_ci    uint32_t physical_device_count = 1000;  // not zero starting value
8295db71995Sopenharmony_ci    VkPhysicalDevice physical_device{};
8305db71995Sopenharmony_ci
8315db71995Sopenharmony_ci    EXPECT_EQ(VK_ERROR_INITIALIZATION_FAILED, inst->vkEnumeratePhysicalDevices(inst, &physical_device_count, nullptr));
8325db71995Sopenharmony_ci    EXPECT_EQ(VK_ERROR_INITIALIZATION_FAILED, inst->vkEnumeratePhysicalDevices(inst, &physical_device_count, &physical_device));
8335db71995Sopenharmony_ci
8345db71995Sopenharmony_ci    uint32_t physical_device_group_count = 1000;  // not zero starting value
8355db71995Sopenharmony_ci    VkPhysicalDeviceGroupProperties physical_device_group_properties{};
8365db71995Sopenharmony_ci
8375db71995Sopenharmony_ci    EXPECT_EQ(VK_ERROR_INITIALIZATION_FAILED, inst->vkEnumeratePhysicalDeviceGroups(inst, &physical_device_group_count, nullptr));
8385db71995Sopenharmony_ci    EXPECT_EQ(VK_ERROR_INITIALIZATION_FAILED,
8395db71995Sopenharmony_ci              inst->vkEnumeratePhysicalDeviceGroups(inst, &physical_device_group_count, &physical_device_group_properties));
8405db71995Sopenharmony_ci}
8415db71995Sopenharmony_ci
8425db71995Sopenharmony_ciTEST(EnumeratePhysicalDevices, CallTwiceNormal) {
8435db71995Sopenharmony_ci    FrameworkEnvironment env{};
8445db71995Sopenharmony_ci    auto& driver = env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2)).set_min_icd_interface_version(5);
8455db71995Sopenharmony_ci
8465db71995Sopenharmony_ci    for (size_t i = 0; i < 4; i++) {
8475db71995Sopenharmony_ci        driver.physical_devices.emplace_back(std::string("physical_device_") + std::to_string(i));
8485db71995Sopenharmony_ci    }
8495db71995Sopenharmony_ci
8505db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
8515db71995Sopenharmony_ci    inst.CheckCreate();
8525db71995Sopenharmony_ci
8535db71995Sopenharmony_ci    // Call twice in a row and make sure nothing bad happened
8545db71995Sopenharmony_ci    uint32_t physical_count = static_cast<uint32_t>(driver.physical_devices.size());
8555db71995Sopenharmony_ci    uint32_t returned_physical_count = static_cast<uint32_t>(driver.physical_devices.size());
8565db71995Sopenharmony_ci    std::vector<VkPhysicalDevice> physical_device_handles_1 = std::vector<VkPhysicalDevice>(physical_count);
8575db71995Sopenharmony_ci    ASSERT_EQ(VK_SUCCESS, inst->vkEnumeratePhysicalDevices(inst, &returned_physical_count, physical_device_handles_1.data()));
8585db71995Sopenharmony_ci    ASSERT_EQ(physical_count, returned_physical_count);
8595db71995Sopenharmony_ci    std::vector<VkPhysicalDevice> physical_device_handles_2 = std::vector<VkPhysicalDevice>(physical_count);
8605db71995Sopenharmony_ci    ASSERT_EQ(VK_SUCCESS, inst->vkEnumeratePhysicalDevices(inst, &returned_physical_count, physical_device_handles_2.data()));
8615db71995Sopenharmony_ci    ASSERT_EQ(physical_count, returned_physical_count);
8625db71995Sopenharmony_ci    // Make sure devices are same between the two
8635db71995Sopenharmony_ci    for (uint32_t count = 0; count < driver.physical_devices.size(); ++count) {
8645db71995Sopenharmony_ci        ASSERT_EQ(physical_device_handles_1[count], physical_device_handles_2[count]);
8655db71995Sopenharmony_ci    }
8665db71995Sopenharmony_ci}
8675db71995Sopenharmony_ci
8685db71995Sopenharmony_ciTEST(EnumeratePhysicalDevices, CallTwiceIncompleteOnceNormal) {
8695db71995Sopenharmony_ci    FrameworkEnvironment env{};
8705db71995Sopenharmony_ci    auto& driver = env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2)).set_min_icd_interface_version(5);
8715db71995Sopenharmony_ci
8725db71995Sopenharmony_ci    for (size_t i = 0; i < 8; i++) {
8735db71995Sopenharmony_ci        driver.physical_devices.emplace_back(std::string("physical_device_") + std::to_string(i));
8745db71995Sopenharmony_ci    }
8755db71995Sopenharmony_ci
8765db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
8775db71995Sopenharmony_ci    inst.CheckCreate();
8785db71995Sopenharmony_ci
8795db71995Sopenharmony_ci    // Query 3, then 5, then all
8805db71995Sopenharmony_ci    uint32_t physical_count = static_cast<uint32_t>(driver.physical_devices.size());
8815db71995Sopenharmony_ci    uint32_t returned_physical_count = 3;
8825db71995Sopenharmony_ci    std::vector<VkPhysicalDevice> physical_device_handles_1 = std::vector<VkPhysicalDevice>(returned_physical_count);
8835db71995Sopenharmony_ci    ASSERT_EQ(VK_INCOMPLETE, inst->vkEnumeratePhysicalDevices(inst, &returned_physical_count, physical_device_handles_1.data()));
8845db71995Sopenharmony_ci    ASSERT_EQ(3U, returned_physical_count);
8855db71995Sopenharmony_ci    returned_physical_count = 5;
8865db71995Sopenharmony_ci    std::vector<VkPhysicalDevice> physical_device_handles_2 = std::vector<VkPhysicalDevice>(returned_physical_count);
8875db71995Sopenharmony_ci    ASSERT_EQ(VK_INCOMPLETE, inst->vkEnumeratePhysicalDevices(inst, &returned_physical_count, physical_device_handles_2.data()));
8885db71995Sopenharmony_ci    ASSERT_EQ(5U, returned_physical_count);
8895db71995Sopenharmony_ci    returned_physical_count = physical_count;
8905db71995Sopenharmony_ci    std::vector<VkPhysicalDevice> physical_device_handles_3 = std::vector<VkPhysicalDevice>(returned_physical_count);
8915db71995Sopenharmony_ci    ASSERT_EQ(VK_SUCCESS, inst->vkEnumeratePhysicalDevices(inst, &returned_physical_count, physical_device_handles_3.data()));
8925db71995Sopenharmony_ci    ASSERT_EQ(physical_count, returned_physical_count);
8935db71995Sopenharmony_ci    // Make sure devices are same between the three
8945db71995Sopenharmony_ci    for (uint32_t count = 0; count < driver.physical_devices.size(); ++count) {
8955db71995Sopenharmony_ci        if (count < physical_device_handles_1.size()) {
8965db71995Sopenharmony_ci            ASSERT_EQ(physical_device_handles_1[count], physical_device_handles_3[count]);
8975db71995Sopenharmony_ci        }
8985db71995Sopenharmony_ci        if (count < physical_device_handles_2.size()) {
8995db71995Sopenharmony_ci            ASSERT_EQ(physical_device_handles_2[count], physical_device_handles_3[count]);
9005db71995Sopenharmony_ci        }
9015db71995Sopenharmony_ci    }
9025db71995Sopenharmony_ci}
9035db71995Sopenharmony_ci
9045db71995Sopenharmony_ciTEST(EnumeratePhysicalDevices, CallThriceSuccessReduce) {
9055db71995Sopenharmony_ci    FrameworkEnvironment env{};
9065db71995Sopenharmony_ci    auto& driver = env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2)).set_min_icd_interface_version(5);
9075db71995Sopenharmony_ci
9085db71995Sopenharmony_ci    for (size_t i = 0; i < 8; i++) {
9095db71995Sopenharmony_ci        driver.physical_devices.emplace_back(std::string("physical_device_") + std::to_string(i));
9105db71995Sopenharmony_ci    }
9115db71995Sopenharmony_ci
9125db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
9135db71995Sopenharmony_ci    inst.CheckCreate();
9145db71995Sopenharmony_ci
9155db71995Sopenharmony_ci    // Query all at first, then 5, then 3
9165db71995Sopenharmony_ci    uint32_t physical_count = static_cast<uint32_t>(driver.physical_devices.size());
9175db71995Sopenharmony_ci    uint32_t returned_physical_count = physical_count;
9185db71995Sopenharmony_ci    std::vector<VkPhysicalDevice> physical_device_handles_1 = std::vector<VkPhysicalDevice>(physical_count);
9195db71995Sopenharmony_ci    ASSERT_EQ(VK_SUCCESS, inst->vkEnumeratePhysicalDevices(inst, &returned_physical_count, physical_device_handles_1.data()));
9205db71995Sopenharmony_ci    ASSERT_EQ(physical_count, returned_physical_count);
9215db71995Sopenharmony_ci    returned_physical_count = 5;
9225db71995Sopenharmony_ci    std::vector<VkPhysicalDevice> physical_device_handles_2 = std::vector<VkPhysicalDevice>(returned_physical_count);
9235db71995Sopenharmony_ci    ASSERT_EQ(VK_INCOMPLETE, inst->vkEnumeratePhysicalDevices(inst, &returned_physical_count, physical_device_handles_2.data()));
9245db71995Sopenharmony_ci    ASSERT_EQ(5U, returned_physical_count);
9255db71995Sopenharmony_ci    returned_physical_count = 3;
9265db71995Sopenharmony_ci    std::vector<VkPhysicalDevice> physical_device_handles_3 = std::vector<VkPhysicalDevice>(returned_physical_count);
9275db71995Sopenharmony_ci    ASSERT_EQ(VK_INCOMPLETE, inst->vkEnumeratePhysicalDevices(inst, &returned_physical_count, physical_device_handles_3.data()));
9285db71995Sopenharmony_ci    ASSERT_EQ(3U, returned_physical_count);
9295db71995Sopenharmony_ci    // Make sure devices are same between the three
9305db71995Sopenharmony_ci    for (uint32_t count = 0; count < driver.physical_devices.size(); ++count) {
9315db71995Sopenharmony_ci        if (count < physical_device_handles_2.size()) {
9325db71995Sopenharmony_ci            ASSERT_EQ(physical_device_handles_2[count], physical_device_handles_1[count]);
9335db71995Sopenharmony_ci        }
9345db71995Sopenharmony_ci        if (count < physical_device_handles_3.size()) {
9355db71995Sopenharmony_ci            ASSERT_EQ(physical_device_handles_3[count], physical_device_handles_1[count]);
9365db71995Sopenharmony_ci        }
9375db71995Sopenharmony_ci    }
9385db71995Sopenharmony_ci}
9395db71995Sopenharmony_ci
9405db71995Sopenharmony_ciTEST(EnumeratePhysicalDevices, CallThriceAddInBetween) {
9415db71995Sopenharmony_ci    FrameworkEnvironment env{};
9425db71995Sopenharmony_ci    auto& driver = env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2)).set_min_icd_interface_version(5);
9435db71995Sopenharmony_ci
9445db71995Sopenharmony_ci    driver.physical_devices.emplace_back("physical_device_0");
9455db71995Sopenharmony_ci    driver.physical_devices.emplace_back("physical_device_1");
9465db71995Sopenharmony_ci
9475db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
9485db71995Sopenharmony_ci    inst.CheckCreate();
9495db71995Sopenharmony_ci
9505db71995Sopenharmony_ci    uint32_t physical_count = static_cast<uint32_t>(driver.physical_devices.size());
9515db71995Sopenharmony_ci    uint32_t returned_physical_count = physical_count;
9525db71995Sopenharmony_ci    std::vector<VkPhysicalDevice> physical_device_handles_1 = std::vector<VkPhysicalDevice>(physical_count);
9535db71995Sopenharmony_ci    ASSERT_EQ(VK_SUCCESS, inst->vkEnumeratePhysicalDevices(inst, &returned_physical_count, physical_device_handles_1.data()));
9545db71995Sopenharmony_ci    ASSERT_EQ(physical_count, returned_physical_count);
9555db71995Sopenharmony_ci
9565db71995Sopenharmony_ci    driver.physical_devices.emplace_back("physical_device_2");
9575db71995Sopenharmony_ci    driver.physical_devices.emplace_back("physical_device_3");
9585db71995Sopenharmony_ci
9595db71995Sopenharmony_ci    std::vector<VkPhysicalDevice> physical_device_handles_2 = std::vector<VkPhysicalDevice>(returned_physical_count);
9605db71995Sopenharmony_ci    ASSERT_EQ(VK_INCOMPLETE, inst->vkEnumeratePhysicalDevices(inst, &returned_physical_count, physical_device_handles_2.data()));
9615db71995Sopenharmony_ci    ASSERT_EQ(physical_count, returned_physical_count);
9625db71995Sopenharmony_ci
9635db71995Sopenharmony_ci    physical_count = static_cast<uint32_t>(driver.physical_devices.size());
9645db71995Sopenharmony_ci    returned_physical_count = physical_count;
9655db71995Sopenharmony_ci    std::vector<VkPhysicalDevice> physical_device_handles_3 = std::vector<VkPhysicalDevice>(returned_physical_count);
9665db71995Sopenharmony_ci    ASSERT_EQ(VK_SUCCESS, inst->vkEnumeratePhysicalDevices(inst, &returned_physical_count, physical_device_handles_3.data()));
9675db71995Sopenharmony_ci    ASSERT_EQ(physical_count, returned_physical_count);
9685db71995Sopenharmony_ci    // Make sure devices are same between the three
9695db71995Sopenharmony_ci    for (uint32_t count = 0; count < physical_device_handles_3.size(); ++count) {
9705db71995Sopenharmony_ci        if (count < physical_device_handles_1.size()) {
9715db71995Sopenharmony_ci            ASSERT_EQ(physical_device_handles_1[count], physical_device_handles_3[count]);
9725db71995Sopenharmony_ci        }
9735db71995Sopenharmony_ci        if (count < physical_device_handles_2.size()) {
9745db71995Sopenharmony_ci            ASSERT_EQ(physical_device_handles_2[count], physical_device_handles_3[count]);
9755db71995Sopenharmony_ci        }
9765db71995Sopenharmony_ci    }
9775db71995Sopenharmony_ci}
9785db71995Sopenharmony_ci
9795db71995Sopenharmony_ciTEST(EnumeratePhysicalDevices, CallThriceRemoveInBetween) {
9805db71995Sopenharmony_ci    FrameworkEnvironment env{};
9815db71995Sopenharmony_ci    auto& driver = env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2)).set_min_icd_interface_version(5);
9825db71995Sopenharmony_ci
9835db71995Sopenharmony_ci    for (size_t i = 0; i < 4; i++) {
9845db71995Sopenharmony_ci        driver.physical_devices.emplace_back(std::string("physical_device_") + std::to_string(i));
9855db71995Sopenharmony_ci    }
9865db71995Sopenharmony_ci
9875db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
9885db71995Sopenharmony_ci    inst.CheckCreate();
9895db71995Sopenharmony_ci
9905db71995Sopenharmony_ci    uint32_t physical_count = static_cast<uint32_t>(driver.physical_devices.size());
9915db71995Sopenharmony_ci    uint32_t returned_physical_count = physical_count;
9925db71995Sopenharmony_ci    std::vector<VkPhysicalDevice> physical_device_handles_1 = std::vector<VkPhysicalDevice>(physical_count);
9935db71995Sopenharmony_ci    ASSERT_EQ(VK_SUCCESS, inst->vkEnumeratePhysicalDevices(inst, &returned_physical_count, physical_device_handles_1.data()));
9945db71995Sopenharmony_ci    ASSERT_EQ(physical_count, returned_physical_count);
9955db71995Sopenharmony_ci
9965db71995Sopenharmony_ci    // Delete the 2nd physical device
9975db71995Sopenharmony_ci    driver.physical_devices.erase(std::next(driver.physical_devices.begin()));
9985db71995Sopenharmony_ci
9995db71995Sopenharmony_ci    physical_count = static_cast<uint32_t>(driver.physical_devices.size());
10005db71995Sopenharmony_ci    std::vector<VkPhysicalDevice> physical_device_handles_2 = std::vector<VkPhysicalDevice>(returned_physical_count);
10015db71995Sopenharmony_ci    ASSERT_EQ(VK_SUCCESS, inst->vkEnumeratePhysicalDevices(inst, &returned_physical_count, physical_device_handles_2.data()));
10025db71995Sopenharmony_ci    ASSERT_EQ(physical_count, returned_physical_count);
10035db71995Sopenharmony_ci    physical_device_handles_2.resize(returned_physical_count);
10045db71995Sopenharmony_ci
10055db71995Sopenharmony_ci    returned_physical_count = physical_count;
10065db71995Sopenharmony_ci    std::vector<VkPhysicalDevice> physical_device_handles_3 = std::vector<VkPhysicalDevice>(returned_physical_count);
10075db71995Sopenharmony_ci    ASSERT_EQ(VK_SUCCESS, inst->vkEnumeratePhysicalDevices(inst, &returned_physical_count, physical_device_handles_3.data()));
10085db71995Sopenharmony_ci    ASSERT_EQ(physical_count, returned_physical_count);
10095db71995Sopenharmony_ci
10105db71995Sopenharmony_ci    // Make sure one has 1 more device that two or three
10115db71995Sopenharmony_ci    ASSERT_EQ(physical_device_handles_1.size(), physical_device_handles_2.size() + 1);
10125db71995Sopenharmony_ci    ASSERT_EQ(physical_device_handles_1.size(), physical_device_handles_3.size() + 1);
10135db71995Sopenharmony_ci
10145db71995Sopenharmony_ci    // Make sure the devices in two and three are all found in one
10155db71995Sopenharmony_ci    uint32_t two_found = 0;
10165db71995Sopenharmony_ci    uint32_t three_found = 0;
10175db71995Sopenharmony_ci    for (uint32_t count = 0; count < physical_device_handles_1.size(); ++count) {
10185db71995Sopenharmony_ci        for (uint32_t int_count = 0; int_count < physical_device_handles_2.size(); ++int_count) {
10195db71995Sopenharmony_ci            if (physical_device_handles_2[int_count] == physical_device_handles_1[count]) {
10205db71995Sopenharmony_ci                two_found++;
10215db71995Sopenharmony_ci                break;
10225db71995Sopenharmony_ci            }
10235db71995Sopenharmony_ci        }
10245db71995Sopenharmony_ci        for (uint32_t int_count = 0; int_count < physical_device_handles_3.size(); ++int_count) {
10255db71995Sopenharmony_ci            if (physical_device_handles_3[int_count] == physical_device_handles_1[count]) {
10265db71995Sopenharmony_ci                three_found++;
10275db71995Sopenharmony_ci                break;
10285db71995Sopenharmony_ci            }
10295db71995Sopenharmony_ci        }
10305db71995Sopenharmony_ci    }
10315db71995Sopenharmony_ci    ASSERT_EQ(two_found, returned_physical_count);
10325db71995Sopenharmony_ci    ASSERT_EQ(three_found, returned_physical_count);
10335db71995Sopenharmony_ci}
10345db71995Sopenharmony_ci
10355db71995Sopenharmony_ciTEST(EnumeratePhysicalDevices, MultipleAddRemoves) {
10365db71995Sopenharmony_ci    FrameworkEnvironment env{};
10375db71995Sopenharmony_ci    auto& driver = env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2)).set_min_icd_interface_version(5);
10385db71995Sopenharmony_ci
10395db71995Sopenharmony_ci    for (size_t i = 0; i < 4; i++) {
10405db71995Sopenharmony_ci        driver.physical_devices.emplace_back(std::string("physical_device_") + std::to_string(i));
10415db71995Sopenharmony_ci    }
10425db71995Sopenharmony_ci    std::array<std::vector<VkPhysicalDevice>, 8> physical_dev_handles;
10435db71995Sopenharmony_ci
10445db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
10455db71995Sopenharmony_ci    inst.CheckCreate();
10465db71995Sopenharmony_ci
10475db71995Sopenharmony_ci    uint32_t physical_count = static_cast<uint32_t>(driver.physical_devices.size());
10485db71995Sopenharmony_ci    uint32_t returned_physical_count = physical_count;
10495db71995Sopenharmony_ci    physical_dev_handles[0].resize(physical_count);
10505db71995Sopenharmony_ci    ASSERT_EQ(VK_SUCCESS, inst->vkEnumeratePhysicalDevices(inst, &returned_physical_count, physical_dev_handles[0].data()));
10515db71995Sopenharmony_ci    ASSERT_EQ(physical_count, returned_physical_count);
10525db71995Sopenharmony_ci
10535db71995Sopenharmony_ci    // Delete the 2nd physical device (0, 2, 3)
10545db71995Sopenharmony_ci    driver.physical_devices.erase(std::next(driver.physical_devices.begin()));
10555db71995Sopenharmony_ci
10565db71995Sopenharmony_ci    // Query using old number from last call (4), but it should only return 3
10575db71995Sopenharmony_ci    physical_count = static_cast<uint32_t>(driver.physical_devices.size());
10585db71995Sopenharmony_ci    physical_dev_handles[1].resize(returned_physical_count);
10595db71995Sopenharmony_ci    ASSERT_EQ(VK_SUCCESS, inst->vkEnumeratePhysicalDevices(inst, &returned_physical_count, physical_dev_handles[1].data()));
10605db71995Sopenharmony_ci    ASSERT_EQ(physical_count, returned_physical_count);
10615db71995Sopenharmony_ci    physical_dev_handles[1].resize(returned_physical_count);
10625db71995Sopenharmony_ci
10635db71995Sopenharmony_ci    // Add two new physical devices to the front (A, B, 0, 2, 3)
10645db71995Sopenharmony_ci    driver.physical_devices.emplace(driver.physical_devices.begin(), "physical_device_B");
10655db71995Sopenharmony_ci    driver.physical_devices.emplace(driver.physical_devices.begin(), "physical_device_A");
10665db71995Sopenharmony_ci
10675db71995Sopenharmony_ci    // Query using old number from last call (3), but it should be 5
10685db71995Sopenharmony_ci    physical_count = static_cast<uint32_t>(driver.physical_devices.size());
10695db71995Sopenharmony_ci    physical_dev_handles[2].resize(returned_physical_count);
10705db71995Sopenharmony_ci    ASSERT_EQ(VK_INCOMPLETE, inst->vkEnumeratePhysicalDevices(inst, &returned_physical_count, physical_dev_handles[2].data()));
10715db71995Sopenharmony_ci    ASSERT_EQ(physical_count - 2, returned_physical_count);
10725db71995Sopenharmony_ci    physical_dev_handles[2].resize(returned_physical_count);
10735db71995Sopenharmony_ci
10745db71995Sopenharmony_ci    // Query again to get all 5
10755db71995Sopenharmony_ci    ASSERT_EQ(VK_SUCCESS, inst->vkEnumeratePhysicalDevices(inst, &returned_physical_count, nullptr));
10765db71995Sopenharmony_ci    physical_dev_handles[3].resize(returned_physical_count);
10775db71995Sopenharmony_ci    ASSERT_EQ(VK_SUCCESS, inst->vkEnumeratePhysicalDevices(inst, &returned_physical_count, physical_dev_handles[3].data()));
10785db71995Sopenharmony_ci    ASSERT_EQ(physical_count, returned_physical_count);
10795db71995Sopenharmony_ci
10805db71995Sopenharmony_ci    // Delete last two physical devices (A, B, 0, 2)
10815db71995Sopenharmony_ci    driver.physical_devices.pop_back();
10825db71995Sopenharmony_ci
10835db71995Sopenharmony_ci    // Query using old number from last call (5), but it should be 4
10845db71995Sopenharmony_ci    physical_count = static_cast<uint32_t>(driver.physical_devices.size());
10855db71995Sopenharmony_ci    physical_dev_handles[4].resize(returned_physical_count);
10865db71995Sopenharmony_ci    ASSERT_EQ(VK_SUCCESS, inst->vkEnumeratePhysicalDevices(inst, &returned_physical_count, physical_dev_handles[4].data()));
10875db71995Sopenharmony_ci    ASSERT_EQ(physical_count, returned_physical_count);
10885db71995Sopenharmony_ci    physical_dev_handles[4].resize(returned_physical_count);
10895db71995Sopenharmony_ci    // Adjust size and query again, should be the same
10905db71995Sopenharmony_ci    physical_dev_handles[5].resize(returned_physical_count);
10915db71995Sopenharmony_ci    ASSERT_EQ(VK_SUCCESS, inst->vkEnumeratePhysicalDevices(inst, &returned_physical_count, physical_dev_handles[5].data()));
10925db71995Sopenharmony_ci
10935db71995Sopenharmony_ci    // Insert a new physical device (A, B, C, 0, 2)
10945db71995Sopenharmony_ci    driver.physical_devices.insert(driver.physical_devices.begin() + 2, "physical_device_C");
10955db71995Sopenharmony_ci
10965db71995Sopenharmony_ci    // Query using old number from last call (4), but it should be 5
10975db71995Sopenharmony_ci    physical_count = static_cast<uint32_t>(driver.physical_devices.size());
10985db71995Sopenharmony_ci    physical_dev_handles[6].resize(returned_physical_count);
10995db71995Sopenharmony_ci    ASSERT_EQ(VK_INCOMPLETE, inst->vkEnumeratePhysicalDevices(inst, &returned_physical_count, physical_dev_handles[6].data()));
11005db71995Sopenharmony_ci    ASSERT_EQ(physical_count - 1, returned_physical_count);
11015db71995Sopenharmony_ci    // Query again to get all 5
11025db71995Sopenharmony_ci    ASSERT_EQ(VK_SUCCESS, inst->vkEnumeratePhysicalDevices(inst, &returned_physical_count, nullptr));
11035db71995Sopenharmony_ci    physical_dev_handles[7].resize(returned_physical_count);
11045db71995Sopenharmony_ci    ASSERT_EQ(VK_SUCCESS, inst->vkEnumeratePhysicalDevices(inst, &returned_physical_count, physical_dev_handles[7].data()));
11055db71995Sopenharmony_ci
11065db71995Sopenharmony_ci    // Check final results
11075db71995Sopenharmony_ci    // One   [4] - 0, 1, 2, 3
11085db71995Sopenharmony_ci    // Two   [3] - 0, 2, 3
11095db71995Sopenharmony_ci    // Three [3] - A, B, 0
11105db71995Sopenharmony_ci    // Four  [5] - A, B, 0, 2, 3
11115db71995Sopenharmony_ci    // Five  [4] - A, B, 0, 2
11125db71995Sopenharmony_ci    // Six   [4] - A, B, 0, 2
11135db71995Sopenharmony_ci    // Seven [4] - A, B, C, 0
11145db71995Sopenharmony_ci    // Eight [5] - A, B, C, 0, 2
11155db71995Sopenharmony_ci    ASSERT_EQ(4U, physical_dev_handles[0].size());
11165db71995Sopenharmony_ci    ASSERT_EQ(3U, physical_dev_handles[1].size());
11175db71995Sopenharmony_ci    ASSERT_EQ(3U, physical_dev_handles[2].size());
11185db71995Sopenharmony_ci    ASSERT_EQ(5U, physical_dev_handles[3].size());
11195db71995Sopenharmony_ci    ASSERT_EQ(4U, physical_dev_handles[4].size());
11205db71995Sopenharmony_ci    ASSERT_EQ(4U, physical_dev_handles[5].size());
11215db71995Sopenharmony_ci    ASSERT_EQ(4U, physical_dev_handles[6].size());
11225db71995Sopenharmony_ci    ASSERT_EQ(5U, physical_dev_handles[7].size());
11235db71995Sopenharmony_ci
11245db71995Sopenharmony_ci    // Make sure the devices in two and three are all found in one
11255db71995Sopenharmony_ci    uint32_t found_items[8]{};
11265db71995Sopenharmony_ci    for (uint32_t handle = 1; handle < 8; ++handle) {
11275db71995Sopenharmony_ci        for (uint32_t count = 0; count < physical_dev_handles[0].size(); ++count) {
11285db71995Sopenharmony_ci            for (uint32_t int_count = 0; int_count < physical_dev_handles[handle].size(); ++int_count) {
11295db71995Sopenharmony_ci                if (physical_dev_handles[handle][int_count] == physical_dev_handles[0][count]) {
11305db71995Sopenharmony_ci                    found_items[handle]++;
11315db71995Sopenharmony_ci                    break;
11325db71995Sopenharmony_ci                }
11335db71995Sopenharmony_ci            }
11345db71995Sopenharmony_ci        }
11355db71995Sopenharmony_ci    }
11365db71995Sopenharmony_ci    // Items matching from first call (must be >= since handle re-use does occur)
11375db71995Sopenharmony_ci    ASSERT_EQ(found_items[1], 3U);
11385db71995Sopenharmony_ci    ASSERT_GE(found_items[2], 1U);
11395db71995Sopenharmony_ci    ASSERT_GE(found_items[3], 3U);
11405db71995Sopenharmony_ci    ASSERT_GE(found_items[4], 2U);
11415db71995Sopenharmony_ci    ASSERT_GE(found_items[5], 2U);
11425db71995Sopenharmony_ci    ASSERT_GE(found_items[6], 1U);
11435db71995Sopenharmony_ci    ASSERT_GE(found_items[7], 2U);
11445db71995Sopenharmony_ci
11455db71995Sopenharmony_ci    memset(found_items, 0, 8 * sizeof(uint32_t));
11465db71995Sopenharmony_ci    for (uint32_t handle = 0; handle < 7; ++handle) {
11475db71995Sopenharmony_ci        for (uint32_t count = 0; count < physical_dev_handles[7].size(); ++count) {
11485db71995Sopenharmony_ci            for (uint32_t int_count = 0; int_count < physical_dev_handles[handle].size(); ++int_count) {
11495db71995Sopenharmony_ci                if (physical_dev_handles[handle][int_count] == physical_dev_handles[7][count]) {
11505db71995Sopenharmony_ci                    found_items[handle]++;
11515db71995Sopenharmony_ci                    break;
11525db71995Sopenharmony_ci                }
11535db71995Sopenharmony_ci            }
11545db71995Sopenharmony_ci        }
11555db71995Sopenharmony_ci    }
11565db71995Sopenharmony_ci    // Items matching from last call (must be >= since handle re-use does occur)
11575db71995Sopenharmony_ci    ASSERT_GE(found_items[0], 2U);
11585db71995Sopenharmony_ci    ASSERT_GE(found_items[1], 2U);
11595db71995Sopenharmony_ci    ASSERT_GE(found_items[2], 3U);
11605db71995Sopenharmony_ci    ASSERT_GE(found_items[3], 4U);
11615db71995Sopenharmony_ci    ASSERT_GE(found_items[4], 4U);
11625db71995Sopenharmony_ci    ASSERT_GE(found_items[5], 4U);
11635db71995Sopenharmony_ci    ASSERT_GE(found_items[6], 4U);
11645db71995Sopenharmony_ci}
11655db71995Sopenharmony_ci
11665db71995Sopenharmony_ciTEST(CreateDevice, ExtensionNotPresent) {
11675db71995Sopenharmony_ci    FrameworkEnvironment env{};
11685db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2)).add_physical_device("physical_device_0");
11695db71995Sopenharmony_ci
11705db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
11715db71995Sopenharmony_ci    inst.CheckCreate();
11725db71995Sopenharmony_ci
11735db71995Sopenharmony_ci    VkPhysicalDevice phys_dev = inst.GetPhysDev();
11745db71995Sopenharmony_ci
11755db71995Sopenharmony_ci    DeviceWrapper dev{inst};
11765db71995Sopenharmony_ci    dev.create_info.add_extension("NotPresent");
11775db71995Sopenharmony_ci
11785db71995Sopenharmony_ci    dev.CheckCreate(phys_dev, VK_ERROR_EXTENSION_NOT_PRESENT);
11795db71995Sopenharmony_ci}
11805db71995Sopenharmony_ci
11815db71995Sopenharmony_ci// LX535 / MI-76: Device layers are deprecated.
11825db71995Sopenharmony_ci// Ensure that no errors occur if a bogus device layer list is passed to vkCreateDevice.
11835db71995Sopenharmony_ci// https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#extendingvulkan-layers-devicelayerdeprecation
11845db71995Sopenharmony_ciTEST(CreateDevice, LayersNotPresent) {
11855db71995Sopenharmony_ci    FrameworkEnvironment env{};
11865db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2)).add_physical_device("physical_device_0");
11875db71995Sopenharmony_ci
11885db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
11895db71995Sopenharmony_ci    inst.CheckCreate();
11905db71995Sopenharmony_ci
11915db71995Sopenharmony_ci    VkPhysicalDevice phys_dev = inst.GetPhysDev();
11925db71995Sopenharmony_ci
11935db71995Sopenharmony_ci    DeviceWrapper dev{inst};
11945db71995Sopenharmony_ci    dev.create_info.add_layer("NotPresent");
11955db71995Sopenharmony_ci
11965db71995Sopenharmony_ci    dev.CheckCreate(phys_dev);
11975db71995Sopenharmony_ci}
11985db71995Sopenharmony_ci
11995db71995Sopenharmony_ci// Device layers are deprecated.
12005db71995Sopenharmony_ci// Ensure that no error occur if instance and device are created with the same list of layers.
12015db71995Sopenharmony_ci// https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#extendingvulkan-layers-devicelayerdeprecation
12025db71995Sopenharmony_ciTEST(CreateDevice, MatchInstanceAndDeviceLayers) {
12035db71995Sopenharmony_ci    FrameworkEnvironment env{};
12045db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2)).add_physical_device("physical_device_0");
12055db71995Sopenharmony_ci
12065db71995Sopenharmony_ci    const char* layer_name = "TestLayer";
12075db71995Sopenharmony_ci    env.add_explicit_layer(
12085db71995Sopenharmony_ci        ManifestLayer{}.add_layer(
12095db71995Sopenharmony_ci            ManifestLayer::LayerDescription{}.set_name(layer_name).set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)),
12105db71995Sopenharmony_ci        "test_layer.json");
12115db71995Sopenharmony_ci
12125db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
12135db71995Sopenharmony_ci    inst.create_info.add_layer(layer_name);
12145db71995Sopenharmony_ci    inst.CheckCreate();
12155db71995Sopenharmony_ci
12165db71995Sopenharmony_ci    VkPhysicalDevice phys_dev = inst.GetPhysDev();
12175db71995Sopenharmony_ci
12185db71995Sopenharmony_ci    DeviceWrapper dev{inst};
12195db71995Sopenharmony_ci    dev.create_info.add_layer(layer_name);
12205db71995Sopenharmony_ci
12215db71995Sopenharmony_ci    dev.CheckCreate(phys_dev);
12225db71995Sopenharmony_ci}
12235db71995Sopenharmony_ci
12245db71995Sopenharmony_ci// Device layers are deprecated.
12255db71995Sopenharmony_ci// Ensure that a message is generated when instance and device are created with different list of layers.
12265db71995Sopenharmony_ci// At best , the user can list only instance layers in the device layer list
12275db71995Sopenharmony_ci// https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#extendingvulkan-layers-devicelayerdeprecation
12285db71995Sopenharmony_ciTEST(CreateDevice, UnmatchInstanceAndDeviceLayers) {
12295db71995Sopenharmony_ci    FrameworkEnvironment env{};
12305db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2)).add_physical_device("physical_device_0");
12315db71995Sopenharmony_ci
12325db71995Sopenharmony_ci    const char* layer_name = "TestLayer";
12335db71995Sopenharmony_ci    env.add_explicit_layer(
12345db71995Sopenharmony_ci        ManifestLayer{}.add_layer(
12355db71995Sopenharmony_ci            ManifestLayer::LayerDescription{}.set_name(layer_name).set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)),
12365db71995Sopenharmony_ci        "test_layer.json");
12375db71995Sopenharmony_ci
12385db71995Sopenharmony_ci    DebugUtilsLogger debug_log{VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT};
12395db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
12405db71995Sopenharmony_ci    FillDebugUtilsCreateDetails(inst.create_info, debug_log);
12415db71995Sopenharmony_ci    inst.CheckCreate();
12425db71995Sopenharmony_ci
12435db71995Sopenharmony_ci    DebugUtilsWrapper log{inst, VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT};
12445db71995Sopenharmony_ci    CreateDebugUtilsMessenger(log);
12455db71995Sopenharmony_ci
12465db71995Sopenharmony_ci    VkPhysicalDevice phys_dev = inst.GetPhysDev();
12475db71995Sopenharmony_ci
12485db71995Sopenharmony_ci    DeviceWrapper dev{inst};
12495db71995Sopenharmony_ci    dev.create_info.add_layer(layer_name);
12505db71995Sopenharmony_ci
12515db71995Sopenharmony_ci    dev.CheckCreate(phys_dev);
12525db71995Sopenharmony_ci
12535db71995Sopenharmony_ci    ASSERT_TRUE(
12545db71995Sopenharmony_ci        log.find("loader_create_device_chain: Using deprecated and ignored 'ppEnabledLayerNames' member of 'VkDeviceCreateInfo' "
12555db71995Sopenharmony_ci                 "when creating a Vulkan device."));
12565db71995Sopenharmony_ci}
12575db71995Sopenharmony_ci
12585db71995Sopenharmony_ci// Device layers are deprecated.
12595db71995Sopenharmony_ci// Ensure that when VkInstanceCreateInfo is deleted, the check of the instance layer lists is running correctly during VkDevice
12605db71995Sopenharmony_ci// creation
12615db71995Sopenharmony_ci// https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#extendingvulkan-layers-devicelayerdeprecation
12625db71995Sopenharmony_ciTEST(CreateDevice, CheckCopyOfInstanceLayerNames) {
12635db71995Sopenharmony_ci    FrameworkEnvironment env{};
12645db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2)).add_physical_device("physical_device_0");
12655db71995Sopenharmony_ci
12665db71995Sopenharmony_ci    const char* layer_name = "TestLayer";
12675db71995Sopenharmony_ci    env.add_explicit_layer(
12685db71995Sopenharmony_ci        ManifestLayer{}.add_layer(
12695db71995Sopenharmony_ci            ManifestLayer::LayerDescription{}.set_name(layer_name).set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)),
12705db71995Sopenharmony_ci        "test_layer.json");
12715db71995Sopenharmony_ci
12725db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
12735db71995Sopenharmony_ci    {
12745db71995Sopenharmony_ci        // We intentionally create a local InstanceCreateInfo that goes out of scope at the } so that when dev.CheckCreate is called
12755db71995Sopenharmony_ci        // the layer name pointers are no longer valid
12765db71995Sopenharmony_ci        InstanceCreateInfo create_info{};
12775db71995Sopenharmony_ci        create_info.add_layer(layer_name);
12785db71995Sopenharmony_ci        inst.CheckCreateWithInfo(create_info);
12795db71995Sopenharmony_ci    }
12805db71995Sopenharmony_ci
12815db71995Sopenharmony_ci    VkPhysicalDevice phys_dev = inst.GetPhysDev();
12825db71995Sopenharmony_ci
12835db71995Sopenharmony_ci    DeviceWrapper dev{inst};
12845db71995Sopenharmony_ci    dev.create_info.add_layer(layer_name);
12855db71995Sopenharmony_ci
12865db71995Sopenharmony_ci    dev.CheckCreate(phys_dev);
12875db71995Sopenharmony_ci}
12885db71995Sopenharmony_ci
12895db71995Sopenharmony_ciTEST(CreateDevice, ConsecutiveCreate) {
12905db71995Sopenharmony_ci    FrameworkEnvironment env{};
12915db71995Sopenharmony_ci    auto& driver = env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2));
12925db71995Sopenharmony_ci
12935db71995Sopenharmony_ci    for (uint32_t i = 0; i < 100; i++) {
12945db71995Sopenharmony_ci        driver.physical_devices.emplace_back("physical_device_0");
12955db71995Sopenharmony_ci    }
12965db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
12975db71995Sopenharmony_ci    inst.CheckCreate();
12985db71995Sopenharmony_ci
12995db71995Sopenharmony_ci    auto phys_devs = inst.GetPhysDevs(100);
13005db71995Sopenharmony_ci    for (uint32_t i = 0; i < 100; i++) {
13015db71995Sopenharmony_ci        DeviceWrapper dev{inst};
13025db71995Sopenharmony_ci        dev.CheckCreate(phys_devs[i]);
13035db71995Sopenharmony_ci    }
13045db71995Sopenharmony_ci}
13055db71995Sopenharmony_ci
13065db71995Sopenharmony_ciTEST(CreateDevice, ConsecutiveCreateWithoutDestruction) {
13075db71995Sopenharmony_ci    FrameworkEnvironment env{};
13085db71995Sopenharmony_ci    auto& driver = env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2));
13095db71995Sopenharmony_ci
13105db71995Sopenharmony_ci    for (uint32_t i = 0; i < 100; i++) {
13115db71995Sopenharmony_ci        driver.physical_devices.emplace_back("physical_device_0");
13125db71995Sopenharmony_ci    }
13135db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
13145db71995Sopenharmony_ci    inst.CheckCreate();
13155db71995Sopenharmony_ci
13165db71995Sopenharmony_ci    auto phys_devs = inst.GetPhysDevs(100);
13175db71995Sopenharmony_ci
13185db71995Sopenharmony_ci    std::vector<DeviceWrapper> devices;
13195db71995Sopenharmony_ci    for (uint32_t i = 0; i < 100; i++) {
13205db71995Sopenharmony_ci        devices.emplace_back(inst);
13215db71995Sopenharmony_ci        DeviceWrapper& dev = devices.back();
13225db71995Sopenharmony_ci
13235db71995Sopenharmony_ci        dev.CheckCreate(phys_devs[i]);
13245db71995Sopenharmony_ci    }
13255db71995Sopenharmony_ci}
13265db71995Sopenharmony_ci
13275db71995Sopenharmony_ciTEST(TryLoadWrongBinaries, WrongICD) {
13285db71995Sopenharmony_ci    FrameworkEnvironment env{};
13295db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2)).add_physical_device("physical_device_0");
13305db71995Sopenharmony_ci    env.add_icd(TestICDDetails(CURRENT_PLATFORM_DUMMY_BINARY_WRONG_TYPE).set_is_fake(true));
13315db71995Sopenharmony_ci
13325db71995Sopenharmony_ci    DebugUtilsLogger log{VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT};
13335db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
13345db71995Sopenharmony_ci    FillDebugUtilsCreateDetails(inst.create_info, log);
13355db71995Sopenharmony_ci    inst.CheckCreate();
13365db71995Sopenharmony_ci
13375db71995Sopenharmony_ci#if _WIN32 || _WIN64
13385db71995Sopenharmony_ci    ASSERT_TRUE(log.find("Failed to open dynamic library"));
13395db71995Sopenharmony_ci#endif
13405db71995Sopenharmony_ci#if defined(__linux__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__GNU__)
13415db71995Sopenharmony_ci#if defined(__x86_64__)
13425db71995Sopenharmony_ci    ASSERT_TRUE(log.find("wrong ELF class: ELFCLASS32"));
13435db71995Sopenharmony_ci#else
13445db71995Sopenharmony_ci    ASSERT_TRUE(log.find("wrong ELF class: ELFCLASS64"));
13455db71995Sopenharmony_ci#endif
13465db71995Sopenharmony_ci#endif
13475db71995Sopenharmony_ci
13485db71995Sopenharmony_ci    uint32_t driver_count = 0;
13495db71995Sopenharmony_ci    ASSERT_EQ(VK_SUCCESS, inst->vkEnumeratePhysicalDevices(inst, &driver_count, nullptr));
13505db71995Sopenharmony_ci    ASSERT_EQ(driver_count, 1U);
13515db71995Sopenharmony_ci}
13525db71995Sopenharmony_ci
13535db71995Sopenharmony_ciTEST(TryLoadWrongBinaries, WrongExplicit) {
13545db71995Sopenharmony_ci    FrameworkEnvironment env{};
13555db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2)).add_physical_device("physical_device_0");
13565db71995Sopenharmony_ci
13575db71995Sopenharmony_ci    const char* layer_name = "DummyLayerExplicit";
13585db71995Sopenharmony_ci    env.add_fake_explicit_layer(
13595db71995Sopenharmony_ci        ManifestLayer{}.add_layer(
13605db71995Sopenharmony_ci            ManifestLayer::LayerDescription{}.set_name(layer_name).set_lib_path(CURRENT_PLATFORM_DUMMY_BINARY_WRONG_TYPE)),
13615db71995Sopenharmony_ci        "dummy_test_layer.json");
13625db71995Sopenharmony_ci
13635db71995Sopenharmony_ci    auto layer_props = env.GetLayerProperties(1);
13645db71995Sopenharmony_ci    ASSERT_TRUE(string_eq(layer_name, layer_props[0].layerName));
13655db71995Sopenharmony_ci
13665db71995Sopenharmony_ci    DebugUtilsLogger log{VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT};
13675db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
13685db71995Sopenharmony_ci    inst.create_info.add_layer(layer_name);
13695db71995Sopenharmony_ci    FillDebugUtilsCreateDetails(inst.create_info, log);
13705db71995Sopenharmony_ci
13715db71995Sopenharmony_ci    // Explicit layer not found should generate a VK_ERROR_LAYER_NOT_PRESENT error message.
13725db71995Sopenharmony_ci    inst.CheckCreate(VK_ERROR_LAYER_NOT_PRESENT);
13735db71995Sopenharmony_ci
13745db71995Sopenharmony_ci    // Should get an error message for the explicit layer
13755db71995Sopenharmony_ci#if !defined(__APPLE__)
13765db71995Sopenharmony_ci    ASSERT_TRUE(log.find(std::string("Requested layer \"") + std::string(layer_name) + std::string("\" was wrong bit-type!")));
13775db71995Sopenharmony_ci#else   // __APPLE__
13785db71995Sopenharmony_ci    // Apple only throws a wrong library type of error
13795db71995Sopenharmony_ci    ASSERT_TRUE(log.find(std::string("Requested layer \"") + std::string(layer_name) + std::string("\" failed to load!")));
13805db71995Sopenharmony_ci#endif  // __APPLE__
13815db71995Sopenharmony_ci}
13825db71995Sopenharmony_ci
13835db71995Sopenharmony_ciTEST(TryLoadWrongBinaries, WrongImplicit) {
13845db71995Sopenharmony_ci    FrameworkEnvironment env{};
13855db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2)).add_physical_device("physical_device_0");
13865db71995Sopenharmony_ci
13875db71995Sopenharmony_ci    const char* layer_name = "DummyLayerImplicit0";
13885db71995Sopenharmony_ci    env.add_fake_implicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{}
13895db71995Sopenharmony_ci                                                              .set_name(layer_name)
13905db71995Sopenharmony_ci                                                              .set_lib_path(CURRENT_PLATFORM_DUMMY_BINARY_WRONG_TYPE)
13915db71995Sopenharmony_ci                                                              .set_disable_environment("DISABLE_ENV")),
13925db71995Sopenharmony_ci                                "dummy_test_layer.json");
13935db71995Sopenharmony_ci
13945db71995Sopenharmony_ci    auto layer_props = env.GetLayerProperties(1);
13955db71995Sopenharmony_ci    ASSERT_TRUE(string_eq(layer_name, layer_props[0].layerName));
13965db71995Sopenharmony_ci
13975db71995Sopenharmony_ci    DebugUtilsLogger log{VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT};
13985db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
13995db71995Sopenharmony_ci    FillDebugUtilsCreateDetails(inst.create_info, log);
14005db71995Sopenharmony_ci
14015db71995Sopenharmony_ci    // We don't want to return VK_ERROR_LAYER_NOT_PRESENT for missing implicit layers because it's not the
14025db71995Sopenharmony_ci    // application asking for them.
14035db71995Sopenharmony_ci    inst.CheckCreate(VK_SUCCESS);
14045db71995Sopenharmony_ci
14055db71995Sopenharmony_ci#if !defined(__APPLE__)
14065db71995Sopenharmony_ci    // Should get an info message for the bad implicit layer
14075db71995Sopenharmony_ci    ASSERT_TRUE(log.find(std::string("Requested layer \"") + std::string(layer_name) + std::string("\" was wrong bit-type.")));
14085db71995Sopenharmony_ci#else   // __APPLE__
14095db71995Sopenharmony_ci    // Apple only throws a wrong library type of error
14105db71995Sopenharmony_ci    ASSERT_TRUE(log.find(std::string("Requested layer \"") + std::string(layer_name) + std::string("\" failed to load.")));
14115db71995Sopenharmony_ci#endif  // __APPLE__
14125db71995Sopenharmony_ci}
14135db71995Sopenharmony_ci
14145db71995Sopenharmony_ciTEST(TryLoadWrongBinaries, WrongExplicitAndImplicit) {
14155db71995Sopenharmony_ci    FrameworkEnvironment env{};
14165db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2)).add_physical_device("physical_device_0");
14175db71995Sopenharmony_ci
14185db71995Sopenharmony_ci    const char* layer_name_0 = "DummyLayerExplicit";
14195db71995Sopenharmony_ci    env.add_fake_explicit_layer(
14205db71995Sopenharmony_ci        ManifestLayer{}.add_layer(
14215db71995Sopenharmony_ci            ManifestLayer::LayerDescription{}.set_name(layer_name_0).set_lib_path(CURRENT_PLATFORM_DUMMY_BINARY_WRONG_TYPE)),
14225db71995Sopenharmony_ci        "dummy_test_layer_0.json");
14235db71995Sopenharmony_ci    const char* layer_name_1 = "DummyLayerImplicit";
14245db71995Sopenharmony_ci    env.add_fake_implicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{}
14255db71995Sopenharmony_ci                                                              .set_name(layer_name_1)
14265db71995Sopenharmony_ci                                                              .set_lib_path(CURRENT_PLATFORM_DUMMY_BINARY_WRONG_TYPE)
14275db71995Sopenharmony_ci                                                              .set_disable_environment("DISABLE_ENV")),
14285db71995Sopenharmony_ci                                "dummy_test_layer_1.json");
14295db71995Sopenharmony_ci
14305db71995Sopenharmony_ci    auto layer_props = env.GetLayerProperties(2);
14315db71995Sopenharmony_ci    ASSERT_TRUE(check_permutation({layer_name_0, layer_name_1}, layer_props));
14325db71995Sopenharmony_ci
14335db71995Sopenharmony_ci    DebugUtilsLogger log{VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT};
14345db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
14355db71995Sopenharmony_ci    inst.create_info.add_layer(layer_name_0);
14365db71995Sopenharmony_ci    FillDebugUtilsCreateDetails(inst.create_info, log);
14375db71995Sopenharmony_ci
14385db71995Sopenharmony_ci    // Explicit layer not found should generate a VK_ERROR_LAYER_NOT_PRESENT error message.
14395db71995Sopenharmony_ci    inst.CheckCreate(VK_ERROR_LAYER_NOT_PRESENT);
14405db71995Sopenharmony_ci
14415db71995Sopenharmony_ci#if !defined(__APPLE__)
14425db71995Sopenharmony_ci    // Should get error messages for both (the explicit is second and we don't want the implicit to return before the explicit
14435db71995Sopenharmony_ci    // triggers a failure during vkCreateInstance)
14445db71995Sopenharmony_ci    ASSERT_TRUE(log.find(std::string("Requested layer \"") + std::string(layer_name_0) + std::string("\" was wrong bit-type!")));
14455db71995Sopenharmony_ci    ASSERT_TRUE(log.find(std::string("Requested layer \"") + std::string(layer_name_1) + std::string("\" was wrong bit-type.")));
14465db71995Sopenharmony_ci#else   // __APPLE__
14475db71995Sopenharmony_ci    // Apple only throws a wrong library type of error
14485db71995Sopenharmony_ci    ASSERT_TRUE(log.find(std::string("Requested layer \"") + std::string(layer_name_0) + std::string("\" failed to load!")));
14495db71995Sopenharmony_ci    ASSERT_TRUE(log.find(std::string("Requested layer \"") + std::string(layer_name_1) + std::string("\" failed to load.")));
14505db71995Sopenharmony_ci#endif  // __APPLE__
14515db71995Sopenharmony_ci}
14525db71995Sopenharmony_ci
14535db71995Sopenharmony_ciTEST(TryLoadWrongBinaries, WrongExplicitAndImplicitErrorOnly) {
14545db71995Sopenharmony_ci    FrameworkEnvironment env{};
14555db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2)).add_physical_device("physical_device_0");
14565db71995Sopenharmony_ci
14575db71995Sopenharmony_ci    const char* layer_name_0 = "DummyLayerExplicit";
14585db71995Sopenharmony_ci    env.add_fake_explicit_layer(
14595db71995Sopenharmony_ci        ManifestLayer{}.add_layer(
14605db71995Sopenharmony_ci            ManifestLayer::LayerDescription{}.set_name(layer_name_0).set_lib_path(CURRENT_PLATFORM_DUMMY_BINARY_WRONG_TYPE)),
14615db71995Sopenharmony_ci        "dummy_test_layer_0.json");
14625db71995Sopenharmony_ci    const char* layer_name_1 = "DummyLayerImplicit";
14635db71995Sopenharmony_ci    env.add_fake_implicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{}
14645db71995Sopenharmony_ci                                                              .set_name(layer_name_1)
14655db71995Sopenharmony_ci                                                              .set_lib_path(CURRENT_PLATFORM_DUMMY_BINARY_WRONG_TYPE)
14665db71995Sopenharmony_ci                                                              .set_disable_environment("DISABLE_ENV")),
14675db71995Sopenharmony_ci                                "dummy_test_layer_1.json");
14685db71995Sopenharmony_ci
14695db71995Sopenharmony_ci    auto layer_props = env.GetLayerProperties(2);
14705db71995Sopenharmony_ci    ASSERT_TRUE(check_permutation({layer_name_0, layer_name_1}, layer_props));
14715db71995Sopenharmony_ci
14725db71995Sopenharmony_ci    DebugUtilsLogger log{VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT};
14735db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
14745db71995Sopenharmony_ci    inst.create_info.add_layer(layer_name_0);
14755db71995Sopenharmony_ci    FillDebugUtilsCreateDetails(inst.create_info, log);
14765db71995Sopenharmony_ci
14775db71995Sopenharmony_ci    // Explicit layer not found should generate a VK_ERROR_LAYER_NOT_PRESENT error message.
14785db71995Sopenharmony_ci    inst.CheckCreate(VK_ERROR_LAYER_NOT_PRESENT);
14795db71995Sopenharmony_ci
14805db71995Sopenharmony_ci#if !defined(__APPLE__)
14815db71995Sopenharmony_ci    // Should not get an error messages for either
14825db71995Sopenharmony_ci    ASSERT_TRUE(log.find(std::string("Requested layer \"") + std::string(layer_name_0) + std::string("\" was wrong bit-type!")));
14835db71995Sopenharmony_ci    ASSERT_FALSE(log.find(std::string("Requested layer \"") + std::string(layer_name_1) + std::string("\" was wrong bit-type.")));
14845db71995Sopenharmony_ci#else   // __APPLE__
14855db71995Sopenharmony_ci    // Apple only throws a wrong library type of error
14865db71995Sopenharmony_ci    ASSERT_TRUE(log.find(std::string("Requested layer \"") + std::string(layer_name_0) + std::string("\" failed to load!")));
14875db71995Sopenharmony_ci    ASSERT_FALSE(log.find(std::string("Requested layer \"") + std::string(layer_name_1) + std::string("\" failed to load.")));
14885db71995Sopenharmony_ci#endif  // __APPLE__
14895db71995Sopenharmony_ci}
14905db71995Sopenharmony_ci
14915db71995Sopenharmony_ciTEST(TryLoadWrongBinaries, BadExplicit) {
14925db71995Sopenharmony_ci    FrameworkEnvironment env{};
14935db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2)).add_physical_device("physical_device_0");
14945db71995Sopenharmony_ci
14955db71995Sopenharmony_ci    const char* layer_name = "DummyLayerExplicit";
14965db71995Sopenharmony_ci    env.add_fake_explicit_layer(
14975db71995Sopenharmony_ci        ManifestLayer{}.add_layer(
14985db71995Sopenharmony_ci            ManifestLayer::LayerDescription{}.set_name(layer_name).set_lib_path(CURRENT_PLATFORM_DUMMY_BINARY_BAD)),
14995db71995Sopenharmony_ci        "dummy_test_layer.json");
15005db71995Sopenharmony_ci
15015db71995Sopenharmony_ci    auto layer_props = env.GetLayerProperties(1);
15025db71995Sopenharmony_ci    ASSERT_TRUE(string_eq(layer_name, layer_props[0].layerName));
15035db71995Sopenharmony_ci
15045db71995Sopenharmony_ci    DebugUtilsLogger log{VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT};
15055db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
15065db71995Sopenharmony_ci    inst.create_info.add_layer(layer_name);
15075db71995Sopenharmony_ci    FillDebugUtilsCreateDetails(inst.create_info, log);
15085db71995Sopenharmony_ci
15095db71995Sopenharmony_ci    // Explicit layer not found should generate a VK_ERROR_LAYER_NOT_PRESENT error message.
15105db71995Sopenharmony_ci    inst.CheckCreate(VK_ERROR_LAYER_NOT_PRESENT);
15115db71995Sopenharmony_ci
15125db71995Sopenharmony_ci    // Should get an error message for the bad explicit
15135db71995Sopenharmony_ci    ASSERT_TRUE(log.find(std::string("Requested layer \"") + std::string(layer_name) + std::string("\" failed to load!")));
15145db71995Sopenharmony_ci}
15155db71995Sopenharmony_ci
15165db71995Sopenharmony_ciTEST(TryLoadWrongBinaries, BadImplicit) {
15175db71995Sopenharmony_ci    FrameworkEnvironment env{};
15185db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2)).add_physical_device("physical_device_0");
15195db71995Sopenharmony_ci
15205db71995Sopenharmony_ci    const char* layer_name = "DummyLayerImplicit0";
15215db71995Sopenharmony_ci    env.add_fake_implicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{}
15225db71995Sopenharmony_ci                                                              .set_name(layer_name)
15235db71995Sopenharmony_ci                                                              .set_lib_path(CURRENT_PLATFORM_DUMMY_BINARY_BAD)
15245db71995Sopenharmony_ci                                                              .set_disable_environment("DISABLE_ENV")),
15255db71995Sopenharmony_ci                                "dummy_test_layer.json");
15265db71995Sopenharmony_ci
15275db71995Sopenharmony_ci    auto layer_props = env.GetLayerProperties(1);
15285db71995Sopenharmony_ci    ASSERT_TRUE(string_eq(layer_name, layer_props[0].layerName));
15295db71995Sopenharmony_ci
15305db71995Sopenharmony_ci    DebugUtilsLogger log{VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT};
15315db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
15325db71995Sopenharmony_ci    FillDebugUtilsCreateDetails(inst.create_info, log);
15335db71995Sopenharmony_ci
15345db71995Sopenharmony_ci    // We don't want to return VK_ERROR_LAYER_NOT_PRESENT for missing implicit layers because it's not the
15355db71995Sopenharmony_ci    // application asking for them.
15365db71995Sopenharmony_ci    inst.CheckCreate(VK_SUCCESS);
15375db71995Sopenharmony_ci
15385db71995Sopenharmony_ci    // Should get an info message for the bad implicit
15395db71995Sopenharmony_ci    ASSERT_TRUE(log.find(std::string("Requested layer \"") + std::string(layer_name) + std::string("\" failed to load.")));
15405db71995Sopenharmony_ci}
15415db71995Sopenharmony_ci
15425db71995Sopenharmony_ciTEST(TryLoadWrongBinaries, BadExplicitAndImplicit) {
15435db71995Sopenharmony_ci    FrameworkEnvironment env{};
15445db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2)).add_physical_device("physical_device_0");
15455db71995Sopenharmony_ci
15465db71995Sopenharmony_ci    const char* layer_name_0 = "DummyLayerExplicit";
15475db71995Sopenharmony_ci    env.add_fake_explicit_layer(
15485db71995Sopenharmony_ci        ManifestLayer{}.add_layer(
15495db71995Sopenharmony_ci            ManifestLayer::LayerDescription{}.set_name(layer_name_0).set_lib_path(CURRENT_PLATFORM_DUMMY_BINARY_BAD)),
15505db71995Sopenharmony_ci        "dummy_test_layer_0.json");
15515db71995Sopenharmony_ci    const char* layer_name_1 = "DummyLayerImplicit0";
15525db71995Sopenharmony_ci    env.add_fake_implicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{}
15535db71995Sopenharmony_ci                                                              .set_name(layer_name_1)
15545db71995Sopenharmony_ci                                                              .set_lib_path(CURRENT_PLATFORM_DUMMY_BINARY_BAD)
15555db71995Sopenharmony_ci                                                              .set_disable_environment("DISABLE_ENV")),
15565db71995Sopenharmony_ci                                "dummy_test_layer_1.json");
15575db71995Sopenharmony_ci
15585db71995Sopenharmony_ci    auto layer_props = env.GetLayerProperties(2);
15595db71995Sopenharmony_ci    ASSERT_TRUE(check_permutation({layer_name_0, layer_name_1}, layer_props));
15605db71995Sopenharmony_ci
15615db71995Sopenharmony_ci    DebugUtilsLogger log{VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT};
15625db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
15635db71995Sopenharmony_ci    inst.create_info.add_layer(layer_name_0);
15645db71995Sopenharmony_ci    FillDebugUtilsCreateDetails(inst.create_info, log);
15655db71995Sopenharmony_ci
15665db71995Sopenharmony_ci    // Explicit layer not found should generate a VK_ERROR_LAYER_NOT_PRESENT error message.
15675db71995Sopenharmony_ci    inst.CheckCreate(VK_ERROR_LAYER_NOT_PRESENT);
15685db71995Sopenharmony_ci
15695db71995Sopenharmony_ci    // Apple only throws a wrong library type of error
15705db71995Sopenharmony_ci    ASSERT_TRUE(log.find(std::string("Requested layer \"") + std::string(layer_name_0) + std::string("\" failed to load!")));
15715db71995Sopenharmony_ci    ASSERT_TRUE(log.find(std::string("Requested layer \"") + std::string(layer_name_1) + std::string("\" failed to load.")));
15725db71995Sopenharmony_ci}
15735db71995Sopenharmony_ci
15745db71995Sopenharmony_ciTEST(TryLoadWrongBinaries, WrongArchDriver) {
15755db71995Sopenharmony_ci    FrameworkEnvironment env{};
15765db71995Sopenharmony_ci    // Intentionally set the wrong arch
15775db71995Sopenharmony_ci    env.add_icd(TestICDDetails{TEST_ICD_PATH_VERSION_2}.icd_manifest.set_library_arch(sizeof(void*) == 4 ? "64" : "32"))
15785db71995Sopenharmony_ci        .add_physical_device("physical_device_0");
15795db71995Sopenharmony_ci
15805db71995Sopenharmony_ci    DebugUtilsLogger log{VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT};
15815db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
15825db71995Sopenharmony_ci    FillDebugUtilsCreateDetails(inst.create_info, log);
15835db71995Sopenharmony_ci    inst.CheckCreate(VK_ERROR_INCOMPATIBLE_DRIVER);
15845db71995Sopenharmony_ci    ASSERT_TRUE(
15855db71995Sopenharmony_ci        log.find("loader_parse_icd_manifest: Driver library architecture doesn't match the current running architecture, skipping "
15865db71995Sopenharmony_ci                 "this driver"));
15875db71995Sopenharmony_ci}
15885db71995Sopenharmony_ci
15895db71995Sopenharmony_ciTEST(TryLoadWrongBinaries, WrongArchLayer) {
15905db71995Sopenharmony_ci    FrameworkEnvironment env{};
15915db71995Sopenharmony_ci    env.add_icd(TestICDDetails{TEST_ICD_PATH_VERSION_2}).add_physical_device("physical_device_0");
15925db71995Sopenharmony_ci
15935db71995Sopenharmony_ci    const char* layer_name = "TestLayer";
15945db71995Sopenharmony_ci    env.add_explicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{}
15955db71995Sopenharmony_ci                                                         .set_name(layer_name)
15965db71995Sopenharmony_ci                                                         .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)
15975db71995Sopenharmony_ci                                                         // Intentionally set the wrong arch
15985db71995Sopenharmony_ci                                                         .set_library_arch(sizeof(void*) == 4 ? "64" : "32")),
15995db71995Sopenharmony_ci                           "test_layer.json");
16005db71995Sopenharmony_ci
16015db71995Sopenharmony_ci    DebugUtilsLogger log{VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT};
16025db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
16035db71995Sopenharmony_ci    FillDebugUtilsCreateDetails(inst.create_info, log);
16045db71995Sopenharmony_ci    inst.create_info.add_layer(layer_name);
16055db71995Sopenharmony_ci    inst.CheckCreate(VK_ERROR_LAYER_NOT_PRESENT);
16065db71995Sopenharmony_ci    ASSERT_TRUE(log.find("Layer library architecture doesn't match the current running architecture, skipping this layer"));
16075db71995Sopenharmony_ci}
16085db71995Sopenharmony_ci
16095db71995Sopenharmony_ciTEST(EnumeratePhysicalDeviceGroups, OneCall) {
16105db71995Sopenharmony_ci    FrameworkEnvironment env{};
16115db71995Sopenharmony_ci    auto& driver = env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2, VK_API_VERSION_1_1))
16125db71995Sopenharmony_ci                       .set_min_icd_interface_version(5)
16135db71995Sopenharmony_ci                       .set_icd_api_version(VK_API_VERSION_1_1)
16145db71995Sopenharmony_ci                       .add_instance_extension({VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME});
16155db71995Sopenharmony_ci
16165db71995Sopenharmony_ci    // ICD contains 3 devices in two groups
16175db71995Sopenharmony_ci    for (size_t i = 0; i < 3; i++) {
16185db71995Sopenharmony_ci        driver.physical_devices.emplace_back(std::string("physical_device_") + std::to_string(i));
16195db71995Sopenharmony_ci        driver.physical_devices.back().extensions.push_back({VK_EXT_PCI_BUS_INFO_EXTENSION_NAME, 0});
16205db71995Sopenharmony_ci        driver.physical_devices.back().properties.apiVersion = VK_API_VERSION_1_1;
16215db71995Sopenharmony_ci    }
16225db71995Sopenharmony_ci    driver.physical_device_groups.emplace_back(driver.physical_devices[0]);
16235db71995Sopenharmony_ci    driver.physical_device_groups.back().use_physical_device(driver.physical_devices[1]);
16245db71995Sopenharmony_ci    driver.physical_device_groups.emplace_back(driver.physical_devices[2]);
16255db71995Sopenharmony_ci    const uint32_t max_physical_device_count = 3;
16265db71995Sopenharmony_ci
16275db71995Sopenharmony_ci    // Core function
16285db71995Sopenharmony_ci    {
16295db71995Sopenharmony_ci        InstWrapper inst{env.vulkan_functions};
16305db71995Sopenharmony_ci        inst.create_info.set_api_version(VK_API_VERSION_1_1);
16315db71995Sopenharmony_ci        inst.CheckCreate();
16325db71995Sopenharmony_ci
16335db71995Sopenharmony_ci        auto physical_devices = std::vector<VkPhysicalDevice>(max_physical_device_count);
16345db71995Sopenharmony_ci        uint32_t returned_phys_dev_count = max_physical_device_count;
16355db71995Sopenharmony_ci        ASSERT_EQ(VK_SUCCESS, inst->vkEnumeratePhysicalDevices(inst, &returned_phys_dev_count, physical_devices.data()));
16365db71995Sopenharmony_ci        handle_assert_has_values(physical_devices);
16375db71995Sopenharmony_ci
16385db71995Sopenharmony_ci        uint32_t group_count = static_cast<uint32_t>(driver.physical_device_groups.size());
16395db71995Sopenharmony_ci        uint32_t returned_group_count = group_count;
16405db71995Sopenharmony_ci        std::vector<VkPhysicalDeviceGroupProperties> group_props{};
16415db71995Sopenharmony_ci        group_props.resize(group_count, VkPhysicalDeviceGroupProperties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GROUP_PROPERTIES});
16425db71995Sopenharmony_ci        ASSERT_EQ(VK_SUCCESS, inst->vkEnumeratePhysicalDeviceGroups(inst, &returned_group_count, group_props.data()));
16435db71995Sopenharmony_ci        ASSERT_EQ(group_count, returned_group_count);
16445db71995Sopenharmony_ci
16455db71995Sopenharmony_ci        // Make sure each physical device shows up in a group, but only once
16465db71995Sopenharmony_ci        std::array<bool, max_physical_device_count> found{false};
16475db71995Sopenharmony_ci        for (uint32_t group = 0; group < group_count; ++group) {
16485db71995Sopenharmony_ci            for (uint32_t g_dev = 0; g_dev < group_props[group].physicalDeviceCount; ++g_dev) {
16495db71995Sopenharmony_ci                for (uint32_t dev = 0; dev < max_physical_device_count; ++dev) {
16505db71995Sopenharmony_ci                    if (physical_devices[dev] == group_props[group].physicalDevices[g_dev]) {
16515db71995Sopenharmony_ci                        ASSERT_EQ(false, found[dev]);
16525db71995Sopenharmony_ci                        found[dev] = true;
16535db71995Sopenharmony_ci                        break;
16545db71995Sopenharmony_ci                    }
16555db71995Sopenharmony_ci                }
16565db71995Sopenharmony_ci            }
16575db71995Sopenharmony_ci        }
16585db71995Sopenharmony_ci        for (uint32_t dev = 0; dev < max_physical_device_count; ++dev) {
16595db71995Sopenharmony_ci            ASSERT_EQ(true, found[dev]);
16605db71995Sopenharmony_ci        }
16615db71995Sopenharmony_ci        for (auto& group : group_props) {
16625db71995Sopenharmony_ci            VkDeviceGroupDeviceCreateInfo group_info{};
16635db71995Sopenharmony_ci            group_info.sType = VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO;
16645db71995Sopenharmony_ci            group_info.physicalDeviceCount = group.physicalDeviceCount;
16655db71995Sopenharmony_ci            group_info.pPhysicalDevices = &group.physicalDevices[0];
16665db71995Sopenharmony_ci            VkBaseInStructure spacer_structure{};
16675db71995Sopenharmony_ci            spacer_structure.sType = static_cast<VkStructureType>(100000);
16685db71995Sopenharmony_ci            spacer_structure.pNext = reinterpret_cast<const VkBaseInStructure*>(&group_info);
16695db71995Sopenharmony_ci            DeviceWrapper dev{inst};
16705db71995Sopenharmony_ci            dev.create_info.dev.pNext = &spacer_structure;
16715db71995Sopenharmony_ci            dev.CheckCreate(group.physicalDevices[0]);
16725db71995Sopenharmony_ci
16735db71995Sopenharmony_ci            // This convoluted logic makes sure that the pNext chain is unmolested after being passed into vkCreateDevice
16745db71995Sopenharmony_ci            // While not expected for applications to iterate over this chain, since it is const it is important to make sure
16755db71995Sopenharmony_ci            // that the chain didn't change somehow, and especially so that iterating it doesn't crash.
16765db71995Sopenharmony_ci            int count = 0;
16775db71995Sopenharmony_ci            const VkBaseInStructure* pNext = reinterpret_cast<const VkBaseInStructure*>(dev.create_info.dev.pNext);
16785db71995Sopenharmony_ci            while (pNext != nullptr) {
16795db71995Sopenharmony_ci                if (pNext->sType == VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO) {
16805db71995Sopenharmony_ci                    ASSERT_EQ(&group_info, reinterpret_cast<const VkDeviceGroupDeviceCreateInfo*>(pNext));
16815db71995Sopenharmony_ci                }
16825db71995Sopenharmony_ci                if (pNext->sType == 100000) {
16835db71995Sopenharmony_ci                    ASSERT_EQ(&spacer_structure, pNext);
16845db71995Sopenharmony_ci                }
16855db71995Sopenharmony_ci                pNext = pNext->pNext;
16865db71995Sopenharmony_ci                count++;
16875db71995Sopenharmony_ci            }
16885db71995Sopenharmony_ci            ASSERT_EQ(count, 2);
16895db71995Sopenharmony_ci        }
16905db71995Sopenharmony_ci    }
16915db71995Sopenharmony_ci    driver.add_instance_extension({VK_KHR_DEVICE_GROUP_CREATION_EXTENSION_NAME});
16925db71995Sopenharmony_ci    // Extension
16935db71995Sopenharmony_ci    {
16945db71995Sopenharmony_ci        InstWrapper inst{env.vulkan_functions};
16955db71995Sopenharmony_ci        inst.create_info.add_extension(VK_KHR_DEVICE_GROUP_CREATION_EXTENSION_NAME);
16965db71995Sopenharmony_ci        inst.CheckCreate();
16975db71995Sopenharmony_ci
16985db71995Sopenharmony_ci        PFN_vkEnumeratePhysicalDeviceGroupsKHR vkEnumeratePhysicalDeviceGroupsKHR = inst.load("vkEnumeratePhysicalDeviceGroupsKHR");
16995db71995Sopenharmony_ci
17005db71995Sopenharmony_ci        auto physical_devices = std::vector<VkPhysicalDevice>(max_physical_device_count);
17015db71995Sopenharmony_ci        uint32_t returned_phys_dev_count = max_physical_device_count;
17025db71995Sopenharmony_ci        ASSERT_EQ(VK_SUCCESS, inst->vkEnumeratePhysicalDevices(inst, &returned_phys_dev_count, physical_devices.data()));
17035db71995Sopenharmony_ci        handle_assert_has_values(physical_devices);
17045db71995Sopenharmony_ci
17055db71995Sopenharmony_ci        uint32_t group_count = static_cast<uint32_t>(driver.physical_device_groups.size());
17065db71995Sopenharmony_ci        uint32_t returned_group_count = group_count;
17075db71995Sopenharmony_ci        std::vector<VkPhysicalDeviceGroupProperties> group_props{};
17085db71995Sopenharmony_ci        group_props.resize(group_count, VkPhysicalDeviceGroupProperties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GROUP_PROPERTIES});
17095db71995Sopenharmony_ci        ASSERT_EQ(VK_SUCCESS, vkEnumeratePhysicalDeviceGroupsKHR(inst, &returned_group_count, group_props.data()));
17105db71995Sopenharmony_ci        ASSERT_EQ(group_count, returned_group_count);
17115db71995Sopenharmony_ci
17125db71995Sopenharmony_ci        // Make sure each physical device shows up in a group, but only once
17135db71995Sopenharmony_ci        std::array<bool, max_physical_device_count> found{false};
17145db71995Sopenharmony_ci        for (uint32_t group = 0; group < group_count; ++group) {
17155db71995Sopenharmony_ci            for (uint32_t g_dev = 0; g_dev < group_props[group].physicalDeviceCount; ++g_dev) {
17165db71995Sopenharmony_ci                for (uint32_t dev = 0; dev < max_physical_device_count; ++dev) {
17175db71995Sopenharmony_ci                    if (physical_devices[dev] == group_props[group].physicalDevices[g_dev]) {
17185db71995Sopenharmony_ci                        ASSERT_EQ(false, found[dev]);
17195db71995Sopenharmony_ci                        found[dev] = true;
17205db71995Sopenharmony_ci                        break;
17215db71995Sopenharmony_ci                    }
17225db71995Sopenharmony_ci                }
17235db71995Sopenharmony_ci            }
17245db71995Sopenharmony_ci        }
17255db71995Sopenharmony_ci        for (uint32_t dev = 0; dev < max_physical_device_count; ++dev) {
17265db71995Sopenharmony_ci            ASSERT_EQ(true, found[dev]);
17275db71995Sopenharmony_ci        }
17285db71995Sopenharmony_ci        for (auto& group : group_props) {
17295db71995Sopenharmony_ci            VkDeviceGroupDeviceCreateInfo group_info{};
17305db71995Sopenharmony_ci            group_info.sType = VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO;
17315db71995Sopenharmony_ci            group_info.physicalDeviceCount = group.physicalDeviceCount;
17325db71995Sopenharmony_ci            group_info.pPhysicalDevices = &group.physicalDevices[0];
17335db71995Sopenharmony_ci            VkBaseInStructure spacer_structure{};
17345db71995Sopenharmony_ci            spacer_structure.sType = static_cast<VkStructureType>(100000);
17355db71995Sopenharmony_ci            spacer_structure.pNext = reinterpret_cast<const VkBaseInStructure*>(&group_info);
17365db71995Sopenharmony_ci            DeviceWrapper dev{inst};
17375db71995Sopenharmony_ci            dev.create_info.dev.pNext = &spacer_structure;
17385db71995Sopenharmony_ci            dev.CheckCreate(group.physicalDevices[0]);
17395db71995Sopenharmony_ci        }
17405db71995Sopenharmony_ci    }
17415db71995Sopenharmony_ci}
17425db71995Sopenharmony_ci
17435db71995Sopenharmony_ciTEST(EnumeratePhysicalDeviceGroups, TwoCall) {
17445db71995Sopenharmony_ci    FrameworkEnvironment env{};
17455db71995Sopenharmony_ci    auto& driver = env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2, VK_API_VERSION_1_1))
17465db71995Sopenharmony_ci                       .set_min_icd_interface_version(5)
17475db71995Sopenharmony_ci                       .set_icd_api_version(VK_API_VERSION_1_1)
17485db71995Sopenharmony_ci                       .add_instance_extension({VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME});
17495db71995Sopenharmony_ci
17505db71995Sopenharmony_ci    // ICD contains 3 devices in two groups
17515db71995Sopenharmony_ci    for (size_t i = 0; i < 3; i++) {
17525db71995Sopenharmony_ci        driver.physical_devices.emplace_back(std::string("physical_device_") + std::to_string(i));
17535db71995Sopenharmony_ci        driver.physical_devices.back().extensions.push_back({VK_EXT_PCI_BUS_INFO_EXTENSION_NAME, 0});
17545db71995Sopenharmony_ci        driver.physical_devices.back().properties.apiVersion = VK_API_VERSION_1_1;
17555db71995Sopenharmony_ci    }
17565db71995Sopenharmony_ci    driver.physical_device_groups.emplace_back(driver.physical_devices[0]);
17575db71995Sopenharmony_ci    driver.physical_device_groups.back().use_physical_device(driver.physical_devices[1]);
17585db71995Sopenharmony_ci    driver.physical_device_groups.emplace_back(driver.physical_devices[2]);
17595db71995Sopenharmony_ci    const uint32_t max_physical_device_count = 3;
17605db71995Sopenharmony_ci
17615db71995Sopenharmony_ci    // Core function
17625db71995Sopenharmony_ci    {
17635db71995Sopenharmony_ci        InstWrapper inst{env.vulkan_functions};
17645db71995Sopenharmony_ci        inst.create_info.set_api_version(VK_API_VERSION_1_1);
17655db71995Sopenharmony_ci        inst.CheckCreate();
17665db71995Sopenharmony_ci
17675db71995Sopenharmony_ci        auto physical_devices = std::vector<VkPhysicalDevice>(max_physical_device_count);
17685db71995Sopenharmony_ci        uint32_t returned_phys_dev_count = max_physical_device_count;
17695db71995Sopenharmony_ci        ASSERT_EQ(VK_SUCCESS, inst->vkEnumeratePhysicalDevices(inst, &returned_phys_dev_count, physical_devices.data()));
17705db71995Sopenharmony_ci        handle_assert_has_values(physical_devices);
17715db71995Sopenharmony_ci
17725db71995Sopenharmony_ci        uint32_t group_count = static_cast<uint32_t>(driver.physical_device_groups.size());
17735db71995Sopenharmony_ci        uint32_t returned_group_count = 0;
17745db71995Sopenharmony_ci        ASSERT_EQ(VK_SUCCESS, inst->vkEnumeratePhysicalDeviceGroups(inst, &returned_group_count, nullptr));
17755db71995Sopenharmony_ci        ASSERT_EQ(group_count, returned_group_count);
17765db71995Sopenharmony_ci
17775db71995Sopenharmony_ci        std::vector<VkPhysicalDeviceGroupProperties> group_props{};
17785db71995Sopenharmony_ci        group_props.resize(group_count, VkPhysicalDeviceGroupProperties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GROUP_PROPERTIES});
17795db71995Sopenharmony_ci        ASSERT_EQ(VK_SUCCESS, inst->vkEnumeratePhysicalDeviceGroups(inst, &returned_group_count, group_props.data()));
17805db71995Sopenharmony_ci        ASSERT_EQ(group_count, returned_group_count);
17815db71995Sopenharmony_ci
17825db71995Sopenharmony_ci        // Make sure each physical device shows up in a group, but only once
17835db71995Sopenharmony_ci        std::array<bool, max_physical_device_count> found{false};
17845db71995Sopenharmony_ci        for (uint32_t group = 0; group < group_count; ++group) {
17855db71995Sopenharmony_ci            for (uint32_t g_dev = 0; g_dev < group_props[group].physicalDeviceCount; ++g_dev) {
17865db71995Sopenharmony_ci                for (uint32_t dev = 0; dev < max_physical_device_count; ++dev) {
17875db71995Sopenharmony_ci                    if (physical_devices[dev] == group_props[group].physicalDevices[g_dev]) {
17885db71995Sopenharmony_ci                        ASSERT_EQ(false, found[dev]);
17895db71995Sopenharmony_ci                        found[dev] = true;
17905db71995Sopenharmony_ci                        break;
17915db71995Sopenharmony_ci                    }
17925db71995Sopenharmony_ci                }
17935db71995Sopenharmony_ci            }
17945db71995Sopenharmony_ci        }
17955db71995Sopenharmony_ci        for (uint32_t dev = 0; dev < max_physical_device_count; ++dev) {
17965db71995Sopenharmony_ci            ASSERT_EQ(true, found[dev]);
17975db71995Sopenharmony_ci        }
17985db71995Sopenharmony_ci        for (auto& group : group_props) {
17995db71995Sopenharmony_ci            VkDeviceGroupDeviceCreateInfo group_info{};
18005db71995Sopenharmony_ci            group_info.sType = VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO;
18015db71995Sopenharmony_ci            group_info.physicalDeviceCount = group.physicalDeviceCount;
18025db71995Sopenharmony_ci            group_info.pPhysicalDevices = &group.physicalDevices[0];
18035db71995Sopenharmony_ci            DeviceWrapper dev{inst};
18045db71995Sopenharmony_ci            dev.create_info.dev.pNext = &group_info;
18055db71995Sopenharmony_ci            dev.CheckCreate(group.physicalDevices[0]);
18065db71995Sopenharmony_ci        }
18075db71995Sopenharmony_ci    }
18085db71995Sopenharmony_ci    driver.add_instance_extension({VK_KHR_DEVICE_GROUP_CREATION_EXTENSION_NAME});
18095db71995Sopenharmony_ci    // Extension
18105db71995Sopenharmony_ci    {
18115db71995Sopenharmony_ci        InstWrapper inst{env.vulkan_functions};
18125db71995Sopenharmony_ci        inst.create_info.add_extension("VK_KHR_device_group_creation");
18135db71995Sopenharmony_ci        inst.CheckCreate();
18145db71995Sopenharmony_ci
18155db71995Sopenharmony_ci        auto physical_devices = std::vector<VkPhysicalDevice>(max_physical_device_count);
18165db71995Sopenharmony_ci        uint32_t returned_phys_dev_count = max_physical_device_count;
18175db71995Sopenharmony_ci        ASSERT_EQ(VK_SUCCESS, inst->vkEnumeratePhysicalDevices(inst, &returned_phys_dev_count, physical_devices.data()));
18185db71995Sopenharmony_ci        handle_assert_has_values(physical_devices);
18195db71995Sopenharmony_ci
18205db71995Sopenharmony_ci        PFN_vkEnumeratePhysicalDeviceGroupsKHR vkEnumeratePhysicalDeviceGroupsKHR = inst.load("vkEnumeratePhysicalDeviceGroupsKHR");
18215db71995Sopenharmony_ci
18225db71995Sopenharmony_ci        uint32_t group_count = static_cast<uint32_t>(driver.physical_device_groups.size());
18235db71995Sopenharmony_ci        uint32_t returned_group_count = 0;
18245db71995Sopenharmony_ci        ASSERT_EQ(VK_SUCCESS, vkEnumeratePhysicalDeviceGroupsKHR(inst, &returned_group_count, nullptr));
18255db71995Sopenharmony_ci        ASSERT_EQ(group_count, returned_group_count);
18265db71995Sopenharmony_ci
18275db71995Sopenharmony_ci        std::vector<VkPhysicalDeviceGroupProperties> group_props{};
18285db71995Sopenharmony_ci        group_props.resize(group_count, VkPhysicalDeviceGroupProperties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GROUP_PROPERTIES});
18295db71995Sopenharmony_ci        ASSERT_EQ(VK_SUCCESS, vkEnumeratePhysicalDeviceGroupsKHR(inst, &returned_group_count, group_props.data()));
18305db71995Sopenharmony_ci        ASSERT_EQ(group_count, returned_group_count);
18315db71995Sopenharmony_ci
18325db71995Sopenharmony_ci        // Make sure each physical device shows up in a group, but only once
18335db71995Sopenharmony_ci        std::array<bool, max_physical_device_count> found{false};
18345db71995Sopenharmony_ci        for (uint32_t group = 0; group < group_count; ++group) {
18355db71995Sopenharmony_ci            for (uint32_t g_dev = 0; g_dev < group_props[group].physicalDeviceCount; ++g_dev) {
18365db71995Sopenharmony_ci                for (uint32_t dev = 0; dev < max_physical_device_count; ++dev) {
18375db71995Sopenharmony_ci                    if (physical_devices[dev] == group_props[group].physicalDevices[g_dev]) {
18385db71995Sopenharmony_ci                        ASSERT_EQ(false, found[dev]);
18395db71995Sopenharmony_ci                        found[dev] = true;
18405db71995Sopenharmony_ci                        break;
18415db71995Sopenharmony_ci                    }
18425db71995Sopenharmony_ci                }
18435db71995Sopenharmony_ci            }
18445db71995Sopenharmony_ci        }
18455db71995Sopenharmony_ci        for (uint32_t dev = 0; dev < max_physical_device_count; ++dev) {
18465db71995Sopenharmony_ci            ASSERT_EQ(true, found[dev]);
18475db71995Sopenharmony_ci        }
18485db71995Sopenharmony_ci        for (auto& group : group_props) {
18495db71995Sopenharmony_ci            VkDeviceGroupDeviceCreateInfo group_info{};
18505db71995Sopenharmony_ci            group_info.sType = VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO;
18515db71995Sopenharmony_ci            group_info.physicalDeviceCount = group.physicalDeviceCount;
18525db71995Sopenharmony_ci            group_info.pPhysicalDevices = &group.physicalDevices[0];
18535db71995Sopenharmony_ci            DeviceWrapper dev{inst};
18545db71995Sopenharmony_ci            dev.create_info.dev.pNext = &group_info;
18555db71995Sopenharmony_ci            dev.CheckCreate(group.physicalDevices[0]);
18565db71995Sopenharmony_ci        }
18575db71995Sopenharmony_ci    }
18585db71995Sopenharmony_ci}
18595db71995Sopenharmony_ci
18605db71995Sopenharmony_ciTEST(EnumeratePhysicalDeviceGroups, TwoCallIncomplete) {
18615db71995Sopenharmony_ci    FrameworkEnvironment env{};
18625db71995Sopenharmony_ci    auto& driver = env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2, VK_API_VERSION_1_1))
18635db71995Sopenharmony_ci                       .set_min_icd_interface_version(5)
18645db71995Sopenharmony_ci                       .set_icd_api_version(VK_API_VERSION_1_1)
18655db71995Sopenharmony_ci                       .add_instance_extension({VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME});
18665db71995Sopenharmony_ci
18675db71995Sopenharmony_ci    // ICD contains 3 devices in two groups
18685db71995Sopenharmony_ci    for (size_t i = 0; i < 3; i++) {
18695db71995Sopenharmony_ci        driver.physical_devices.emplace_back(std::string("physical_device_") + std::to_string(i));
18705db71995Sopenharmony_ci        driver.physical_devices.back().extensions.push_back({VK_EXT_PCI_BUS_INFO_EXTENSION_NAME, 0});
18715db71995Sopenharmony_ci        driver.physical_devices.back().properties.apiVersion = VK_API_VERSION_1_1;
18725db71995Sopenharmony_ci    }
18735db71995Sopenharmony_ci    driver.physical_device_groups.emplace_back(driver.physical_devices[0]);
18745db71995Sopenharmony_ci    driver.physical_device_groups.back().use_physical_device(driver.physical_devices[1]);
18755db71995Sopenharmony_ci    driver.physical_device_groups.emplace_back(driver.physical_devices[2]);
18765db71995Sopenharmony_ci
18775db71995Sopenharmony_ci    // Core function
18785db71995Sopenharmony_ci    {
18795db71995Sopenharmony_ci        InstWrapper inst{env.vulkan_functions};
18805db71995Sopenharmony_ci        inst.create_info.set_api_version(VK_API_VERSION_1_1);
18815db71995Sopenharmony_ci        inst.CheckCreate();
18825db71995Sopenharmony_ci
18835db71995Sopenharmony_ci        uint32_t group_count = static_cast<uint32_t>(driver.physical_device_groups.size());
18845db71995Sopenharmony_ci        uint32_t returned_group_count = 0;
18855db71995Sopenharmony_ci        ASSERT_EQ(VK_SUCCESS, inst->vkEnumeratePhysicalDeviceGroups(inst, &returned_group_count, nullptr));
18865db71995Sopenharmony_ci        ASSERT_EQ(group_count, returned_group_count);
18875db71995Sopenharmony_ci
18885db71995Sopenharmony_ci        returned_group_count = 1;
18895db71995Sopenharmony_ci        std::array<VkPhysicalDeviceGroupProperties, 1> group_props{};
18905db71995Sopenharmony_ci        group_props[0].sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GROUP_PROPERTIES;
18915db71995Sopenharmony_ci        ASSERT_EQ(VK_INCOMPLETE, inst->vkEnumeratePhysicalDeviceGroups(inst, &returned_group_count, group_props.data()));
18925db71995Sopenharmony_ci        ASSERT_EQ(1U, returned_group_count);
18935db71995Sopenharmony_ci
18945db71995Sopenharmony_ci        returned_group_count = 2;
18955db71995Sopenharmony_ci        std::array<VkPhysicalDeviceGroupProperties, 2> group_props_2{};
18965db71995Sopenharmony_ci        group_props_2[0].sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GROUP_PROPERTIES;
18975db71995Sopenharmony_ci        group_props_2[1].sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GROUP_PROPERTIES;
18985db71995Sopenharmony_ci        ASSERT_EQ(VK_SUCCESS, inst->vkEnumeratePhysicalDeviceGroups(inst, &returned_group_count, group_props_2.data()));
18995db71995Sopenharmony_ci        ASSERT_EQ(2U, returned_group_count);
19005db71995Sopenharmony_ci
19015db71995Sopenharmony_ci        // Make sure the incomplete group items appear in the complete group
19025db71995Sopenharmony_ci        for (uint32_t inc_group = 0; inc_group < 1; ++inc_group) {
19035db71995Sopenharmony_ci            bool found = false;
19045db71995Sopenharmony_ci            for (uint32_t full_group = 0; full_group < 2; ++full_group) {
19055db71995Sopenharmony_ci                if (group_props[inc_group].physicalDeviceCount == group_props_2[full_group].physicalDeviceCount &&
19065db71995Sopenharmony_ci                    group_props[inc_group].physicalDevices[0] == group_props_2[full_group].physicalDevices[0] &&
19075db71995Sopenharmony_ci                    group_props[inc_group].physicalDevices[1] == group_props_2[full_group].physicalDevices[1]) {
19085db71995Sopenharmony_ci                    found = true;
19095db71995Sopenharmony_ci                    break;
19105db71995Sopenharmony_ci                }
19115db71995Sopenharmony_ci            }
19125db71995Sopenharmony_ci            ASSERT_EQ(true, found);
19135db71995Sopenharmony_ci        }
19145db71995Sopenharmony_ci        for (auto& group : group_props) {
19155db71995Sopenharmony_ci            VkDeviceGroupDeviceCreateInfo group_info{};
19165db71995Sopenharmony_ci            group_info.sType = VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO;
19175db71995Sopenharmony_ci            group_info.physicalDeviceCount = group.physicalDeviceCount;
19185db71995Sopenharmony_ci            group_info.pPhysicalDevices = &group.physicalDevices[0];
19195db71995Sopenharmony_ci            DeviceWrapper dev{inst};
19205db71995Sopenharmony_ci            dev.create_info.dev.pNext = &group_info;
19215db71995Sopenharmony_ci            dev.CheckCreate(group.physicalDevices[0]);
19225db71995Sopenharmony_ci        }
19235db71995Sopenharmony_ci    }
19245db71995Sopenharmony_ci    driver.add_instance_extension({VK_KHR_DEVICE_GROUP_CREATION_EXTENSION_NAME});
19255db71995Sopenharmony_ci    // Extension
19265db71995Sopenharmony_ci    {
19275db71995Sopenharmony_ci        InstWrapper inst{env.vulkan_functions};
19285db71995Sopenharmony_ci        inst.create_info.add_extension("VK_KHR_device_group_creation");
19295db71995Sopenharmony_ci        inst.CheckCreate();
19305db71995Sopenharmony_ci
19315db71995Sopenharmony_ci        PFN_vkEnumeratePhysicalDeviceGroupsKHR vkEnumeratePhysicalDeviceGroupsKHR = inst.load("vkEnumeratePhysicalDeviceGroupsKHR");
19325db71995Sopenharmony_ci
19335db71995Sopenharmony_ci        uint32_t group_count = static_cast<uint32_t>(driver.physical_device_groups.size());
19345db71995Sopenharmony_ci        uint32_t returned_group_count = 0;
19355db71995Sopenharmony_ci        ASSERT_EQ(VK_SUCCESS, vkEnumeratePhysicalDeviceGroupsKHR(inst, &returned_group_count, nullptr));
19365db71995Sopenharmony_ci        ASSERT_EQ(group_count, returned_group_count);
19375db71995Sopenharmony_ci
19385db71995Sopenharmony_ci        returned_group_count = 1;
19395db71995Sopenharmony_ci        std::array<VkPhysicalDeviceGroupProperties, 1> group_props{};
19405db71995Sopenharmony_ci        group_props[0].sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GROUP_PROPERTIES;
19415db71995Sopenharmony_ci        ASSERT_EQ(VK_INCOMPLETE, vkEnumeratePhysicalDeviceGroupsKHR(inst, &returned_group_count, group_props.data()));
19425db71995Sopenharmony_ci        ASSERT_EQ(1U, returned_group_count);
19435db71995Sopenharmony_ci
19445db71995Sopenharmony_ci        returned_group_count = 2;
19455db71995Sopenharmony_ci        std::array<VkPhysicalDeviceGroupProperties, 2> group_props_2{};
19465db71995Sopenharmony_ci        group_props_2[0].sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GROUP_PROPERTIES;
19475db71995Sopenharmony_ci        group_props_2[1].sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GROUP_PROPERTIES;
19485db71995Sopenharmony_ci        ASSERT_EQ(VK_SUCCESS, vkEnumeratePhysicalDeviceGroupsKHR(inst, &returned_group_count, group_props_2.data()));
19495db71995Sopenharmony_ci        ASSERT_EQ(2U, returned_group_count);
19505db71995Sopenharmony_ci
19515db71995Sopenharmony_ci        // Make sure the incomplete group items appear in the complete group
19525db71995Sopenharmony_ci        for (uint32_t inc_group = 0; inc_group < 1; ++inc_group) {
19535db71995Sopenharmony_ci            bool found = false;
19545db71995Sopenharmony_ci            for (uint32_t full_group = 0; full_group < 2; ++full_group) {
19555db71995Sopenharmony_ci                if (group_props[inc_group].physicalDeviceCount == group_props_2[full_group].physicalDeviceCount &&
19565db71995Sopenharmony_ci                    group_props[inc_group].physicalDevices[0] == group_props_2[full_group].physicalDevices[0] &&
19575db71995Sopenharmony_ci                    group_props[inc_group].physicalDevices[1] == group_props_2[full_group].physicalDevices[1]) {
19585db71995Sopenharmony_ci                    found = true;
19595db71995Sopenharmony_ci                    break;
19605db71995Sopenharmony_ci                }
19615db71995Sopenharmony_ci            }
19625db71995Sopenharmony_ci            ASSERT_EQ(true, found);
19635db71995Sopenharmony_ci        }
19645db71995Sopenharmony_ci        for (auto& group : group_props) {
19655db71995Sopenharmony_ci            VkDeviceGroupDeviceCreateInfo group_info{};
19665db71995Sopenharmony_ci            group_info.sType = VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO;
19675db71995Sopenharmony_ci            group_info.physicalDeviceCount = group.physicalDeviceCount;
19685db71995Sopenharmony_ci            group_info.pPhysicalDevices = &group.physicalDevices[0];
19695db71995Sopenharmony_ci            DeviceWrapper dev{inst};
19705db71995Sopenharmony_ci            dev.create_info.dev.pNext = &group_info;
19715db71995Sopenharmony_ci            dev.CheckCreate(group.physicalDevices[0]);
19725db71995Sopenharmony_ci        }
19735db71995Sopenharmony_ci    }
19745db71995Sopenharmony_ci}
19755db71995Sopenharmony_ci
19765db71995Sopenharmony_ci// Call the core vkEnumeratePhysicalDeviceGroups and the extension
19775db71995Sopenharmony_ci// vkEnumeratePhysicalDeviceGroupsKHR, and make sure they return the same info.
19785db71995Sopenharmony_ciTEST(EnumeratePhysicalDeviceGroups, TestCoreVersusExtensionSameReturns) {
19795db71995Sopenharmony_ci    FrameworkEnvironment env{};
19805db71995Sopenharmony_ci    auto& driver = env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2, VK_API_VERSION_1_1))
19815db71995Sopenharmony_ci                       .set_min_icd_interface_version(5)
19825db71995Sopenharmony_ci                       .set_icd_api_version(VK_API_VERSION_1_1)
19835db71995Sopenharmony_ci                       .add_instance_extension({VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME})
19845db71995Sopenharmony_ci                       .add_instance_extension({VK_KHR_DEVICE_GROUP_CREATION_EXTENSION_NAME});
19855db71995Sopenharmony_ci
19865db71995Sopenharmony_ci    // Generate the devices
19875db71995Sopenharmony_ci    for (size_t i = 0; i < 6; i++) {
19885db71995Sopenharmony_ci        driver.physical_devices.emplace_back(std::string("physical_device_") + std::to_string(i));
19895db71995Sopenharmony_ci        driver.physical_devices.back().properties.apiVersion = VK_API_VERSION_1_1;
19905db71995Sopenharmony_ci    }
19915db71995Sopenharmony_ci
19925db71995Sopenharmony_ci    // Generate the starting groups
19935db71995Sopenharmony_ci    driver.physical_device_groups.emplace_back(driver.physical_devices[0]);
19945db71995Sopenharmony_ci    driver.physical_device_groups.emplace_back(driver.physical_devices[1]);
19955db71995Sopenharmony_ci    driver.physical_device_groups.back()
19965db71995Sopenharmony_ci        .use_physical_device(driver.physical_devices[2])
19975db71995Sopenharmony_ci        .use_physical_device(driver.physical_devices[3]);
19985db71995Sopenharmony_ci    driver.physical_device_groups.emplace_back(driver.physical_devices[4]);
19995db71995Sopenharmony_ci    driver.physical_device_groups.back().use_physical_device(driver.physical_devices[5]);
20005db71995Sopenharmony_ci
20015db71995Sopenharmony_ci    uint32_t expected_counts[3] = {1, 3, 2};
20025db71995Sopenharmony_ci    uint32_t core_group_count = 0;
20035db71995Sopenharmony_ci    std::vector<VkPhysicalDeviceGroupProperties> core_group_props{};
20045db71995Sopenharmony_ci    uint32_t ext_group_count = 0;
20055db71995Sopenharmony_ci    std::vector<VkPhysicalDeviceGroupProperties> ext_group_props{};
20065db71995Sopenharmony_ci
20075db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
20085db71995Sopenharmony_ci    inst.create_info.set_api_version(1, 1, 0);
20095db71995Sopenharmony_ci    inst.create_info.add_extension("VK_KHR_device_group_creation");
20105db71995Sopenharmony_ci    inst.CheckCreate();
20115db71995Sopenharmony_ci
20125db71995Sopenharmony_ci    // Core function
20135db71995Sopenharmony_ci    core_group_count = static_cast<uint32_t>(driver.physical_device_groups.size());
20145db71995Sopenharmony_ci    uint32_t returned_group_count = 0;
20155db71995Sopenharmony_ci    ASSERT_EQ(VK_SUCCESS, inst->vkEnumeratePhysicalDeviceGroups(inst, &returned_group_count, nullptr));
20165db71995Sopenharmony_ci    ASSERT_EQ(core_group_count, returned_group_count);
20175db71995Sopenharmony_ci
20185db71995Sopenharmony_ci    core_group_props.resize(returned_group_count,
20195db71995Sopenharmony_ci                            VkPhysicalDeviceGroupProperties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GROUP_PROPERTIES});
20205db71995Sopenharmony_ci    ASSERT_EQ(VK_SUCCESS, inst->vkEnumeratePhysicalDeviceGroups(inst, &returned_group_count, core_group_props.data()));
20215db71995Sopenharmony_ci    ASSERT_EQ(core_group_count, returned_group_count);
20225db71995Sopenharmony_ci
20235db71995Sopenharmony_ci    PFN_vkEnumeratePhysicalDeviceGroupsKHR vkEnumeratePhysicalDeviceGroupsKHR = inst.load("vkEnumeratePhysicalDeviceGroupsKHR");
20245db71995Sopenharmony_ci
20255db71995Sopenharmony_ci    ext_group_count = static_cast<uint32_t>(driver.physical_device_groups.size());
20265db71995Sopenharmony_ci    returned_group_count = 0;
20275db71995Sopenharmony_ci    ASSERT_EQ(VK_SUCCESS, vkEnumeratePhysicalDeviceGroupsKHR(inst, &returned_group_count, nullptr));
20285db71995Sopenharmony_ci    ASSERT_EQ(ext_group_count, returned_group_count);
20295db71995Sopenharmony_ci
20305db71995Sopenharmony_ci    ext_group_props.resize(returned_group_count,
20315db71995Sopenharmony_ci                           VkPhysicalDeviceGroupProperties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GROUP_PROPERTIES});
20325db71995Sopenharmony_ci    ASSERT_EQ(VK_SUCCESS, vkEnumeratePhysicalDeviceGroupsKHR(inst, &returned_group_count, ext_group_props.data()));
20335db71995Sopenharmony_ci    ASSERT_EQ(ext_group_count, returned_group_count);
20345db71995Sopenharmony_ci
20355db71995Sopenharmony_ci    // Make sure data from each matches
20365db71995Sopenharmony_ci    ASSERT_EQ(core_group_count, 3U);
20375db71995Sopenharmony_ci    ASSERT_EQ(ext_group_count, 3U);
20385db71995Sopenharmony_ci    for (uint32_t group = 0; group < core_group_count; ++group) {
20395db71995Sopenharmony_ci        ASSERT_EQ(core_group_props[group].physicalDeviceCount, expected_counts[group]);
20405db71995Sopenharmony_ci        ASSERT_EQ(ext_group_props[group].physicalDeviceCount, expected_counts[group]);
20415db71995Sopenharmony_ci        for (uint32_t dev = 0; dev < core_group_props[group].physicalDeviceCount; ++dev) {
20425db71995Sopenharmony_ci            ASSERT_EQ(core_group_props[group].physicalDevices[dev], ext_group_props[group].physicalDevices[dev]);
20435db71995Sopenharmony_ci        }
20445db71995Sopenharmony_ci    }
20455db71995Sopenharmony_ci    // Make sure no physical device appears in more than one group
20465db71995Sopenharmony_ci    for (uint32_t group1 = 0; group1 < core_group_count; ++group1) {
20475db71995Sopenharmony_ci        for (uint32_t group2 = group1 + 1; group2 < core_group_count; ++group2) {
20485db71995Sopenharmony_ci            for (uint32_t dev1 = 0; dev1 < core_group_props[group1].physicalDeviceCount; ++dev1) {
20495db71995Sopenharmony_ci                for (uint32_t dev2 = 0; dev2 < core_group_props[group1].physicalDeviceCount; ++dev2) {
20505db71995Sopenharmony_ci                    ASSERT_NE(core_group_props[group1].physicalDevices[dev1], core_group_props[group2].physicalDevices[dev2]);
20515db71995Sopenharmony_ci                }
20525db71995Sopenharmony_ci            }
20535db71995Sopenharmony_ci        }
20545db71995Sopenharmony_ci    }
20555db71995Sopenharmony_ci    for (auto& group : core_group_props) {
20565db71995Sopenharmony_ci        VkDeviceGroupDeviceCreateInfo group_info{};
20575db71995Sopenharmony_ci        group_info.sType = VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO;
20585db71995Sopenharmony_ci        group_info.physicalDeviceCount = group.physicalDeviceCount;
20595db71995Sopenharmony_ci        group_info.pPhysicalDevices = &group.physicalDevices[0];
20605db71995Sopenharmony_ci        DeviceWrapper dev{inst};
20615db71995Sopenharmony_ci        dev.create_info.dev.pNext = &group_info;
20625db71995Sopenharmony_ci        dev.CheckCreate(group.physicalDevices[0]);
20635db71995Sopenharmony_ci    }
20645db71995Sopenharmony_ci}
20655db71995Sopenharmony_ci
20665db71995Sopenharmony_ci// Start with 6 devices in 3 different groups, and then add a group,
20675db71995Sopenharmony_ci// querying vkEnumeratePhysicalDeviceGroups before and after the add.
20685db71995Sopenharmony_ciTEST(EnumeratePhysicalDeviceGroups, CallThriceAddGroupInBetween) {
20695db71995Sopenharmony_ci    FrameworkEnvironment env{};
20705db71995Sopenharmony_ci    auto& driver = env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2, VK_API_VERSION_1_1))
20715db71995Sopenharmony_ci                       .set_min_icd_interface_version(5)
20725db71995Sopenharmony_ci                       .set_icd_api_version(VK_API_VERSION_1_1);
20735db71995Sopenharmony_ci
20745db71995Sopenharmony_ci    // Generate the devices
20755db71995Sopenharmony_ci    for (size_t i = 0; i < 7; i++) {
20765db71995Sopenharmony_ci        driver.physical_devices.emplace_back(std::string("physical_device_") + std::to_string(i));
20775db71995Sopenharmony_ci        driver.physical_devices.back().properties.apiVersion = VK_API_VERSION_1_1;
20785db71995Sopenharmony_ci    }
20795db71995Sopenharmony_ci
20805db71995Sopenharmony_ci    // Generate the starting groups
20815db71995Sopenharmony_ci    driver.physical_device_groups.emplace_back(driver.physical_devices[0]);
20825db71995Sopenharmony_ci    driver.physical_device_groups.emplace_back(driver.physical_devices[1]);
20835db71995Sopenharmony_ci    driver.physical_device_groups.back()
20845db71995Sopenharmony_ci        .use_physical_device(driver.physical_devices[2])
20855db71995Sopenharmony_ci        .use_physical_device(driver.physical_devices[3]);
20865db71995Sopenharmony_ci    driver.physical_device_groups.emplace_back(driver.physical_devices[4]);
20875db71995Sopenharmony_ci    driver.physical_device_groups.back().use_physical_device(driver.physical_devices[5]);
20885db71995Sopenharmony_ci
20895db71995Sopenharmony_ci    uint32_t before_expected_counts[3] = {1, 3, 2};
20905db71995Sopenharmony_ci    uint32_t after_expected_counts[4] = {1, 3, 1, 2};
20915db71995Sopenharmony_ci    uint32_t before_group_count = 3;
20925db71995Sopenharmony_ci    uint32_t after_group_count = 4;
20935db71995Sopenharmony_ci    uint32_t returned_group_count = 0;
20945db71995Sopenharmony_ci
20955db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
20965db71995Sopenharmony_ci    inst.create_info.set_api_version(1, 1, 0);
20975db71995Sopenharmony_ci    inst.CheckCreate();
20985db71995Sopenharmony_ci
20995db71995Sopenharmony_ci    std::vector<VkPhysicalDeviceGroupProperties> group_props_before{};
21005db71995Sopenharmony_ci    group_props_before.resize(before_group_count,
21015db71995Sopenharmony_ci                              VkPhysicalDeviceGroupProperties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GROUP_PROPERTIES});
21025db71995Sopenharmony_ci    returned_group_count = before_group_count;
21035db71995Sopenharmony_ci    ASSERT_EQ(VK_SUCCESS, inst->vkEnumeratePhysicalDeviceGroups(inst, &returned_group_count, group_props_before.data()));
21045db71995Sopenharmony_ci    ASSERT_EQ(before_group_count, returned_group_count);
21055db71995Sopenharmony_ci    for (uint32_t group = 0; group < before_group_count; ++group) {
21065db71995Sopenharmony_ci        ASSERT_EQ(group_props_before[group].physicalDeviceCount, before_expected_counts[group]);
21075db71995Sopenharmony_ci    }
21085db71995Sopenharmony_ci
21095db71995Sopenharmony_ci    // Insert new group after first two
21105db71995Sopenharmony_ci    driver.physical_device_groups.insert(driver.physical_device_groups.begin() + 2, driver.physical_devices[6]);
21115db71995Sopenharmony_ci
21125db71995Sopenharmony_ci    std::vector<VkPhysicalDeviceGroupProperties> group_props_after{};
21135db71995Sopenharmony_ci    group_props_after.resize(before_group_count,
21145db71995Sopenharmony_ci                             VkPhysicalDeviceGroupProperties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GROUP_PROPERTIES});
21155db71995Sopenharmony_ci    ASSERT_EQ(VK_INCOMPLETE, inst->vkEnumeratePhysicalDeviceGroups(inst, &returned_group_count, group_props_after.data()));
21165db71995Sopenharmony_ci    ASSERT_EQ(before_group_count, returned_group_count);
21175db71995Sopenharmony_ci    for (uint32_t group = 0; group < before_group_count; ++group) {
21185db71995Sopenharmony_ci        ASSERT_EQ(group_props_after[group].physicalDeviceCount, after_expected_counts[group]);
21195db71995Sopenharmony_ci    }
21205db71995Sopenharmony_ci
21215db71995Sopenharmony_ci    group_props_after.resize(after_group_count,
21225db71995Sopenharmony_ci                             VkPhysicalDeviceGroupProperties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GROUP_PROPERTIES});
21235db71995Sopenharmony_ci    returned_group_count = after_group_count;
21245db71995Sopenharmony_ci    ASSERT_EQ(VK_SUCCESS, inst->vkEnumeratePhysicalDeviceGroups(inst, &returned_group_count, group_props_after.data()));
21255db71995Sopenharmony_ci    ASSERT_EQ(after_group_count, returned_group_count);
21265db71995Sopenharmony_ci    for (uint32_t group = 0; group < after_group_count; ++group) {
21275db71995Sopenharmony_ci        ASSERT_EQ(group_props_after[group].physicalDeviceCount, after_expected_counts[group]);
21285db71995Sopenharmony_ci    }
21295db71995Sopenharmony_ci
21305db71995Sopenharmony_ci    // Make sure all devices in the old group info are still found in the new group info
21315db71995Sopenharmony_ci    for (uint32_t group1 = 0; group1 < group_props_before.size(); ++group1) {
21325db71995Sopenharmony_ci        for (uint32_t group2 = 0; group2 < group_props_after.size(); ++group2) {
21335db71995Sopenharmony_ci            if (group_props_before[group1].physicalDeviceCount == group_props_after[group2].physicalDeviceCount) {
21345db71995Sopenharmony_ci                uint32_t found_count = 0;
21355db71995Sopenharmony_ci                bool found = false;
21365db71995Sopenharmony_ci                for (uint32_t dev1 = 0; dev1 < group_props_before[group1].physicalDeviceCount; ++dev1) {
21375db71995Sopenharmony_ci                    found = false;
21385db71995Sopenharmony_ci                    for (uint32_t dev2 = 0; dev2 < group_props_after[group2].physicalDeviceCount; ++dev2) {
21395db71995Sopenharmony_ci                        if (group_props_before[group1].physicalDevices[dev1] == group_props_after[group2].physicalDevices[dev2]) {
21405db71995Sopenharmony_ci                            found_count++;
21415db71995Sopenharmony_ci                            found = true;
21425db71995Sopenharmony_ci                            break;
21435db71995Sopenharmony_ci                        }
21445db71995Sopenharmony_ci                    }
21455db71995Sopenharmony_ci                }
21465db71995Sopenharmony_ci                ASSERT_EQ(found, found_count == group_props_before[group1].physicalDeviceCount);
21475db71995Sopenharmony_ci            }
21485db71995Sopenharmony_ci        }
21495db71995Sopenharmony_ci    }
21505db71995Sopenharmony_ci    for (auto& group : group_props_after) {
21515db71995Sopenharmony_ci        VkDeviceGroupDeviceCreateInfo group_info{};
21525db71995Sopenharmony_ci        group_info.sType = VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO;
21535db71995Sopenharmony_ci        group_info.physicalDeviceCount = group.physicalDeviceCount;
21545db71995Sopenharmony_ci        group_info.pPhysicalDevices = &group.physicalDevices[0];
21555db71995Sopenharmony_ci        DeviceWrapper dev{inst};
21565db71995Sopenharmony_ci        dev.create_info.dev.pNext = &group_info;
21575db71995Sopenharmony_ci        dev.CheckCreate(group.physicalDevices[0]);
21585db71995Sopenharmony_ci    }
21595db71995Sopenharmony_ci}
21605db71995Sopenharmony_ci
21615db71995Sopenharmony_ci// Start with 7 devices in 4 different groups, and then remove a group,
21625db71995Sopenharmony_ci// querying vkEnumeratePhysicalDeviceGroups before and after the remove.
21635db71995Sopenharmony_ciTEST(EnumeratePhysicalDeviceGroups, CallTwiceRemoveGroupInBetween) {
21645db71995Sopenharmony_ci    FrameworkEnvironment env{};
21655db71995Sopenharmony_ci    auto& driver = env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2, VK_API_VERSION_1_1))
21665db71995Sopenharmony_ci                       .set_min_icd_interface_version(5)
21675db71995Sopenharmony_ci                       .set_icd_api_version(VK_API_VERSION_1_1);
21685db71995Sopenharmony_ci
21695db71995Sopenharmony_ci    // Generate the devices
21705db71995Sopenharmony_ci    for (size_t i = 0; i < 7; i++) {
21715db71995Sopenharmony_ci        driver.physical_devices.emplace_back(std::string("physical_device_") + std::to_string(i));
21725db71995Sopenharmony_ci        driver.physical_devices.back().properties.apiVersion = VK_API_VERSION_1_1;
21735db71995Sopenharmony_ci    }
21745db71995Sopenharmony_ci
21755db71995Sopenharmony_ci    // Generate the starting groups
21765db71995Sopenharmony_ci    driver.physical_device_groups.emplace_back(driver.physical_devices[0]);
21775db71995Sopenharmony_ci    driver.physical_device_groups.emplace_back(driver.physical_devices[1]);
21785db71995Sopenharmony_ci    driver.physical_device_groups.back()
21795db71995Sopenharmony_ci        .use_physical_device(driver.physical_devices[2])
21805db71995Sopenharmony_ci        .use_physical_device(driver.physical_devices[3]);
21815db71995Sopenharmony_ci    driver.physical_device_groups.emplace_back(driver.physical_devices[4]);
21825db71995Sopenharmony_ci    driver.physical_device_groups.emplace_back(driver.physical_devices[5]);
21835db71995Sopenharmony_ci    driver.physical_device_groups.back().use_physical_device(driver.physical_devices[6]);
21845db71995Sopenharmony_ci
21855db71995Sopenharmony_ci    uint32_t before_expected_counts[4] = {1, 3, 1, 2};
21865db71995Sopenharmony_ci    uint32_t after_expected_counts[3] = {1, 3, 2};
21875db71995Sopenharmony_ci    uint32_t before_group_count = 4;
21885db71995Sopenharmony_ci    uint32_t after_group_count = 3;
21895db71995Sopenharmony_ci    uint32_t returned_group_count = 0;
21905db71995Sopenharmony_ci
21915db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
21925db71995Sopenharmony_ci    inst.create_info.set_api_version(1, 1, 0);
21935db71995Sopenharmony_ci    inst.CheckCreate();
21945db71995Sopenharmony_ci
21955db71995Sopenharmony_ci    std::vector<VkPhysicalDeviceGroupProperties> group_props_before{};
21965db71995Sopenharmony_ci    group_props_before.resize(before_group_count,
21975db71995Sopenharmony_ci                              VkPhysicalDeviceGroupProperties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GROUP_PROPERTIES});
21985db71995Sopenharmony_ci    returned_group_count = before_group_count;
21995db71995Sopenharmony_ci    ASSERT_EQ(VK_SUCCESS, inst->vkEnumeratePhysicalDeviceGroups(inst, &returned_group_count, group_props_before.data()));
22005db71995Sopenharmony_ci    ASSERT_EQ(before_group_count, returned_group_count);
22015db71995Sopenharmony_ci    for (uint32_t group = 0; group < before_group_count; ++group) {
22025db71995Sopenharmony_ci        ASSERT_EQ(group_props_before[group].physicalDeviceCount, before_expected_counts[group]);
22035db71995Sopenharmony_ci    }
22045db71995Sopenharmony_ci
22055db71995Sopenharmony_ci    // Insert new group after first two
22065db71995Sopenharmony_ci    driver.physical_device_groups.erase(driver.physical_device_groups.begin() + 2);
22075db71995Sopenharmony_ci
22085db71995Sopenharmony_ci    std::vector<VkPhysicalDeviceGroupProperties> group_props_after{};
22095db71995Sopenharmony_ci    group_props_after.resize(after_group_count,
22105db71995Sopenharmony_ci                             VkPhysicalDeviceGroupProperties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GROUP_PROPERTIES});
22115db71995Sopenharmony_ci    ASSERT_EQ(VK_SUCCESS, inst->vkEnumeratePhysicalDeviceGroups(inst, &returned_group_count, group_props_after.data()));
22125db71995Sopenharmony_ci    ASSERT_EQ(after_group_count, returned_group_count);
22135db71995Sopenharmony_ci    for (uint32_t group = 0; group < after_group_count; ++group) {
22145db71995Sopenharmony_ci        ASSERT_EQ(group_props_after[group].physicalDeviceCount, after_expected_counts[group]);
22155db71995Sopenharmony_ci    }
22165db71995Sopenharmony_ci
22175db71995Sopenharmony_ci    // Make sure all devices in the new group info are found in the old group info
22185db71995Sopenharmony_ci    for (uint32_t group1 = 0; group1 < group_props_after.size(); ++group1) {
22195db71995Sopenharmony_ci        for (uint32_t group2 = 0; group2 < group_props_before.size(); ++group2) {
22205db71995Sopenharmony_ci            if (group_props_after[group1].physicalDeviceCount == group_props_before[group2].physicalDeviceCount) {
22215db71995Sopenharmony_ci                uint32_t found_count = 0;
22225db71995Sopenharmony_ci                bool found = false;
22235db71995Sopenharmony_ci                for (uint32_t dev1 = 0; dev1 < group_props_after[group1].physicalDeviceCount; ++dev1) {
22245db71995Sopenharmony_ci                    found = false;
22255db71995Sopenharmony_ci                    for (uint32_t dev2 = 0; dev2 < group_props_before[group2].physicalDeviceCount; ++dev2) {
22265db71995Sopenharmony_ci                        if (group_props_after[group1].physicalDevices[dev1] == group_props_before[group2].physicalDevices[dev2]) {
22275db71995Sopenharmony_ci                            found_count++;
22285db71995Sopenharmony_ci                            found = true;
22295db71995Sopenharmony_ci                            break;
22305db71995Sopenharmony_ci                        }
22315db71995Sopenharmony_ci                    }
22325db71995Sopenharmony_ci                }
22335db71995Sopenharmony_ci                ASSERT_EQ(found, found_count == group_props_after[group1].physicalDeviceCount);
22345db71995Sopenharmony_ci            }
22355db71995Sopenharmony_ci        }
22365db71995Sopenharmony_ci    }
22375db71995Sopenharmony_ci    for (auto& group : group_props_after) {
22385db71995Sopenharmony_ci        VkDeviceGroupDeviceCreateInfo group_info{};
22395db71995Sopenharmony_ci        group_info.sType = VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO;
22405db71995Sopenharmony_ci        group_info.physicalDeviceCount = group.physicalDeviceCount;
22415db71995Sopenharmony_ci        group_info.pPhysicalDevices = &group.physicalDevices[0];
22425db71995Sopenharmony_ci        DeviceWrapper dev{inst};
22435db71995Sopenharmony_ci        dev.create_info.dev.pNext = &group_info;
22445db71995Sopenharmony_ci        dev.CheckCreate(group.physicalDevices[0]);
22455db71995Sopenharmony_ci    }
22465db71995Sopenharmony_ci}
22475db71995Sopenharmony_ci
22485db71995Sopenharmony_ci// Start with 6 devices in 3 different groups, and then add a device to the middle group,
22495db71995Sopenharmony_ci// querying vkEnumeratePhysicalDeviceGroups before and after the add.
22505db71995Sopenharmony_ciTEST(EnumeratePhysicalDeviceGroups, CallTwiceAddDeviceInBetween) {
22515db71995Sopenharmony_ci    FrameworkEnvironment env{};
22525db71995Sopenharmony_ci    auto& driver = env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2, VK_API_VERSION_1_1))
22535db71995Sopenharmony_ci                       .set_min_icd_interface_version(5)
22545db71995Sopenharmony_ci                       .set_icd_api_version(VK_API_VERSION_1_1);
22555db71995Sopenharmony_ci
22565db71995Sopenharmony_ci    // Generate the devices
22575db71995Sopenharmony_ci    for (size_t i = 0; i < 7; i++) {
22585db71995Sopenharmony_ci        driver.physical_devices.emplace_back(std::string("physical_device_") + std::to_string(i));
22595db71995Sopenharmony_ci        driver.physical_devices.back().properties.apiVersion = VK_API_VERSION_1_1;
22605db71995Sopenharmony_ci    }
22615db71995Sopenharmony_ci
22625db71995Sopenharmony_ci    // Generate the starting groups
22635db71995Sopenharmony_ci    driver.physical_device_groups.emplace_back(driver.physical_devices[0]);
22645db71995Sopenharmony_ci    driver.physical_device_groups.emplace_back(driver.physical_devices[1]);
22655db71995Sopenharmony_ci    driver.physical_device_groups.back()
22665db71995Sopenharmony_ci        .use_physical_device(driver.physical_devices[2])
22675db71995Sopenharmony_ci        .use_physical_device(driver.physical_devices[3]);
22685db71995Sopenharmony_ci    driver.physical_device_groups.emplace_back(driver.physical_devices[4]);
22695db71995Sopenharmony_ci    driver.physical_device_groups.back().use_physical_device(driver.physical_devices[5]);
22705db71995Sopenharmony_ci
22715db71995Sopenharmony_ci    uint32_t expected_group_count = 3;
22725db71995Sopenharmony_ci    uint32_t before_expected_counts[3] = {1, 3, 2};
22735db71995Sopenharmony_ci    uint32_t after_expected_counts[3] = {1, 4, 2};
22745db71995Sopenharmony_ci    uint32_t returned_group_count = 0;
22755db71995Sopenharmony_ci
22765db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
22775db71995Sopenharmony_ci    inst.create_info.set_api_version(1, 1, 0);
22785db71995Sopenharmony_ci    inst.CheckCreate();
22795db71995Sopenharmony_ci
22805db71995Sopenharmony_ci    std::vector<VkPhysicalDeviceGroupProperties> group_props_before{};
22815db71995Sopenharmony_ci    group_props_before.resize(expected_group_count,
22825db71995Sopenharmony_ci                              VkPhysicalDeviceGroupProperties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GROUP_PROPERTIES});
22835db71995Sopenharmony_ci    returned_group_count = expected_group_count;
22845db71995Sopenharmony_ci    ASSERT_EQ(VK_SUCCESS, inst->vkEnumeratePhysicalDeviceGroups(inst, &returned_group_count, group_props_before.data()));
22855db71995Sopenharmony_ci    ASSERT_EQ(expected_group_count, returned_group_count);
22865db71995Sopenharmony_ci    for (uint32_t group = 0; group < expected_group_count; ++group) {
22875db71995Sopenharmony_ci        ASSERT_EQ(group_props_before[group].physicalDeviceCount, before_expected_counts[group]);
22885db71995Sopenharmony_ci    }
22895db71995Sopenharmony_ci
22905db71995Sopenharmony_ci    // Insert new device to 2nd group
22915db71995Sopenharmony_ci    driver.physical_device_groups[1].use_physical_device(driver.physical_devices[6]);
22925db71995Sopenharmony_ci
22935db71995Sopenharmony_ci    std::vector<VkPhysicalDeviceGroupProperties> group_props_after{};
22945db71995Sopenharmony_ci    group_props_after.resize(expected_group_count,
22955db71995Sopenharmony_ci                             VkPhysicalDeviceGroupProperties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GROUP_PROPERTIES});
22965db71995Sopenharmony_ci    ASSERT_EQ(VK_SUCCESS, inst->vkEnumeratePhysicalDeviceGroups(inst, &returned_group_count, group_props_after.data()));
22975db71995Sopenharmony_ci    ASSERT_EQ(expected_group_count, returned_group_count);
22985db71995Sopenharmony_ci    for (uint32_t group = 0; group < expected_group_count; ++group) {
22995db71995Sopenharmony_ci        ASSERT_EQ(group_props_after[group].physicalDeviceCount, after_expected_counts[group]);
23005db71995Sopenharmony_ci    }
23015db71995Sopenharmony_ci
23025db71995Sopenharmony_ci    // Make sure all devices in the old group info are still found in the new group info
23035db71995Sopenharmony_ci    for (uint32_t group1 = 0; group1 < group_props_before.size(); ++group1) {
23045db71995Sopenharmony_ci        for (uint32_t group2 = 0; group2 < group_props_after.size(); ++group2) {
23055db71995Sopenharmony_ci            uint32_t found_count = 0;
23065db71995Sopenharmony_ci            bool found = false;
23075db71995Sopenharmony_ci            for (uint32_t dev1 = 0; dev1 < group_props_before[group1].physicalDeviceCount; ++dev1) {
23085db71995Sopenharmony_ci                found = false;
23095db71995Sopenharmony_ci                for (uint32_t dev2 = 0; dev2 < group_props_after[group2].physicalDeviceCount; ++dev2) {
23105db71995Sopenharmony_ci                    if (group_props_before[group1].physicalDevices[dev1] == group_props_after[group2].physicalDevices[dev2]) {
23115db71995Sopenharmony_ci                        found_count++;
23125db71995Sopenharmony_ci                        found = true;
23135db71995Sopenharmony_ci                        break;
23145db71995Sopenharmony_ci                    }
23155db71995Sopenharmony_ci                }
23165db71995Sopenharmony_ci            }
23175db71995Sopenharmony_ci            ASSERT_EQ(found, found_count != 0 && found_count == before_expected_counts[group1]);
23185db71995Sopenharmony_ci            if (found) {
23195db71995Sopenharmony_ci                break;
23205db71995Sopenharmony_ci            }
23215db71995Sopenharmony_ci        }
23225db71995Sopenharmony_ci    }
23235db71995Sopenharmony_ci    for (auto& group : group_props_after) {
23245db71995Sopenharmony_ci        VkDeviceGroupDeviceCreateInfo group_info{};
23255db71995Sopenharmony_ci        group_info.sType = VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO;
23265db71995Sopenharmony_ci        group_info.physicalDeviceCount = group.physicalDeviceCount;
23275db71995Sopenharmony_ci        group_info.pPhysicalDevices = &group.physicalDevices[0];
23285db71995Sopenharmony_ci        DeviceWrapper dev{inst};
23295db71995Sopenharmony_ci        dev.create_info.dev.pNext = &group_info;
23305db71995Sopenharmony_ci        dev.CheckCreate(group.physicalDevices[0]);
23315db71995Sopenharmony_ci    }
23325db71995Sopenharmony_ci}
23335db71995Sopenharmony_ci
23345db71995Sopenharmony_ci// Start with 6 devices in 3 different groups, and then remove a device to the middle group,
23355db71995Sopenharmony_ci// querying vkEnumeratePhysicalDeviceGroups before and after the remove.
23365db71995Sopenharmony_ciTEST(EnumeratePhysicalDeviceGroups, CallTwiceRemoveDeviceInBetween) {
23375db71995Sopenharmony_ci    FrameworkEnvironment env{};
23385db71995Sopenharmony_ci    auto& driver = env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2, VK_API_VERSION_1_1))
23395db71995Sopenharmony_ci                       .set_min_icd_interface_version(5)
23405db71995Sopenharmony_ci                       .set_icd_api_version(VK_API_VERSION_1_1);
23415db71995Sopenharmony_ci
23425db71995Sopenharmony_ci    // Generate the devices
23435db71995Sopenharmony_ci    for (size_t i = 0; i < 6; i++) {
23445db71995Sopenharmony_ci        driver.physical_devices.emplace_back(std::string("physical_device_") + std::to_string(i));
23455db71995Sopenharmony_ci        driver.physical_devices.back().properties.apiVersion = VK_API_VERSION_1_1;
23465db71995Sopenharmony_ci    }
23475db71995Sopenharmony_ci
23485db71995Sopenharmony_ci    // Generate the starting groups
23495db71995Sopenharmony_ci    driver.physical_device_groups.emplace_back(driver.physical_devices[0]);
23505db71995Sopenharmony_ci    driver.physical_device_groups.emplace_back(driver.physical_devices[1]);
23515db71995Sopenharmony_ci    driver.physical_device_groups.back()
23525db71995Sopenharmony_ci        .use_physical_device(driver.physical_devices[2])
23535db71995Sopenharmony_ci        .use_physical_device(driver.physical_devices[3]);
23545db71995Sopenharmony_ci    driver.physical_device_groups.emplace_back(driver.physical_devices[4]);
23555db71995Sopenharmony_ci    driver.physical_device_groups.back().use_physical_device(driver.physical_devices[5]);
23565db71995Sopenharmony_ci
23575db71995Sopenharmony_ci    uint32_t before_expected_counts[3] = {1, 3, 2};
23585db71995Sopenharmony_ci    uint32_t after_expected_counts[3] = {1, 2, 2};
23595db71995Sopenharmony_ci    uint32_t expected_group_count = 3;
23605db71995Sopenharmony_ci    uint32_t returned_group_count = 0;
23615db71995Sopenharmony_ci
23625db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
23635db71995Sopenharmony_ci    inst.create_info.set_api_version(1, 1, 0);
23645db71995Sopenharmony_ci    inst.CheckCreate();
23655db71995Sopenharmony_ci
23665db71995Sopenharmony_ci    std::vector<VkPhysicalDeviceGroupProperties> group_props_before{};
23675db71995Sopenharmony_ci    group_props_before.resize(expected_group_count,
23685db71995Sopenharmony_ci                              VkPhysicalDeviceGroupProperties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GROUP_PROPERTIES});
23695db71995Sopenharmony_ci    returned_group_count = expected_group_count;
23705db71995Sopenharmony_ci    ASSERT_EQ(VK_SUCCESS, inst->vkEnumeratePhysicalDeviceGroups(inst, &returned_group_count, group_props_before.data()));
23715db71995Sopenharmony_ci    ASSERT_EQ(expected_group_count, returned_group_count);
23725db71995Sopenharmony_ci    printf("Before:\n");
23735db71995Sopenharmony_ci    for (uint32_t group = 0; group < expected_group_count; ++group) {
23745db71995Sopenharmony_ci        printf("  Group %u:\n", group);
23755db71995Sopenharmony_ci        ASSERT_EQ(group_props_before[group].physicalDeviceCount, before_expected_counts[group]);
23765db71995Sopenharmony_ci        for (uint32_t dev = 0; dev < group_props_before[group].physicalDeviceCount; ++dev) {
23775db71995Sopenharmony_ci            printf("    Dev %u: %p\n", dev, group_props_before[group].physicalDevices[dev]);
23785db71995Sopenharmony_ci        }
23795db71995Sopenharmony_ci    }
23805db71995Sopenharmony_ci
23815db71995Sopenharmony_ci    // Remove middle device in middle group
23825db71995Sopenharmony_ci    driver.physical_device_groups[1].physical_device_handles.erase(
23835db71995Sopenharmony_ci        driver.physical_device_groups[1].physical_device_handles.begin() + 1);
23845db71995Sopenharmony_ci
23855db71995Sopenharmony_ci    std::vector<VkPhysicalDeviceGroupProperties> group_props_after{};
23865db71995Sopenharmony_ci    group_props_after.resize(expected_group_count,
23875db71995Sopenharmony_ci                             VkPhysicalDeviceGroupProperties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GROUP_PROPERTIES});
23885db71995Sopenharmony_ci    ASSERT_EQ(VK_SUCCESS, inst->vkEnumeratePhysicalDeviceGroups(inst, &returned_group_count, group_props_after.data()));
23895db71995Sopenharmony_ci    ASSERT_EQ(expected_group_count, returned_group_count);
23905db71995Sopenharmony_ci    printf("After:\n");
23915db71995Sopenharmony_ci    for (uint32_t group = 0; group < expected_group_count; ++group) {
23925db71995Sopenharmony_ci        printf("  Group %u:\n", group);
23935db71995Sopenharmony_ci        ASSERT_EQ(group_props_after[group].physicalDeviceCount, after_expected_counts[group]);
23945db71995Sopenharmony_ci        for (uint32_t dev = 0; dev < group_props_after[group].physicalDeviceCount; ++dev) {
23955db71995Sopenharmony_ci            printf("    Dev %u: %p\n", dev, group_props_after[group].physicalDevices[dev]);
23965db71995Sopenharmony_ci        }
23975db71995Sopenharmony_ci    }
23985db71995Sopenharmony_ci
23995db71995Sopenharmony_ci    // Make sure all devices in the new group info are found in the old group info
24005db71995Sopenharmony_ci    for (uint32_t group1 = 0; group1 < group_props_after.size(); ++group1) {
24015db71995Sopenharmony_ci        for (uint32_t group2 = 0; group2 < group_props_before.size(); ++group2) {
24025db71995Sopenharmony_ci            uint32_t found_count = 0;
24035db71995Sopenharmony_ci            bool found = false;
24045db71995Sopenharmony_ci            for (uint32_t dev1 = 0; dev1 < group_props_after[group1].physicalDeviceCount; ++dev1) {
24055db71995Sopenharmony_ci                found = false;
24065db71995Sopenharmony_ci                for (uint32_t dev2 = 0; dev2 < group_props_before[group2].physicalDeviceCount; ++dev2) {
24075db71995Sopenharmony_ci                    if (group_props_after[group1].physicalDevices[dev1] == group_props_before[group2].physicalDevices[dev2]) {
24085db71995Sopenharmony_ci                        found_count++;
24095db71995Sopenharmony_ci                        found = true;
24105db71995Sopenharmony_ci                        break;
24115db71995Sopenharmony_ci                    }
24125db71995Sopenharmony_ci                }
24135db71995Sopenharmony_ci            }
24145db71995Sopenharmony_ci            ASSERT_EQ(found, found_count != 0 && found_count == after_expected_counts[group1]);
24155db71995Sopenharmony_ci            if (found) {
24165db71995Sopenharmony_ci                break;
24175db71995Sopenharmony_ci            }
24185db71995Sopenharmony_ci        }
24195db71995Sopenharmony_ci    }
24205db71995Sopenharmony_ci    for (auto& group : group_props_after) {
24215db71995Sopenharmony_ci        VkDeviceGroupDeviceCreateInfo group_info{};
24225db71995Sopenharmony_ci        group_info.sType = VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO;
24235db71995Sopenharmony_ci        group_info.physicalDeviceCount = group.physicalDeviceCount;
24245db71995Sopenharmony_ci        group_info.pPhysicalDevices = &group.physicalDevices[0];
24255db71995Sopenharmony_ci        DeviceWrapper dev{inst};
24265db71995Sopenharmony_ci        dev.create_info.dev.pNext = &group_info;
24275db71995Sopenharmony_ci        dev.CheckCreate(group.physicalDevices[0]);
24285db71995Sopenharmony_ci    }
24295db71995Sopenharmony_ci}
24305db71995Sopenharmony_ci
24315db71995Sopenharmony_ci// Start with 9 devices but only some in 3 different groups, add and remove
24325db71995Sopenharmony_ci// various devices and groups while querying in between.
24335db71995Sopenharmony_ciTEST(EnumeratePhysicalDeviceGroups, MultipleAddRemoves) {
24345db71995Sopenharmony_ci    FrameworkEnvironment env{};
24355db71995Sopenharmony_ci    auto& driver = env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2, VK_API_VERSION_1_1))
24365db71995Sopenharmony_ci                       .set_min_icd_interface_version(5)
24375db71995Sopenharmony_ci                       .set_icd_api_version(VK_API_VERSION_1_1);
24385db71995Sopenharmony_ci
24395db71995Sopenharmony_ci    // Generate the devices
24405db71995Sopenharmony_ci    for (size_t i = 0; i < 9; i++) {
24415db71995Sopenharmony_ci        driver.physical_devices.emplace_back(std::string("physical_device_") + std::to_string(i));
24425db71995Sopenharmony_ci        driver.physical_devices.back().properties.apiVersion = VK_API_VERSION_1_1;
24435db71995Sopenharmony_ci    }
24445db71995Sopenharmony_ci
24455db71995Sopenharmony_ci    // Generate the starting groups
24465db71995Sopenharmony_ci    driver.physical_device_groups.emplace_back(driver.physical_devices[0]);
24475db71995Sopenharmony_ci    driver.physical_device_groups.emplace_back(driver.physical_devices[1]);
24485db71995Sopenharmony_ci    driver.physical_device_groups.back()
24495db71995Sopenharmony_ci        .use_physical_device(driver.physical_devices[2])
24505db71995Sopenharmony_ci        .use_physical_device(driver.physical_devices[3]);
24515db71995Sopenharmony_ci    driver.physical_device_groups.emplace_back(driver.physical_devices[4]);
24525db71995Sopenharmony_ci    driver.physical_device_groups.back().use_physical_device(driver.physical_devices[5]);
24535db71995Sopenharmony_ci
24545db71995Sopenharmony_ci    uint32_t before_expected_counts[3] = {1, 3, 2};
24555db71995Sopenharmony_ci    uint32_t after_add_group_expected_counts[4] = {1, 3, 1, 2};
24565db71995Sopenharmony_ci    uint32_t after_remove_dev_expected_counts[4] = {1, 2, 1, 2};
24575db71995Sopenharmony_ci    uint32_t after_remove_group_expected_counts[3] = {2, 1, 2};
24585db71995Sopenharmony_ci    uint32_t after_add_dev_expected_counts[3] = {2, 1, 4};
24595db71995Sopenharmony_ci    uint32_t before_group_count = 3;
24605db71995Sopenharmony_ci    uint32_t after_group_count = 4;
24615db71995Sopenharmony_ci    uint32_t returned_group_count = 0;
24625db71995Sopenharmony_ci
24635db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
24645db71995Sopenharmony_ci    inst.create_info.set_api_version(1, 1, 0);
24655db71995Sopenharmony_ci    inst.CheckCreate();
24665db71995Sopenharmony_ci
24675db71995Sopenharmony_ci    // Should be: 3 Groups { { 0 }, { 1, 2, 3 }, { 4, 5 } }
24685db71995Sopenharmony_ci    std::vector<VkPhysicalDeviceGroupProperties> group_props_before{};
24695db71995Sopenharmony_ci    group_props_before.resize(before_group_count,
24705db71995Sopenharmony_ci                              VkPhysicalDeviceGroupProperties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GROUP_PROPERTIES});
24715db71995Sopenharmony_ci    returned_group_count = before_group_count;
24725db71995Sopenharmony_ci    ASSERT_EQ(VK_SUCCESS, inst->vkEnumeratePhysicalDeviceGroups(inst, &returned_group_count, group_props_before.data()));
24735db71995Sopenharmony_ci    ASSERT_EQ(before_group_count, returned_group_count);
24745db71995Sopenharmony_ci    for (uint32_t group = 0; group < before_group_count; ++group) {
24755db71995Sopenharmony_ci        ASSERT_EQ(group_props_before[group].physicalDeviceCount, before_expected_counts[group]);
24765db71995Sopenharmony_ci    }
24775db71995Sopenharmony_ci
24785db71995Sopenharmony_ci    // Insert new group after first two
24795db71995Sopenharmony_ci    driver.physical_device_groups.insert(driver.physical_device_groups.begin() + 2, driver.physical_devices[6]);
24805db71995Sopenharmony_ci
24815db71995Sopenharmony_ci    // Should be: 4 Groups { { 0 }, { 1, 2, 3 }, { 6 }, { 4, 5 } }
24825db71995Sopenharmony_ci    std::vector<VkPhysicalDeviceGroupProperties> group_props_after_add_group{};
24835db71995Sopenharmony_ci    group_props_after_add_group.resize(after_group_count,
24845db71995Sopenharmony_ci                                       VkPhysicalDeviceGroupProperties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GROUP_PROPERTIES});
24855db71995Sopenharmony_ci    returned_group_count = after_group_count;
24865db71995Sopenharmony_ci    ASSERT_EQ(VK_SUCCESS, inst->vkEnumeratePhysicalDeviceGroups(inst, &returned_group_count, group_props_after_add_group.data()));
24875db71995Sopenharmony_ci    ASSERT_EQ(after_group_count, returned_group_count);
24885db71995Sopenharmony_ci    for (uint32_t group = 0; group < before_group_count; ++group) {
24895db71995Sopenharmony_ci        ASSERT_EQ(group_props_after_add_group[group].physicalDeviceCount, after_add_group_expected_counts[group]);
24905db71995Sopenharmony_ci    }
24915db71995Sopenharmony_ci
24925db71995Sopenharmony_ci    // Remove first device in 2nd group
24935db71995Sopenharmony_ci    driver.physical_device_groups[1].physical_device_handles.erase(
24945db71995Sopenharmony_ci        driver.physical_device_groups[1].physical_device_handles.begin());
24955db71995Sopenharmony_ci
24965db71995Sopenharmony_ci    // Should be: 4 Groups { { 0 }, { 2, 3 }, { 6 }, { 4, 5 } }
24975db71995Sopenharmony_ci    std::vector<VkPhysicalDeviceGroupProperties> group_props_after_remove_device{};
24985db71995Sopenharmony_ci    group_props_after_remove_device.resize(after_group_count,
24995db71995Sopenharmony_ci                                           VkPhysicalDeviceGroupProperties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GROUP_PROPERTIES});
25005db71995Sopenharmony_ci    returned_group_count = after_group_count;
25015db71995Sopenharmony_ci    ASSERT_EQ(VK_SUCCESS,
25025db71995Sopenharmony_ci              inst->vkEnumeratePhysicalDeviceGroups(inst, &returned_group_count, group_props_after_remove_device.data()));
25035db71995Sopenharmony_ci    ASSERT_EQ(after_group_count, returned_group_count);
25045db71995Sopenharmony_ci    for (uint32_t group = 0; group < before_group_count; ++group) {
25055db71995Sopenharmony_ci        ASSERT_EQ(group_props_after_remove_device[group].physicalDeviceCount, after_remove_dev_expected_counts[group]);
25065db71995Sopenharmony_ci    }
25075db71995Sopenharmony_ci
25085db71995Sopenharmony_ci    // Remove first group
25095db71995Sopenharmony_ci    driver.physical_device_groups.erase(driver.physical_device_groups.begin());
25105db71995Sopenharmony_ci
25115db71995Sopenharmony_ci    // Should be: 3 Groups { { 2, 3 }, { 6 }, { 4, 5 } }
25125db71995Sopenharmony_ci    std::vector<VkPhysicalDeviceGroupProperties> group_props_after_remove_group{};
25135db71995Sopenharmony_ci    group_props_after_remove_group.resize(before_group_count,
25145db71995Sopenharmony_ci                                          VkPhysicalDeviceGroupProperties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GROUP_PROPERTIES});
25155db71995Sopenharmony_ci    returned_group_count = before_group_count;
25165db71995Sopenharmony_ci    ASSERT_EQ(VK_SUCCESS,
25175db71995Sopenharmony_ci              inst->vkEnumeratePhysicalDeviceGroups(inst, &returned_group_count, group_props_after_remove_group.data()));
25185db71995Sopenharmony_ci    ASSERT_EQ(before_group_count, returned_group_count);
25195db71995Sopenharmony_ci    for (uint32_t group = 0; group < before_group_count; ++group) {
25205db71995Sopenharmony_ci        ASSERT_EQ(group_props_after_remove_group[group].physicalDeviceCount, after_remove_group_expected_counts[group]);
25215db71995Sopenharmony_ci    }
25225db71995Sopenharmony_ci
25235db71995Sopenharmony_ci    // Add two devices to last group
25245db71995Sopenharmony_ci    driver.physical_device_groups.back()
25255db71995Sopenharmony_ci        .use_physical_device(driver.physical_devices[7])
25265db71995Sopenharmony_ci        .use_physical_device(driver.physical_devices[8]);
25275db71995Sopenharmony_ci
25285db71995Sopenharmony_ci    // Should be: 3 Groups { { 2, 3 }, { 6 }, { 4, 5, 7, 8 } }
25295db71995Sopenharmony_ci    std::vector<VkPhysicalDeviceGroupProperties> group_props_after_add_device{};
25305db71995Sopenharmony_ci    group_props_after_add_device.resize(before_group_count,
25315db71995Sopenharmony_ci                                        VkPhysicalDeviceGroupProperties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GROUP_PROPERTIES});
25325db71995Sopenharmony_ci    returned_group_count = before_group_count;
25335db71995Sopenharmony_ci    ASSERT_EQ(VK_SUCCESS, inst->vkEnumeratePhysicalDeviceGroups(inst, &returned_group_count, group_props_after_add_device.data()));
25345db71995Sopenharmony_ci    ASSERT_EQ(before_group_count, returned_group_count);
25355db71995Sopenharmony_ci    for (uint32_t group = 0; group < before_group_count; ++group) {
25365db71995Sopenharmony_ci        ASSERT_EQ(group_props_after_add_device[group].physicalDeviceCount, after_add_dev_expected_counts[group]);
25375db71995Sopenharmony_ci    }
25385db71995Sopenharmony_ci    for (auto& group : group_props_after_add_device) {
25395db71995Sopenharmony_ci        VkDeviceGroupDeviceCreateInfo group_info{};
25405db71995Sopenharmony_ci        group_info.sType = VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO;
25415db71995Sopenharmony_ci        group_info.physicalDeviceCount = group.physicalDeviceCount;
25425db71995Sopenharmony_ci        group_info.pPhysicalDevices = &group.physicalDevices[0];
25435db71995Sopenharmony_ci        DeviceWrapper dev{inst};
25445db71995Sopenharmony_ci        dev.create_info.dev.pNext = &group_info;
25455db71995Sopenharmony_ci        dev.CheckCreate(group.physicalDevices[0]);
25465db71995Sopenharmony_ci    }
25475db71995Sopenharmony_ci}
25485db71995Sopenharmony_ci
25495db71995Sopenharmony_ci// Fill in random but valid data into the device properties struct for the current physical device
25505db71995Sopenharmony_civoid FillInRandomDeviceProps(VkPhysicalDeviceProperties& props, VkPhysicalDeviceType dev_type, uint32_t api_vers, uint32_t vendor,
25515db71995Sopenharmony_ci                             uint32_t device) {
25525db71995Sopenharmony_ci    props.apiVersion = api_vers;
25535db71995Sopenharmony_ci    props.vendorID = vendor;
25545db71995Sopenharmony_ci    props.deviceID = device;
25555db71995Sopenharmony_ci    props.deviceType = dev_type;
25565db71995Sopenharmony_ci    for (uint8_t idx = 0; idx < VK_UUID_SIZE; ++idx) {
25575db71995Sopenharmony_ci        props.pipelineCacheUUID[idx] = static_cast<uint8_t>(rand() % 255);
25585db71995Sopenharmony_ci    }
25595db71995Sopenharmony_ci}
25605db71995Sopenharmony_ci
25615db71995Sopenharmony_ci// Pass in a PNext that the fake ICD will fill in some data for.
25625db71995Sopenharmony_ciTEST(EnumeratePhysicalDeviceGroups, FakePNext) {
25635db71995Sopenharmony_ci    FrameworkEnvironment env{};
25645db71995Sopenharmony_ci
25655db71995Sopenharmony_ci    // ICD 0: Vulkan 1.1
25665db71995Sopenharmony_ci    //   PhysDev 0: pd0, Discrete, Vulkan 1.1, Bus 7
25675db71995Sopenharmony_ci    //   PhysDev 1: pd1, Integrated, Vulkan 1.1, Bus 3
25685db71995Sopenharmony_ci    //   PhysDev 2: pd2, Discrete, Vulkan 1.1, Bus 6
25695db71995Sopenharmony_ci    //   Group 0: PhysDev 0, PhysDev 2
25705db71995Sopenharmony_ci    //   Group 1: PhysDev 1
25715db71995Sopenharmony_ci    // ICD 1: Vulkan 1.1
25725db71995Sopenharmony_ci    //   PhysDev 4: pd4, Discrete, Vulkan 1.1, Bus 1
25735db71995Sopenharmony_ci    //   PhysDev 5: pd5, Discrete, Vulkan 1.1, Bus 4
25745db71995Sopenharmony_ci    //   PhysDev 6: pd6, Discrete, Vulkan 1.1, Bus 2
25755db71995Sopenharmony_ci    //   Group 0: PhysDev 5, PhysDev 6
25765db71995Sopenharmony_ci    //   Group 1: PhysDev 4
25775db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA, VK_API_VERSION_1_1));
25785db71995Sopenharmony_ci    auto& cur_icd_0 = env.get_test_icd(0);
25795db71995Sopenharmony_ci    cur_icd_0.set_icd_api_version(VK_API_VERSION_1_1);
25805db71995Sopenharmony_ci    cur_icd_0.physical_devices.push_back({"pd0"});
25815db71995Sopenharmony_ci    cur_icd_0.physical_devices.back().extensions.push_back({VK_EXT_PCI_BUS_INFO_EXTENSION_NAME, 0});
25825db71995Sopenharmony_ci    FillInRandomDeviceProps(cur_icd_0.physical_devices.back().properties, VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU, VK_API_VERSION_1_1,
25835db71995Sopenharmony_ci                            888, 0xAAA001);
25845db71995Sopenharmony_ci    cur_icd_0.physical_devices.push_back({"pd1"});
25855db71995Sopenharmony_ci    cur_icd_0.physical_devices.back().extensions.push_back({VK_EXT_PCI_BUS_INFO_EXTENSION_NAME, 0});
25865db71995Sopenharmony_ci    FillInRandomDeviceProps(cur_icd_0.physical_devices.back().properties, VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU,
25875db71995Sopenharmony_ci                            VK_API_VERSION_1_1, 888, 0xAAA002);
25885db71995Sopenharmony_ci    cur_icd_0.physical_devices.push_back({"pd2"});
25895db71995Sopenharmony_ci    cur_icd_0.physical_devices.back().extensions.push_back({VK_EXT_PCI_BUS_INFO_EXTENSION_NAME, 0});
25905db71995Sopenharmony_ci    FillInRandomDeviceProps(cur_icd_0.physical_devices.back().properties, VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU, VK_API_VERSION_1_1,
25915db71995Sopenharmony_ci                            888, 0xAAA003);
25925db71995Sopenharmony_ci    cur_icd_0.physical_device_groups.push_back({});
25935db71995Sopenharmony_ci    cur_icd_0.physical_device_groups.back()
25945db71995Sopenharmony_ci        .use_physical_device(cur_icd_0.physical_devices[0])
25955db71995Sopenharmony_ci        .use_physical_device(cur_icd_0.physical_devices[2]);
25965db71995Sopenharmony_ci    cur_icd_0.physical_device_groups.push_back({cur_icd_0.physical_devices[1]});
25975db71995Sopenharmony_ci
25985db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA, VK_API_VERSION_1_1));
25995db71995Sopenharmony_ci    auto& cur_icd_1 = env.get_test_icd(1);
26005db71995Sopenharmony_ci    cur_icd_1.set_icd_api_version(VK_API_VERSION_1_1);
26015db71995Sopenharmony_ci    cur_icd_1.physical_devices.push_back({"pd4"});
26025db71995Sopenharmony_ci    cur_icd_1.physical_devices.back().extensions.push_back({VK_EXT_PCI_BUS_INFO_EXTENSION_NAME, 0});
26035db71995Sopenharmony_ci    FillInRandomDeviceProps(cur_icd_1.physical_devices.back().properties, VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU, VK_API_VERSION_1_1,
26045db71995Sopenharmony_ci                            75, 0xCCCC001);
26055db71995Sopenharmony_ci    cur_icd_1.physical_devices.push_back({"pd5"});
26065db71995Sopenharmony_ci    cur_icd_1.physical_devices.back().extensions.push_back({VK_EXT_PCI_BUS_INFO_EXTENSION_NAME, 0});
26075db71995Sopenharmony_ci    FillInRandomDeviceProps(cur_icd_1.physical_devices.back().properties, VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU, VK_API_VERSION_1_1,
26085db71995Sopenharmony_ci                            75, 0xCCCC002);
26095db71995Sopenharmony_ci    cur_icd_1.physical_devices.push_back({"pd6"});
26105db71995Sopenharmony_ci    cur_icd_1.physical_devices.back().extensions.push_back({VK_EXT_PCI_BUS_INFO_EXTENSION_NAME, 0});
26115db71995Sopenharmony_ci    FillInRandomDeviceProps(cur_icd_1.physical_devices.back().properties, VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU, VK_API_VERSION_1_1,
26125db71995Sopenharmony_ci                            75, 0xCCCC003);
26135db71995Sopenharmony_ci    cur_icd_1.physical_device_groups.push_back({});
26145db71995Sopenharmony_ci    cur_icd_1.physical_device_groups.back()
26155db71995Sopenharmony_ci        .use_physical_device(cur_icd_1.physical_devices[1])
26165db71995Sopenharmony_ci        .use_physical_device(cur_icd_1.physical_devices[2]);
26175db71995Sopenharmony_ci    cur_icd_1.physical_device_groups.push_back({cur_icd_1.physical_devices[0]});
26185db71995Sopenharmony_ci
26195db71995Sopenharmony_ci    InstWrapper inst(env.vulkan_functions);
26205db71995Sopenharmony_ci    inst.create_info.set_api_version(VK_API_VERSION_1_1);
26215db71995Sopenharmony_ci    inst.CheckCreate();
26225db71995Sopenharmony_ci
26235db71995Sopenharmony_ci    PFN_vkGetPhysicalDeviceProperties2 GetPhysDevProps2 = inst.load("vkGetPhysicalDeviceProperties2");
26245db71995Sopenharmony_ci    ASSERT_NE(GetPhysDevProps2, nullptr);
26255db71995Sopenharmony_ci
26265db71995Sopenharmony_ci    // NOTE: This is a fake struct to make sure the pNext chain is properly passed down to the ICD
26275db71995Sopenharmony_ci    //       vkEnumeratePhysicalDeviceGroups.
26285db71995Sopenharmony_ci    //       The two versions must match:
26295db71995Sopenharmony_ci    //           "FakePNext" test in loader_regression_tests.cpp
26305db71995Sopenharmony_ci    //           "test_vkEnumeratePhysicalDeviceGroups" in test_icd.cpp
26315db71995Sopenharmony_ci    struct FakePnextSharedWithICD {
26325db71995Sopenharmony_ci        VkStructureType sType;
26335db71995Sopenharmony_ci        void* pNext;
26345db71995Sopenharmony_ci        uint32_t value;
26355db71995Sopenharmony_ci    };
26365db71995Sopenharmony_ci
26375db71995Sopenharmony_ci    const uint32_t max_phys_dev_groups = 4;
26385db71995Sopenharmony_ci    uint32_t group_count = max_phys_dev_groups;
26395db71995Sopenharmony_ci    std::array<FakePnextSharedWithICD, max_phys_dev_groups> fake_structs;
26405db71995Sopenharmony_ci    std::array<VkPhysicalDeviceGroupProperties, max_phys_dev_groups> physical_device_groups{};
26415db71995Sopenharmony_ci    for (uint32_t group = 0; group < max_phys_dev_groups; ++group) {
26425db71995Sopenharmony_ci        physical_device_groups[group].sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GROUP_PROPERTIES;
26435db71995Sopenharmony_ci        fake_structs[group].sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_PROPERTIES_EXT;
26445db71995Sopenharmony_ci        physical_device_groups[group].pNext = &fake_structs[group];
26455db71995Sopenharmony_ci    }
26465db71995Sopenharmony_ci    ASSERT_EQ(VK_SUCCESS, inst->vkEnumeratePhysicalDeviceGroups(inst, &group_count, physical_device_groups.data()));
26475db71995Sopenharmony_ci    ASSERT_EQ(group_count, max_phys_dev_groups);
26485db71995Sopenharmony_ci
26495db71995Sopenharmony_ci    // Value should get written to 0xDECAFBADD by the fake ICD
26505db71995Sopenharmony_ci    for (uint32_t group = 0; group < max_phys_dev_groups; ++group) {
26515db71995Sopenharmony_ci        ASSERT_EQ(fake_structs[group].value, 0xDECAFBAD);
26525db71995Sopenharmony_ci    }
26535db71995Sopenharmony_ci}
26545db71995Sopenharmony_ci
26555db71995Sopenharmony_ciTEST(ExtensionManual, ToolingProperties) {
26565db71995Sopenharmony_ci    VkPhysicalDeviceToolPropertiesEXT icd_tool_props{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TOOL_PROPERTIES_EXT,
26575db71995Sopenharmony_ci                                                     nullptr,
26585db71995Sopenharmony_ci                                                     "FakeICDTool",
26595db71995Sopenharmony_ci                                                     "version_0_0_0_1.b",
26605db71995Sopenharmony_ci                                                     VK_TOOL_PURPOSE_VALIDATION_BIT_EXT,
26615db71995Sopenharmony_ci                                                     "This tool does not exist",
26625db71995Sopenharmony_ci                                                     "No-Layer"};
26635db71995Sopenharmony_ci    {  // No support in driver
26645db71995Sopenharmony_ci        FrameworkEnvironment env{};
26655db71995Sopenharmony_ci        env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA)).add_physical_device({});
26665db71995Sopenharmony_ci
26675db71995Sopenharmony_ci        InstWrapper inst{env.vulkan_functions};
26685db71995Sopenharmony_ci        inst.CheckCreate();
26695db71995Sopenharmony_ci
26705db71995Sopenharmony_ci        auto phys_dev = inst.GetPhysDev();
26715db71995Sopenharmony_ci
26725db71995Sopenharmony_ci        PFN_vkGetPhysicalDeviceToolPropertiesEXT getToolProperties = inst.load("vkGetPhysicalDeviceToolPropertiesEXT");
26735db71995Sopenharmony_ci        handle_assert_has_value(getToolProperties);
26745db71995Sopenharmony_ci
26755db71995Sopenharmony_ci        uint32_t tool_count = 0;
26765db71995Sopenharmony_ci        ASSERT_EQ(VK_SUCCESS, getToolProperties(phys_dev, &tool_count, nullptr));
26775db71995Sopenharmony_ci        ASSERT_EQ(tool_count, 0U);
26785db71995Sopenharmony_ci    }
26795db71995Sopenharmony_ci    {  // extension is supported in driver
26805db71995Sopenharmony_ci        FrameworkEnvironment env{};
26815db71995Sopenharmony_ci        env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA))
26825db71995Sopenharmony_ci            .set_supports_tooling_info_ext(true)
26835db71995Sopenharmony_ci            .add_tooling_property(icd_tool_props)
26845db71995Sopenharmony_ci            .add_physical_device(PhysicalDevice{}.add_extension(VK_EXT_TOOLING_INFO_EXTENSION_NAME).finish());
26855db71995Sopenharmony_ci
26865db71995Sopenharmony_ci        InstWrapper inst{env.vulkan_functions};
26875db71995Sopenharmony_ci        inst.CheckCreate();
26885db71995Sopenharmony_ci
26895db71995Sopenharmony_ci        auto phys_dev = inst.GetPhysDev();
26905db71995Sopenharmony_ci
26915db71995Sopenharmony_ci        PFN_vkGetPhysicalDeviceToolPropertiesEXT getToolProperties = inst.load("vkGetPhysicalDeviceToolPropertiesEXT");
26925db71995Sopenharmony_ci        handle_assert_has_value(getToolProperties);
26935db71995Sopenharmony_ci        uint32_t tool_count = 0;
26945db71995Sopenharmony_ci        ASSERT_EQ(VK_SUCCESS, getToolProperties(phys_dev, &tool_count, nullptr));
26955db71995Sopenharmony_ci        ASSERT_EQ(tool_count, 1U);
26965db71995Sopenharmony_ci        VkPhysicalDeviceToolPropertiesEXT props{};
26975db71995Sopenharmony_ci        ASSERT_EQ(VK_SUCCESS, getToolProperties(phys_dev, &tool_count, &props));
26985db71995Sopenharmony_ci        ASSERT_EQ(tool_count, 1U);
26995db71995Sopenharmony_ci        string_eq(props.name, icd_tool_props.name);
27005db71995Sopenharmony_ci    }
27015db71995Sopenharmony_ci    {  // core
27025db71995Sopenharmony_ci        FrameworkEnvironment env{};
27035db71995Sopenharmony_ci        env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA, VK_API_VERSION_1_3))
27045db71995Sopenharmony_ci            .add_physical_device({})
27055db71995Sopenharmony_ci            .set_supports_tooling_info_core(true)
27065db71995Sopenharmony_ci            .add_tooling_property(icd_tool_props)
27075db71995Sopenharmony_ci            .physical_devices.back()
27085db71995Sopenharmony_ci            .properties.apiVersion = VK_MAKE_API_VERSION(0, 1, 3, 0);
27095db71995Sopenharmony_ci
27105db71995Sopenharmony_ci        InstWrapper inst{env.vulkan_functions};
27115db71995Sopenharmony_ci        inst.CheckCreate();
27125db71995Sopenharmony_ci
27135db71995Sopenharmony_ci        auto phys_dev = inst.GetPhysDev();
27145db71995Sopenharmony_ci
27155db71995Sopenharmony_ci        PFN_vkGetPhysicalDeviceToolProperties getToolProperties = inst.load("vkGetPhysicalDeviceToolProperties");
27165db71995Sopenharmony_ci        handle_assert_has_value(getToolProperties);
27175db71995Sopenharmony_ci        uint32_t tool_count = 0;
27185db71995Sopenharmony_ci        ASSERT_EQ(VK_SUCCESS, getToolProperties(phys_dev, &tool_count, nullptr));
27195db71995Sopenharmony_ci        ASSERT_EQ(tool_count, 1U);
27205db71995Sopenharmony_ci        VkPhysicalDeviceToolProperties props{};
27215db71995Sopenharmony_ci        ASSERT_EQ(VK_SUCCESS, getToolProperties(phys_dev, &tool_count, &props));
27225db71995Sopenharmony_ci        ASSERT_EQ(tool_count, 1U);
27235db71995Sopenharmony_ci        string_eq(props.name, icd_tool_props.name);
27245db71995Sopenharmony_ci    }
27255db71995Sopenharmony_ci}
27265db71995Sopenharmony_ciTEST(CreateInstance, InstanceNullLayerPtr) {
27275db71995Sopenharmony_ci    FrameworkEnvironment env{};
27285db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2));
27295db71995Sopenharmony_ci    VkInstance inst = VK_NULL_HANDLE;
27305db71995Sopenharmony_ci    VkInstanceCreateInfo info{};
27315db71995Sopenharmony_ci    info.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
27325db71995Sopenharmony_ci    info.enabledLayerCount = 1;
27335db71995Sopenharmony_ci
27345db71995Sopenharmony_ci    ASSERT_EQ(env.vulkan_functions.vkCreateInstance(&info, VK_NULL_HANDLE, &inst), VK_ERROR_LAYER_NOT_PRESENT);
27355db71995Sopenharmony_ci}
27365db71995Sopenharmony_ciTEST(CreateInstance, InstanceNullExtensionPtr) {
27375db71995Sopenharmony_ci    FrameworkEnvironment env{};
27385db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2));
27395db71995Sopenharmony_ci    VkInstance inst = VK_NULL_HANDLE;
27405db71995Sopenharmony_ci    VkInstanceCreateInfo info{};
27415db71995Sopenharmony_ci    info.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
27425db71995Sopenharmony_ci    info.enabledExtensionCount = 1;
27435db71995Sopenharmony_ci
27445db71995Sopenharmony_ci    ASSERT_EQ(env.vulkan_functions.vkCreateInstance(&info, VK_NULL_HANDLE, &inst), VK_ERROR_EXTENSION_NOT_PRESENT);
27455db71995Sopenharmony_ci}
27465db71995Sopenharmony_ci
27475db71995Sopenharmony_ci#if defined(__linux__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__GNU__)
27485db71995Sopenharmony_ci// NOTE: Sort order only affects Linux
27495db71995Sopenharmony_ciTEST(SortedPhysicalDevices, DevicesSortEnabled10NoAppExt) {
27505db71995Sopenharmony_ci    FrameworkEnvironment env{};
27515db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2, VK_API_VERSION_1_1));
27525db71995Sopenharmony_ci    env.get_test_icd(0).add_instance_extension({VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME});
27535db71995Sopenharmony_ci    env.get_test_icd(0).physical_devices.push_back({"pd0"});
27545db71995Sopenharmony_ci    env.get_test_icd(0).physical_devices.back().set_pci_bus(7);
27555db71995Sopenharmony_ci    FillInRandomDeviceProps(env.get_test_icd(0).physical_devices.back().properties, VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU,
27565db71995Sopenharmony_ci                            VK_API_VERSION_1_1, 888, 0xAAA001);
27575db71995Sopenharmony_ci    env.get_test_icd(0).physical_devices.back().extensions.push_back({VK_EXT_PCI_BUS_INFO_EXTENSION_NAME, 0});
27585db71995Sopenharmony_ci    env.get_test_icd(0).physical_devices.push_back({"pd1"});
27595db71995Sopenharmony_ci    env.get_test_icd(0).physical_devices.back().set_pci_bus(3);
27605db71995Sopenharmony_ci    FillInRandomDeviceProps(env.get_test_icd(0).physical_devices.back().properties, VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU,
27615db71995Sopenharmony_ci                            VK_API_VERSION_1_1, 888, 0xAAA002);
27625db71995Sopenharmony_ci    env.get_test_icd(0).physical_devices.back().extensions.push_back({VK_EXT_PCI_BUS_INFO_EXTENSION_NAME, 0});
27635db71995Sopenharmony_ci
27645db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2, VK_API_VERSION_1_0));
27655db71995Sopenharmony_ci    env.get_test_icd(1).add_instance_extension({VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME});
27665db71995Sopenharmony_ci    env.get_test_icd(1).physical_devices.push_back({"pd2"});
27675db71995Sopenharmony_ci    env.get_test_icd(1).physical_devices.back().set_pci_bus(0);
27685db71995Sopenharmony_ci    FillInRandomDeviceProps(env.get_test_icd(1).physical_devices.back().properties, VK_PHYSICAL_DEVICE_TYPE_CPU, VK_API_VERSION_1_0,
27695db71995Sopenharmony_ci                            1, 0xBBBB001);
27705db71995Sopenharmony_ci    env.get_test_icd(1).physical_devices.back().extensions.push_back({VK_EXT_PCI_BUS_INFO_EXTENSION_NAME, 0});
27715db71995Sopenharmony_ci
27725db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2, VK_API_VERSION_1_1));
27735db71995Sopenharmony_ci    env.get_test_icd(2).add_instance_extension({VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME});
27745db71995Sopenharmony_ci    env.get_test_icd(2).physical_devices.push_back({"pd3"});
27755db71995Sopenharmony_ci    env.get_test_icd(2).physical_devices.back().set_pci_bus(1);
27765db71995Sopenharmony_ci    FillInRandomDeviceProps(env.get_test_icd(2).physical_devices.back().properties, VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU,
27775db71995Sopenharmony_ci                            VK_API_VERSION_1_1, 75, 0xCCCC001);
27785db71995Sopenharmony_ci    env.get_test_icd(2).physical_devices.back().extensions.push_back({VK_EXT_PCI_BUS_INFO_EXTENSION_NAME, 0});
27795db71995Sopenharmony_ci    env.get_test_icd(2).physical_devices.push_back({"pd4"});
27805db71995Sopenharmony_ci    env.get_test_icd(2).physical_devices.back().set_pci_bus(4);
27815db71995Sopenharmony_ci    FillInRandomDeviceProps(env.get_test_icd(2).physical_devices.back().properties, VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU,
27825db71995Sopenharmony_ci                            VK_API_VERSION_1_0, 75, 0xCCCC002);
27835db71995Sopenharmony_ci    env.get_test_icd(2).physical_devices.back().extensions.push_back({VK_EXT_PCI_BUS_INFO_EXTENSION_NAME, 0});
27845db71995Sopenharmony_ci
27855db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2, VK_API_VERSION_1_1));
27865db71995Sopenharmony_ci    env.get_test_icd(3).add_instance_extension({VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME});
27875db71995Sopenharmony_ci    env.get_test_icd(3).physical_devices.push_back({"pd5"});
27885db71995Sopenharmony_ci    env.get_test_icd(3).physical_devices.back().set_pci_bus(0);
27895db71995Sopenharmony_ci    FillInRandomDeviceProps(env.get_test_icd(3).physical_devices.back().properties, VK_PHYSICAL_DEVICE_TYPE_VIRTUAL_GPU,
27905db71995Sopenharmony_ci                            VK_API_VERSION_1_1, 6940, 0xDDDD001);
27915db71995Sopenharmony_ci    env.get_test_icd(3).physical_devices.back().extensions.push_back({VK_EXT_PCI_BUS_INFO_EXTENSION_NAME, 0});
27925db71995Sopenharmony_ci
27935db71995Sopenharmony_ci    InstWrapper instance(env.vulkan_functions);
27945db71995Sopenharmony_ci    instance.CheckCreate();
27955db71995Sopenharmony_ci
27965db71995Sopenharmony_ci    const uint32_t max_phys_devs = 6;
27975db71995Sopenharmony_ci    uint32_t device_count = max_phys_devs;
27985db71995Sopenharmony_ci    std::array<VkPhysicalDevice, max_phys_devs> physical_devices;
27995db71995Sopenharmony_ci    ASSERT_EQ(VK_SUCCESS, instance->vkEnumeratePhysicalDevices(instance, &device_count, physical_devices.data()));
28005db71995Sopenharmony_ci    ASSERT_EQ(device_count, max_phys_devs);
28015db71995Sopenharmony_ci
28025db71995Sopenharmony_ci    for (uint32_t dev = 0; dev < device_count; ++dev) {
28035db71995Sopenharmony_ci        VkPhysicalDeviceProperties props{};
28045db71995Sopenharmony_ci        instance->vkGetPhysicalDeviceProperties(physical_devices[dev], &props);
28055db71995Sopenharmony_ci
28065db71995Sopenharmony_ci        switch (dev) {
28075db71995Sopenharmony_ci            case 0:
28085db71995Sopenharmony_ci                ASSERT_EQ(props.deviceType, VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU);
28095db71995Sopenharmony_ci                ASSERT_EQ(true, !strcmp("pd3", props.deviceName));
28105db71995Sopenharmony_ci                ASSERT_EQ(props.vendorID, 75);
28115db71995Sopenharmony_ci                ASSERT_EQ(props.deviceID, 0xCCCC001);
28125db71995Sopenharmony_ci                break;
28135db71995Sopenharmony_ci            case 1:
28145db71995Sopenharmony_ci                ASSERT_EQ(props.deviceType, VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU);
28155db71995Sopenharmony_ci                ASSERT_EQ(true, !strcmp("pd4", props.deviceName));
28165db71995Sopenharmony_ci                ASSERT_EQ(props.vendorID, 75);
28175db71995Sopenharmony_ci                ASSERT_EQ(props.deviceID, 0xCCCC002);
28185db71995Sopenharmony_ci                break;
28195db71995Sopenharmony_ci            case 2:
28205db71995Sopenharmony_ci                ASSERT_EQ(props.deviceType, VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU);
28215db71995Sopenharmony_ci                ASSERT_EQ(true, !strcmp("pd0", props.deviceName));
28225db71995Sopenharmony_ci                ASSERT_EQ(props.vendorID, 888);
28235db71995Sopenharmony_ci                ASSERT_EQ(props.deviceID, 0xAAA001);
28245db71995Sopenharmony_ci                break;
28255db71995Sopenharmony_ci            case 3:
28265db71995Sopenharmony_ci                ASSERT_EQ(props.deviceType, VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU);
28275db71995Sopenharmony_ci                ASSERT_EQ(true, !strcmp("pd1", props.deviceName));
28285db71995Sopenharmony_ci                ASSERT_EQ(props.vendorID, 888);
28295db71995Sopenharmony_ci                ASSERT_EQ(props.deviceID, 0xAAA002);
28305db71995Sopenharmony_ci                break;
28315db71995Sopenharmony_ci            case 4:
28325db71995Sopenharmony_ci                ASSERT_EQ(props.deviceType, VK_PHYSICAL_DEVICE_TYPE_VIRTUAL_GPU);
28335db71995Sopenharmony_ci                ASSERT_EQ(true, !strcmp("pd5", props.deviceName));
28345db71995Sopenharmony_ci                ASSERT_EQ(props.vendorID, 6940U);
28355db71995Sopenharmony_ci                ASSERT_EQ(props.deviceID, 0xDDDD001);
28365db71995Sopenharmony_ci                break;
28375db71995Sopenharmony_ci            case 5:
28385db71995Sopenharmony_ci                ASSERT_EQ(props.deviceType, VK_PHYSICAL_DEVICE_TYPE_CPU);
28395db71995Sopenharmony_ci                ASSERT_EQ(true, !strcmp("pd2", props.deviceName));
28405db71995Sopenharmony_ci                ASSERT_EQ(props.vendorID, 1U);
28415db71995Sopenharmony_ci                ASSERT_EQ(props.deviceID, 0xBBBB001);
28425db71995Sopenharmony_ci                break;
28435db71995Sopenharmony_ci            default:
28445db71995Sopenharmony_ci                ASSERT_EQ(false, true);
28455db71995Sopenharmony_ci        }
28465db71995Sopenharmony_ci    }
28475db71995Sopenharmony_ci
28485db71995Sopenharmony_ci    // Make sure if we call enumerate again, the information is the same
28495db71995Sopenharmony_ci    std::array<VkPhysicalDevice, max_phys_devs> physical_devices_again;
28505db71995Sopenharmony_ci    ASSERT_EQ(VK_SUCCESS, instance->vkEnumeratePhysicalDevices(instance, &device_count, physical_devices_again.data()));
28515db71995Sopenharmony_ci    ASSERT_EQ(device_count, max_phys_devs);
28525db71995Sopenharmony_ci    for (uint32_t dev = 0; dev < device_count; ++dev) {
28535db71995Sopenharmony_ci        ASSERT_EQ(physical_devices[dev], physical_devices_again[dev]);
28545db71995Sopenharmony_ci    }
28555db71995Sopenharmony_ci}
28565db71995Sopenharmony_ci
28575db71995Sopenharmony_ciTEST(SortedPhysicalDevices, DevicesSortEnabled10AppExt) {
28585db71995Sopenharmony_ci    FrameworkEnvironment env{};
28595db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2, VK_API_VERSION_1_1));
28605db71995Sopenharmony_ci    env.get_test_icd(0).add_instance_extension({VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME});
28615db71995Sopenharmony_ci    env.get_test_icd(0).physical_devices.push_back({"pd0"});
28625db71995Sopenharmony_ci    env.get_test_icd(0).physical_devices.back().set_pci_bus(7);
28635db71995Sopenharmony_ci    FillInRandomDeviceProps(env.get_test_icd(0).physical_devices.back().properties, VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU,
28645db71995Sopenharmony_ci                            VK_API_VERSION_1_1, 888, 0xAAA001);
28655db71995Sopenharmony_ci    env.get_test_icd(0).physical_devices.back().extensions.push_back({VK_EXT_PCI_BUS_INFO_EXTENSION_NAME, 0});
28665db71995Sopenharmony_ci    env.get_test_icd(0).physical_devices.push_back({"pd1"});
28675db71995Sopenharmony_ci    env.get_test_icd(0).physical_devices.back().set_pci_bus(3);
28685db71995Sopenharmony_ci    FillInRandomDeviceProps(env.get_test_icd(0).physical_devices.back().properties, VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU,
28695db71995Sopenharmony_ci                            VK_API_VERSION_1_1, 888, 0xAAA002);
28705db71995Sopenharmony_ci    env.get_test_icd(0).physical_devices.back().extensions.push_back({VK_EXT_PCI_BUS_INFO_EXTENSION_NAME, 0});
28715db71995Sopenharmony_ci
28725db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2, VK_API_VERSION_1_0));
28735db71995Sopenharmony_ci    env.get_test_icd(1).add_instance_extension({VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME});
28745db71995Sopenharmony_ci    env.get_test_icd(1).physical_devices.push_back({"pd2"});
28755db71995Sopenharmony_ci    env.get_test_icd(1).physical_devices.back().set_pci_bus(0);
28765db71995Sopenharmony_ci    FillInRandomDeviceProps(env.get_test_icd(1).physical_devices.back().properties, VK_PHYSICAL_DEVICE_TYPE_CPU, VK_API_VERSION_1_0,
28775db71995Sopenharmony_ci                            1, 0xBBBB001);
28785db71995Sopenharmony_ci    env.get_test_icd(1).physical_devices.back().extensions.push_back({VK_EXT_PCI_BUS_INFO_EXTENSION_NAME, 0});
28795db71995Sopenharmony_ci
28805db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2, VK_API_VERSION_1_1));
28815db71995Sopenharmony_ci    env.get_test_icd(2).add_instance_extension({VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME});
28825db71995Sopenharmony_ci    env.get_test_icd(2).physical_devices.push_back({"pd3"});
28835db71995Sopenharmony_ci    env.get_test_icd(2).physical_devices.back().set_pci_bus(1);
28845db71995Sopenharmony_ci    FillInRandomDeviceProps(env.get_test_icd(2).physical_devices.back().properties, VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU,
28855db71995Sopenharmony_ci                            VK_API_VERSION_1_1, 75, 0xCCCC001);
28865db71995Sopenharmony_ci    env.get_test_icd(2).physical_devices.back().extensions.push_back({VK_EXT_PCI_BUS_INFO_EXTENSION_NAME, 0});
28875db71995Sopenharmony_ci    env.get_test_icd(2).physical_devices.push_back({"pd4"});
28885db71995Sopenharmony_ci    env.get_test_icd(2).physical_devices.back().set_pci_bus(4);
28895db71995Sopenharmony_ci    FillInRandomDeviceProps(env.get_test_icd(2).physical_devices.back().properties, VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU,
28905db71995Sopenharmony_ci                            VK_API_VERSION_1_0, 75, 0xCCCC002);
28915db71995Sopenharmony_ci    env.get_test_icd(2).physical_devices.back().extensions.push_back({VK_EXT_PCI_BUS_INFO_EXTENSION_NAME, 0});
28925db71995Sopenharmony_ci
28935db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2, VK_API_VERSION_1_1));
28945db71995Sopenharmony_ci    env.get_test_icd(3).add_instance_extension({VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME});
28955db71995Sopenharmony_ci    env.get_test_icd(3).physical_devices.push_back({"pd5"});
28965db71995Sopenharmony_ci    env.get_test_icd(3).physical_devices.back().set_pci_bus(0);
28975db71995Sopenharmony_ci    FillInRandomDeviceProps(env.get_test_icd(3).physical_devices.back().properties, VK_PHYSICAL_DEVICE_TYPE_VIRTUAL_GPU,
28985db71995Sopenharmony_ci                            VK_API_VERSION_1_1, 6940, 0xDDDD001);
28995db71995Sopenharmony_ci    env.get_test_icd(3).physical_devices.back().extensions.push_back({VK_EXT_PCI_BUS_INFO_EXTENSION_NAME, 0});
29005db71995Sopenharmony_ci
29015db71995Sopenharmony_ci    InstWrapper instance(env.vulkan_functions);
29025db71995Sopenharmony_ci    instance.create_info.add_extension(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
29035db71995Sopenharmony_ci    instance.CheckCreate();
29045db71995Sopenharmony_ci
29055db71995Sopenharmony_ci    PFN_vkGetPhysicalDeviceProperties2KHR GetPhysDevProps2 = instance.load("vkGetPhysicalDeviceProperties2KHR");
29065db71995Sopenharmony_ci    ASSERT_NE(GetPhysDevProps2, nullptr);
29075db71995Sopenharmony_ci
29085db71995Sopenharmony_ci    const uint32_t max_phys_devs = 6;
29095db71995Sopenharmony_ci    uint32_t device_count = max_phys_devs;
29105db71995Sopenharmony_ci    std::array<VkPhysicalDevice, max_phys_devs> physical_devices;
29115db71995Sopenharmony_ci    ASSERT_EQ(VK_SUCCESS, instance->vkEnumeratePhysicalDevices(instance, &device_count, physical_devices.data()));
29125db71995Sopenharmony_ci    ASSERT_EQ(device_count, max_phys_devs);
29135db71995Sopenharmony_ci
29145db71995Sopenharmony_ci    for (uint32_t dev = 0; dev < device_count; ++dev) {
29155db71995Sopenharmony_ci        VkPhysicalDeviceProperties props{};
29165db71995Sopenharmony_ci        instance->vkGetPhysicalDeviceProperties(physical_devices[dev], &props);
29175db71995Sopenharmony_ci        VkPhysicalDeviceProperties2KHR props2{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2};
29185db71995Sopenharmony_ci        VkPhysicalDevicePCIBusInfoPropertiesEXT pci_bus_info{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PCI_BUS_INFO_PROPERTIES_EXT};
29195db71995Sopenharmony_ci        props2.pNext = &pci_bus_info;
29205db71995Sopenharmony_ci        GetPhysDevProps2(physical_devices[dev], &props2);
29215db71995Sopenharmony_ci
29225db71995Sopenharmony_ci        switch (dev) {
29235db71995Sopenharmony_ci            case 0:
29245db71995Sopenharmony_ci                ASSERT_EQ(props.deviceType, VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU);
29255db71995Sopenharmony_ci                ASSERT_EQ(true, !strcmp("pd3", props.deviceName));
29265db71995Sopenharmony_ci                ASSERT_EQ(props.vendorID, 75);
29275db71995Sopenharmony_ci                ASSERT_EQ(props.deviceID, 0xCCCC001);
29285db71995Sopenharmony_ci                ASSERT_EQ(pci_bus_info.pciBus, 1U);
29295db71995Sopenharmony_ci                break;
29305db71995Sopenharmony_ci            case 1:
29315db71995Sopenharmony_ci                ASSERT_EQ(props.deviceType, VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU);
29325db71995Sopenharmony_ci                ASSERT_EQ(true, !strcmp("pd4", props.deviceName));
29335db71995Sopenharmony_ci                ASSERT_EQ(props.vendorID, 75);
29345db71995Sopenharmony_ci                ASSERT_EQ(props.deviceID, 0xCCCC002);
29355db71995Sopenharmony_ci                ASSERT_EQ(pci_bus_info.pciBus, 4U);
29365db71995Sopenharmony_ci                break;
29375db71995Sopenharmony_ci            case 2:
29385db71995Sopenharmony_ci                ASSERT_EQ(props.deviceType, VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU);
29395db71995Sopenharmony_ci                ASSERT_EQ(true, !strcmp("pd0", props.deviceName));
29405db71995Sopenharmony_ci                ASSERT_EQ(props.vendorID, 888);
29415db71995Sopenharmony_ci                ASSERT_EQ(props.deviceID, 0xAAA001);
29425db71995Sopenharmony_ci                ASSERT_EQ(pci_bus_info.pciBus, 7);
29435db71995Sopenharmony_ci                break;
29445db71995Sopenharmony_ci            case 3:
29455db71995Sopenharmony_ci                ASSERT_EQ(props.deviceType, VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU);
29465db71995Sopenharmony_ci                ASSERT_EQ(true, !strcmp("pd1", props.deviceName));
29475db71995Sopenharmony_ci                ASSERT_EQ(props.vendorID, 888);
29485db71995Sopenharmony_ci                ASSERT_EQ(props.deviceID, 0xAAA002);
29495db71995Sopenharmony_ci                ASSERT_EQ(pci_bus_info.pciBus, 3U);
29505db71995Sopenharmony_ci                break;
29515db71995Sopenharmony_ci            case 4:
29525db71995Sopenharmony_ci                ASSERT_EQ(props.deviceType, VK_PHYSICAL_DEVICE_TYPE_VIRTUAL_GPU);
29535db71995Sopenharmony_ci                ASSERT_EQ(true, !strcmp("pd5", props.deviceName));
29545db71995Sopenharmony_ci                ASSERT_EQ(props.vendorID, 6940U);
29555db71995Sopenharmony_ci                ASSERT_EQ(props.deviceID, 0xDDDD001);
29565db71995Sopenharmony_ci                ASSERT_EQ(pci_bus_info.pciBus, 0U);
29575db71995Sopenharmony_ci                break;
29585db71995Sopenharmony_ci            case 5:
29595db71995Sopenharmony_ci                ASSERT_EQ(props.deviceType, VK_PHYSICAL_DEVICE_TYPE_CPU);
29605db71995Sopenharmony_ci                ASSERT_EQ(true, !strcmp("pd2", props.deviceName));
29615db71995Sopenharmony_ci                ASSERT_EQ(props.vendorID, 1U);
29625db71995Sopenharmony_ci                ASSERT_EQ(props.deviceID, 0xBBBB001);
29635db71995Sopenharmony_ci                ASSERT_EQ(pci_bus_info.pciBus, 0U);
29645db71995Sopenharmony_ci                break;
29655db71995Sopenharmony_ci            default:
29665db71995Sopenharmony_ci                ASSERT_EQ(false, true);
29675db71995Sopenharmony_ci        }
29685db71995Sopenharmony_ci    }
29695db71995Sopenharmony_ci
29705db71995Sopenharmony_ci    // Make sure if we call enumerate again, the information is the same
29715db71995Sopenharmony_ci    std::array<VkPhysicalDevice, max_phys_devs> physical_devices_again;
29725db71995Sopenharmony_ci    ASSERT_EQ(VK_SUCCESS, instance->vkEnumeratePhysicalDevices(instance, &device_count, physical_devices_again.data()));
29735db71995Sopenharmony_ci    ASSERT_EQ(device_count, max_phys_devs);
29745db71995Sopenharmony_ci    for (uint32_t dev = 0; dev < device_count; ++dev) {
29755db71995Sopenharmony_ci        ASSERT_EQ(physical_devices[dev], physical_devices_again[dev]);
29765db71995Sopenharmony_ci    }
29775db71995Sopenharmony_ci}
29785db71995Sopenharmony_ci
29795db71995Sopenharmony_ciTEST(SortedPhysicalDevices, DevicesSortEnabled11) {
29805db71995Sopenharmony_ci    FrameworkEnvironment env{};
29815db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2, VK_API_VERSION_1_1));
29825db71995Sopenharmony_ci    env.get_test_icd(0).set_icd_api_version(VK_API_VERSION_1_1);
29835db71995Sopenharmony_ci    env.get_test_icd(0).add_instance_extension({VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME});
29845db71995Sopenharmony_ci    env.get_test_icd(0).physical_devices.push_back({"pd0"});
29855db71995Sopenharmony_ci    env.get_test_icd(0).physical_devices.back().set_pci_bus(7);
29865db71995Sopenharmony_ci    FillInRandomDeviceProps(env.get_test_icd(0).physical_devices.back().properties, VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU,
29875db71995Sopenharmony_ci                            VK_API_VERSION_1_0, 888, 0xAAA001);
29885db71995Sopenharmony_ci    env.get_test_icd(0).physical_devices.back().extensions.push_back({VK_EXT_PCI_BUS_INFO_EXTENSION_NAME, 0});
29895db71995Sopenharmony_ci    env.get_test_icd(0).physical_devices.push_back({"pd1"});
29905db71995Sopenharmony_ci    env.get_test_icd(0).physical_devices.back().set_pci_bus(3);
29915db71995Sopenharmony_ci    FillInRandomDeviceProps(env.get_test_icd(0).physical_devices.back().properties, VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU,
29925db71995Sopenharmony_ci                            VK_API_VERSION_1_0, 888, 0xAAA002);
29935db71995Sopenharmony_ci    env.get_test_icd(0).physical_devices.back().extensions.push_back({VK_EXT_PCI_BUS_INFO_EXTENSION_NAME, 0});
29945db71995Sopenharmony_ci
29955db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2, VK_API_VERSION_1_1));
29965db71995Sopenharmony_ci    env.get_test_icd(1).set_icd_api_version(VK_API_VERSION_1_1);
29975db71995Sopenharmony_ci    env.get_test_icd(1).add_instance_extension({VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME});
29985db71995Sopenharmony_ci    env.get_test_icd(1).physical_devices.push_back({"pd2"});
29995db71995Sopenharmony_ci    env.get_test_icd(1).physical_devices.back().set_pci_bus(0);
30005db71995Sopenharmony_ci    FillInRandomDeviceProps(env.get_test_icd(1).physical_devices.back().properties, VK_PHYSICAL_DEVICE_TYPE_CPU, VK_API_VERSION_1_0,
30015db71995Sopenharmony_ci                            1, 0xBBBB001);
30025db71995Sopenharmony_ci    env.get_test_icd(1).physical_devices.back().extensions.push_back({VK_EXT_PCI_BUS_INFO_EXTENSION_NAME, 0});
30035db71995Sopenharmony_ci
30045db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2, VK_API_VERSION_1_1));
30055db71995Sopenharmony_ci    env.get_test_icd(2).set_icd_api_version(VK_API_VERSION_1_1);
30065db71995Sopenharmony_ci    env.get_test_icd(2).add_instance_extension({VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME});
30075db71995Sopenharmony_ci    env.get_test_icd(2).physical_devices.push_back({"pd3"});
30085db71995Sopenharmony_ci    env.get_test_icd(2).physical_devices.back().set_pci_bus(1);
30095db71995Sopenharmony_ci    FillInRandomDeviceProps(env.get_test_icd(2).physical_devices.back().properties, VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU,
30105db71995Sopenharmony_ci                            VK_API_VERSION_1_1, 75, 0xCCCC001);
30115db71995Sopenharmony_ci    env.get_test_icd(2).physical_devices.back().extensions.push_back({VK_EXT_PCI_BUS_INFO_EXTENSION_NAME, 0});
30125db71995Sopenharmony_ci    env.get_test_icd(2).physical_devices.push_back({"pd4"});
30135db71995Sopenharmony_ci    env.get_test_icd(2).physical_devices.back().set_pci_bus(4);
30145db71995Sopenharmony_ci    FillInRandomDeviceProps(env.get_test_icd(2).physical_devices.back().properties, VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU,
30155db71995Sopenharmony_ci                            VK_API_VERSION_1_1, 75, 0xCCCC002);
30165db71995Sopenharmony_ci    env.get_test_icd(2).physical_devices.back().extensions.push_back({VK_EXT_PCI_BUS_INFO_EXTENSION_NAME, 0});
30175db71995Sopenharmony_ci
30185db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2, VK_API_VERSION_1_1));
30195db71995Sopenharmony_ci    env.get_test_icd(3).set_icd_api_version(VK_API_VERSION_1_1);
30205db71995Sopenharmony_ci    env.get_test_icd(3).add_instance_extension({VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME});
30215db71995Sopenharmony_ci    env.get_test_icd(3).physical_devices.push_back({"pd5"});
30225db71995Sopenharmony_ci    env.get_test_icd(3).physical_devices.back().set_pci_bus(0);
30235db71995Sopenharmony_ci    FillInRandomDeviceProps(env.get_test_icd(3).physical_devices.back().properties, VK_PHYSICAL_DEVICE_TYPE_VIRTUAL_GPU,
30245db71995Sopenharmony_ci                            VK_API_VERSION_1_1, 6940, 0xDDDD001);
30255db71995Sopenharmony_ci    env.get_test_icd(3).physical_devices.back().extensions.push_back({VK_EXT_PCI_BUS_INFO_EXTENSION_NAME, 0});
30265db71995Sopenharmony_ci
30275db71995Sopenharmony_ci    InstWrapper instance(env.vulkan_functions);
30285db71995Sopenharmony_ci    instance.create_info.set_api_version(VK_API_VERSION_1_1);
30295db71995Sopenharmony_ci    instance.CheckCreate();
30305db71995Sopenharmony_ci
30315db71995Sopenharmony_ci    PFN_vkGetPhysicalDeviceProperties2 GetPhysDevProps2 = instance.load("vkGetPhysicalDeviceProperties2");
30325db71995Sopenharmony_ci    ASSERT_NE(GetPhysDevProps2, nullptr);
30335db71995Sopenharmony_ci
30345db71995Sopenharmony_ci    const uint32_t max_phys_devs = 6;
30355db71995Sopenharmony_ci    uint32_t device_count = max_phys_devs;
30365db71995Sopenharmony_ci    std::array<VkPhysicalDevice, max_phys_devs> physical_devices;
30375db71995Sopenharmony_ci    ASSERT_EQ(VK_SUCCESS, instance->vkEnumeratePhysicalDevices(instance, &device_count, physical_devices.data()));
30385db71995Sopenharmony_ci    ASSERT_EQ(device_count, max_phys_devs);
30395db71995Sopenharmony_ci
30405db71995Sopenharmony_ci    for (uint32_t dev = 0; dev < device_count; ++dev) {
30415db71995Sopenharmony_ci        VkPhysicalDeviceProperties props{};
30425db71995Sopenharmony_ci        instance->vkGetPhysicalDeviceProperties(physical_devices[dev], &props);
30435db71995Sopenharmony_ci        VkPhysicalDeviceProperties2KHR props2{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2};
30445db71995Sopenharmony_ci        VkPhysicalDevicePCIBusInfoPropertiesEXT pci_bus_info{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PCI_BUS_INFO_PROPERTIES_EXT};
30455db71995Sopenharmony_ci        props2.pNext = &pci_bus_info;
30465db71995Sopenharmony_ci        GetPhysDevProps2(physical_devices[dev], &props2);
30475db71995Sopenharmony_ci
30485db71995Sopenharmony_ci        switch (dev) {
30495db71995Sopenharmony_ci            case 0:
30505db71995Sopenharmony_ci                ASSERT_EQ(props.deviceType, VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU);
30515db71995Sopenharmony_ci                ASSERT_EQ(true, !strcmp("pd3", props.deviceName));
30525db71995Sopenharmony_ci                ASSERT_EQ(props.vendorID, 75);
30535db71995Sopenharmony_ci                ASSERT_EQ(props.deviceID, 0xCCCC001);
30545db71995Sopenharmony_ci                ASSERT_EQ(pci_bus_info.pciBus, 1U);
30555db71995Sopenharmony_ci                break;
30565db71995Sopenharmony_ci            case 1:
30575db71995Sopenharmony_ci                ASSERT_EQ(props.deviceType, VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU);
30585db71995Sopenharmony_ci                ASSERT_EQ(true, !strcmp("pd4", props.deviceName));
30595db71995Sopenharmony_ci                ASSERT_EQ(props.vendorID, 75);
30605db71995Sopenharmony_ci                ASSERT_EQ(props.deviceID, 0xCCCC002);
30615db71995Sopenharmony_ci                ASSERT_EQ(pci_bus_info.pciBus, 4U);
30625db71995Sopenharmony_ci                break;
30635db71995Sopenharmony_ci            case 2:
30645db71995Sopenharmony_ci                ASSERT_EQ(props.deviceType, VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU);
30655db71995Sopenharmony_ci                ASSERT_EQ(true, !strcmp("pd0", props.deviceName));
30665db71995Sopenharmony_ci                ASSERT_EQ(props.vendorID, 888);
30675db71995Sopenharmony_ci                ASSERT_EQ(props.deviceID, 0xAAA001);
30685db71995Sopenharmony_ci                ASSERT_EQ(pci_bus_info.pciBus, 7);
30695db71995Sopenharmony_ci                break;
30705db71995Sopenharmony_ci            case 3:
30715db71995Sopenharmony_ci                ASSERT_EQ(props.deviceType, VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU);
30725db71995Sopenharmony_ci                ASSERT_EQ(true, !strcmp("pd1", props.deviceName));
30735db71995Sopenharmony_ci                ASSERT_EQ(props.vendorID, 888);
30745db71995Sopenharmony_ci                ASSERT_EQ(props.deviceID, 0xAAA002);
30755db71995Sopenharmony_ci                ASSERT_EQ(pci_bus_info.pciBus, 3U);
30765db71995Sopenharmony_ci                break;
30775db71995Sopenharmony_ci            case 4:
30785db71995Sopenharmony_ci                ASSERT_EQ(props.deviceType, VK_PHYSICAL_DEVICE_TYPE_VIRTUAL_GPU);
30795db71995Sopenharmony_ci                ASSERT_EQ(true, !strcmp("pd5", props.deviceName));
30805db71995Sopenharmony_ci                ASSERT_EQ(props.vendorID, 6940U);
30815db71995Sopenharmony_ci                ASSERT_EQ(props.deviceID, 0xDDDD001);
30825db71995Sopenharmony_ci                ASSERT_EQ(pci_bus_info.pciBus, 0U);
30835db71995Sopenharmony_ci                break;
30845db71995Sopenharmony_ci            case 5:
30855db71995Sopenharmony_ci                ASSERT_EQ(props.deviceType, VK_PHYSICAL_DEVICE_TYPE_CPU);
30865db71995Sopenharmony_ci                ASSERT_EQ(true, !strcmp("pd2", props.deviceName));
30875db71995Sopenharmony_ci                ASSERT_EQ(props.vendorID, 1U);
30885db71995Sopenharmony_ci                ASSERT_EQ(props.deviceID, 0xBBBB001);
30895db71995Sopenharmony_ci                ASSERT_EQ(pci_bus_info.pciBus, 0U);
30905db71995Sopenharmony_ci                break;
30915db71995Sopenharmony_ci            default:
30925db71995Sopenharmony_ci                ASSERT_EQ(false, true);
30935db71995Sopenharmony_ci        }
30945db71995Sopenharmony_ci    }
30955db71995Sopenharmony_ci
30965db71995Sopenharmony_ci    // Make sure if we call enumerate again, the information is the same
30975db71995Sopenharmony_ci    std::array<VkPhysicalDevice, max_phys_devs> physical_devices_again;
30985db71995Sopenharmony_ci    ASSERT_EQ(VK_SUCCESS, instance->vkEnumeratePhysicalDevices(instance, &device_count, physical_devices_again.data()));
30995db71995Sopenharmony_ci    ASSERT_EQ(device_count, max_phys_devs);
31005db71995Sopenharmony_ci    for (uint32_t dev = 0; dev < device_count; ++dev) {
31015db71995Sopenharmony_ci        ASSERT_EQ(physical_devices[dev], physical_devices_again[dev]);
31025db71995Sopenharmony_ci    }
31035db71995Sopenharmony_ci}
31045db71995Sopenharmony_ci
31055db71995Sopenharmony_ciTEST(SortedPhysicalDevices, DevicesSortedDisabled) {
31065db71995Sopenharmony_ci    FrameworkEnvironment env{};
31075db71995Sopenharmony_ci
31085db71995Sopenharmony_ci    EnvVarWrapper disable_select_env_var{"VK_LOADER_DISABLE_SELECT", "1"};
31095db71995Sopenharmony_ci
31105db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2, VK_API_VERSION_1_0));
31115db71995Sopenharmony_ci    env.get_test_icd(0).add_instance_extension({VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME});
31125db71995Sopenharmony_ci    env.get_test_icd(0).physical_devices.push_back({"pd0"});
31135db71995Sopenharmony_ci    FillInRandomDeviceProps(env.get_test_icd(0).physical_devices.back().properties, VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU,
31145db71995Sopenharmony_ci                            VK_API_VERSION_1_0, 888, 0xAAA001);
31155db71995Sopenharmony_ci    env.get_test_icd(0).physical_devices.back().extensions.push_back({VK_EXT_PCI_BUS_INFO_EXTENSION_NAME, 0});
31165db71995Sopenharmony_ci    env.get_test_icd(0).physical_devices.push_back({"pd1"});
31175db71995Sopenharmony_ci    FillInRandomDeviceProps(env.get_test_icd(0).physical_devices.back().properties, VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU,
31185db71995Sopenharmony_ci                            VK_API_VERSION_1_0, 888, 0xAAA002);
31195db71995Sopenharmony_ci    env.get_test_icd(0).physical_devices.back().extensions.push_back({VK_EXT_PCI_BUS_INFO_EXTENSION_NAME, 0});
31205db71995Sopenharmony_ci
31215db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2, VK_API_VERSION_1_0));
31225db71995Sopenharmony_ci    env.get_test_icd(1).add_instance_extension({VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME});
31235db71995Sopenharmony_ci    env.get_test_icd(1).physical_devices.push_back({"pd2"});
31245db71995Sopenharmony_ci    FillInRandomDeviceProps(env.get_test_icd(1).physical_devices.back().properties, VK_PHYSICAL_DEVICE_TYPE_CPU, VK_API_VERSION_1_0,
31255db71995Sopenharmony_ci                            1, 0xBBBB001);
31265db71995Sopenharmony_ci    env.get_test_icd(1).physical_devices.back().extensions.push_back({VK_EXT_PCI_BUS_INFO_EXTENSION_NAME, 0});
31275db71995Sopenharmony_ci
31285db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2, VK_API_VERSION_1_0));
31295db71995Sopenharmony_ci    env.get_test_icd(2).add_instance_extension({VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME});
31305db71995Sopenharmony_ci    env.get_test_icd(2).physical_devices.push_back({"pd3"});
31315db71995Sopenharmony_ci    FillInRandomDeviceProps(env.get_test_icd(2).physical_devices.back().properties, VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU,
31325db71995Sopenharmony_ci                            VK_API_VERSION_1_0, 75, 0xCCCC001);
31335db71995Sopenharmony_ci    env.get_test_icd(2).physical_devices.back().extensions.push_back({VK_EXT_PCI_BUS_INFO_EXTENSION_NAME, 0});
31345db71995Sopenharmony_ci    env.get_test_icd(2).physical_devices.push_back({"pd4"});
31355db71995Sopenharmony_ci    FillInRandomDeviceProps(env.get_test_icd(2).physical_devices.back().properties, VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU,
31365db71995Sopenharmony_ci                            VK_API_VERSION_1_0, 75, 0xCCCC002);
31375db71995Sopenharmony_ci    env.get_test_icd(2).physical_devices.back().extensions.push_back({VK_EXT_PCI_BUS_INFO_EXTENSION_NAME, 0});
31385db71995Sopenharmony_ci
31395db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2, VK_API_VERSION_1_0));
31405db71995Sopenharmony_ci    env.get_test_icd(3).add_instance_extension({VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME});
31415db71995Sopenharmony_ci    env.get_test_icd(3).physical_devices.push_back({"pd5"});
31425db71995Sopenharmony_ci    FillInRandomDeviceProps(env.get_test_icd(3).physical_devices.back().properties, VK_PHYSICAL_DEVICE_TYPE_VIRTUAL_GPU,
31435db71995Sopenharmony_ci                            VK_API_VERSION_1_0, 6940, 0xDDDD001);
31445db71995Sopenharmony_ci    env.get_test_icd(3).physical_devices.back().extensions.push_back({VK_EXT_PCI_BUS_INFO_EXTENSION_NAME, 0});
31455db71995Sopenharmony_ci
31465db71995Sopenharmony_ci    InstWrapper instance(env.vulkan_functions);
31475db71995Sopenharmony_ci    instance.create_info.add_extension(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
31485db71995Sopenharmony_ci    instance.CheckCreate();
31495db71995Sopenharmony_ci
31505db71995Sopenharmony_ci    // Just make sure we have the correct number of devices
31515db71995Sopenharmony_ci    const uint32_t max_phys_devs = 6;
31525db71995Sopenharmony_ci    uint32_t device_count = max_phys_devs;
31535db71995Sopenharmony_ci    std::array<VkPhysicalDevice, max_phys_devs> physical_devices;
31545db71995Sopenharmony_ci    ASSERT_EQ(VK_SUCCESS, instance->vkEnumeratePhysicalDevices(instance, &device_count, physical_devices.data()));
31555db71995Sopenharmony_ci    ASSERT_EQ(device_count, max_phys_devs);
31565db71995Sopenharmony_ci
31575db71995Sopenharmony_ci    // Make sure the devices are not in the sorted order.  The order is really undefined, but the chances of
31585db71995Sopenharmony_ci    // it being exactly the expected sorted is very low.
31595db71995Sopenharmony_ci    bool sorted = true;
31605db71995Sopenharmony_ci    for (uint32_t dev = 0; dev < device_count; ++dev) {
31615db71995Sopenharmony_ci        VkPhysicalDeviceProperties props{};
31625db71995Sopenharmony_ci        instance->vkGetPhysicalDeviceProperties(physical_devices[dev], &props);
31635db71995Sopenharmony_ci
31645db71995Sopenharmony_ci        switch (dev) {
31655db71995Sopenharmony_ci            case 0:
31665db71995Sopenharmony_ci                if (props.deviceType != VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU || strcmp("pd4", props.deviceName)) {
31675db71995Sopenharmony_ci                    sorted = false;
31685db71995Sopenharmony_ci                }
31695db71995Sopenharmony_ci                break;
31705db71995Sopenharmony_ci            case 1:
31715db71995Sopenharmony_ci                if (props.deviceType != VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU || strcmp("pd0", props.deviceName)) {
31725db71995Sopenharmony_ci                    sorted = false;
31735db71995Sopenharmony_ci                }
31745db71995Sopenharmony_ci                break;
31755db71995Sopenharmony_ci            case 2:
31765db71995Sopenharmony_ci                if (props.deviceType != VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU || strcmp("pd3", props.deviceName)) {
31775db71995Sopenharmony_ci                    sorted = false;
31785db71995Sopenharmony_ci                }
31795db71995Sopenharmony_ci                break;
31805db71995Sopenharmony_ci            case 3:
31815db71995Sopenharmony_ci                if (props.deviceType != VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU || strcmp("pd1", props.deviceName)) {
31825db71995Sopenharmony_ci                    sorted = false;
31835db71995Sopenharmony_ci                }
31845db71995Sopenharmony_ci                break;
31855db71995Sopenharmony_ci            case 4:
31865db71995Sopenharmony_ci                if (props.deviceType != VK_PHYSICAL_DEVICE_TYPE_VIRTUAL_GPU || strcmp("pd5", props.deviceName)) {
31875db71995Sopenharmony_ci                    sorted = false;
31885db71995Sopenharmony_ci                }
31895db71995Sopenharmony_ci                break;
31905db71995Sopenharmony_ci            case 5:
31915db71995Sopenharmony_ci                if (props.deviceType != VK_PHYSICAL_DEVICE_TYPE_CPU || strcmp("pd2", props.deviceName)) {
31925db71995Sopenharmony_ci                    sorted = false;
31935db71995Sopenharmony_ci                }
31945db71995Sopenharmony_ci                break;
31955db71995Sopenharmony_ci            default:
31965db71995Sopenharmony_ci                ASSERT_EQ(false, true);
31975db71995Sopenharmony_ci        }
31985db71995Sopenharmony_ci        if (!sorted) {
31995db71995Sopenharmony_ci            break;
32005db71995Sopenharmony_ci        }
32015db71995Sopenharmony_ci    }
32025db71995Sopenharmony_ci    ASSERT_EQ(false, sorted);
32035db71995Sopenharmony_ci
32045db71995Sopenharmony_ci    // Make sure if we call enumerate again, the information is the same
32055db71995Sopenharmony_ci    std::array<VkPhysicalDevice, max_phys_devs> physical_devices_again;
32065db71995Sopenharmony_ci    ASSERT_EQ(VK_SUCCESS, instance->vkEnumeratePhysicalDevices(instance, &device_count, physical_devices_again.data()));
32075db71995Sopenharmony_ci    ASSERT_EQ(device_count, max_phys_devs);
32085db71995Sopenharmony_ci    for (uint32_t dev = 0; dev < device_count; ++dev) {
32095db71995Sopenharmony_ci        ASSERT_EQ(physical_devices[dev], physical_devices_again[dev]);
32105db71995Sopenharmony_ci    }
32115db71995Sopenharmony_ci}
32125db71995Sopenharmony_ci
32135db71995Sopenharmony_ciTEST(SortedPhysicalDevices, DeviceGroupsSortedEnabled) {
32145db71995Sopenharmony_ci    FrameworkEnvironment env{};
32155db71995Sopenharmony_ci
32165db71995Sopenharmony_ci    // ICD 0: Vulkan 1.1
32175db71995Sopenharmony_ci    //   PhysDev 0: pd0, Discrete, Vulkan 1.1, Bus 7
32185db71995Sopenharmony_ci    //   PhysDev 1: pd1, Integrated, Vulkan 1.1, Bus 3
32195db71995Sopenharmony_ci    //   PhysDev 2: pd2, Discrete, Vulkan 1.1, Bus 6
32205db71995Sopenharmony_ci    //   Group 0: PhysDev 0, PhysDev 2
32215db71995Sopenharmony_ci    //   Group 1: PhysDev 1
32225db71995Sopenharmony_ci    // ICD 1: Vulkan 1.1
32235db71995Sopenharmony_ci    //   PhysDev 3: pd3, CPU, Vulkan 1.1, Bus 0
32245db71995Sopenharmony_ci    // ICD 2: Vulkan 1.1
32255db71995Sopenharmony_ci    //   PhysDev 4: pd4, Discrete, Vulkan 1.1, Bus 1
32265db71995Sopenharmony_ci    //   PhysDev 5: pd5, Discrete, Vulkan 1.1, Bus 4
32275db71995Sopenharmony_ci    //   PhysDev 6: pd6, Discrete, Vulkan 1.1, Bus 2
32285db71995Sopenharmony_ci    //   Group 0: PhysDev 5, PhysDev 6
32295db71995Sopenharmony_ci    //   Group 1: PhysDev 4
32305db71995Sopenharmony_ci    // ICD 3: Vulkan 1.1
32315db71995Sopenharmony_ci    //   PhysDev 7: pd7, Virtual, Vulkan 1.1, Bus 0
32325db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2, VK_API_VERSION_1_1));
32335db71995Sopenharmony_ci    auto& cur_icd_0 = env.get_test_icd(0);
32345db71995Sopenharmony_ci    cur_icd_0.set_icd_api_version(VK_API_VERSION_1_1);
32355db71995Sopenharmony_ci    cur_icd_0.physical_devices.push_back({"pd0"});
32365db71995Sopenharmony_ci    cur_icd_0.physical_devices.back().set_pci_bus(7);
32375db71995Sopenharmony_ci    cur_icd_0.physical_devices.back().extensions.push_back({VK_EXT_PCI_BUS_INFO_EXTENSION_NAME, 0});
32385db71995Sopenharmony_ci    FillInRandomDeviceProps(cur_icd_0.physical_devices.back().properties, VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU, VK_API_VERSION_1_1,
32395db71995Sopenharmony_ci                            888, 0xAAA001);
32405db71995Sopenharmony_ci    cur_icd_0.physical_devices.push_back({"pd1"});
32415db71995Sopenharmony_ci    cur_icd_0.physical_devices.back().set_pci_bus(3);
32425db71995Sopenharmony_ci    cur_icd_0.physical_devices.back().extensions.push_back({VK_EXT_PCI_BUS_INFO_EXTENSION_NAME, 0});
32435db71995Sopenharmony_ci    FillInRandomDeviceProps(cur_icd_0.physical_devices.back().properties, VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU,
32445db71995Sopenharmony_ci                            VK_API_VERSION_1_1, 888, 0xAAA002);
32455db71995Sopenharmony_ci    cur_icd_0.physical_devices.push_back({"pd2"});
32465db71995Sopenharmony_ci    cur_icd_0.physical_devices.back().set_pci_bus(6);
32475db71995Sopenharmony_ci    cur_icd_0.physical_devices.back().extensions.push_back({VK_EXT_PCI_BUS_INFO_EXTENSION_NAME, 0});
32485db71995Sopenharmony_ci    FillInRandomDeviceProps(cur_icd_0.physical_devices.back().properties, VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU, VK_API_VERSION_1_1,
32495db71995Sopenharmony_ci                            888, 0xAAA003);
32505db71995Sopenharmony_ci    cur_icd_0.physical_device_groups.push_back({});
32515db71995Sopenharmony_ci    cur_icd_0.physical_device_groups.back()
32525db71995Sopenharmony_ci        .use_physical_device(cur_icd_0.physical_devices[0])
32535db71995Sopenharmony_ci        .use_physical_device(cur_icd_0.physical_devices[2]);
32545db71995Sopenharmony_ci    cur_icd_0.physical_device_groups.push_back({cur_icd_0.physical_devices[1]});
32555db71995Sopenharmony_ci
32565db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2, VK_API_VERSION_1_1));
32575db71995Sopenharmony_ci    auto& cur_icd_1 = env.get_test_icd(1);
32585db71995Sopenharmony_ci    cur_icd_1.set_icd_api_version(VK_API_VERSION_1_1);
32595db71995Sopenharmony_ci    cur_icd_1.physical_devices.push_back({"pd3"});
32605db71995Sopenharmony_ci    cur_icd_1.physical_devices.back().set_pci_bus(0);
32615db71995Sopenharmony_ci    cur_icd_1.physical_devices.back().extensions.push_back({VK_EXT_PCI_BUS_INFO_EXTENSION_NAME, 0});
32625db71995Sopenharmony_ci    FillInRandomDeviceProps(cur_icd_1.physical_devices.back().properties, VK_PHYSICAL_DEVICE_TYPE_CPU, VK_API_VERSION_1_1, 1,
32635db71995Sopenharmony_ci                            0xBBBB001);
32645db71995Sopenharmony_ci
32655db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2, VK_API_VERSION_1_1));
32665db71995Sopenharmony_ci    auto& cur_icd_2 = env.get_test_icd(2);
32675db71995Sopenharmony_ci    cur_icd_2.set_icd_api_version(VK_API_VERSION_1_1);
32685db71995Sopenharmony_ci    cur_icd_2.physical_devices.push_back({"pd4"});
32695db71995Sopenharmony_ci    cur_icd_2.physical_devices.back().set_pci_bus(1);
32705db71995Sopenharmony_ci    cur_icd_2.physical_devices.back().extensions.push_back({VK_EXT_PCI_BUS_INFO_EXTENSION_NAME, 0});
32715db71995Sopenharmony_ci    FillInRandomDeviceProps(cur_icd_2.physical_devices.back().properties, VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU, VK_API_VERSION_1_1,
32725db71995Sopenharmony_ci                            75, 0xCCCC001);
32735db71995Sopenharmony_ci    cur_icd_2.physical_devices.push_back({"pd5"});
32745db71995Sopenharmony_ci    cur_icd_2.physical_devices.back().set_pci_bus(4);
32755db71995Sopenharmony_ci    cur_icd_2.physical_devices.back().extensions.push_back({VK_EXT_PCI_BUS_INFO_EXTENSION_NAME, 0});
32765db71995Sopenharmony_ci    FillInRandomDeviceProps(cur_icd_2.physical_devices.back().properties, VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU, VK_API_VERSION_1_1,
32775db71995Sopenharmony_ci                            75, 0xCCCC002);
32785db71995Sopenharmony_ci    cur_icd_2.physical_devices.push_back({"pd6"});
32795db71995Sopenharmony_ci    cur_icd_2.physical_devices.back().set_pci_bus(2);
32805db71995Sopenharmony_ci    cur_icd_2.physical_devices.back().extensions.push_back({VK_EXT_PCI_BUS_INFO_EXTENSION_NAME, 0});
32815db71995Sopenharmony_ci    FillInRandomDeviceProps(cur_icd_2.physical_devices.back().properties, VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU, VK_API_VERSION_1_1,
32825db71995Sopenharmony_ci                            75, 0xCCCC003);
32835db71995Sopenharmony_ci    cur_icd_2.physical_device_groups.push_back({});
32845db71995Sopenharmony_ci    cur_icd_2.physical_device_groups.back()
32855db71995Sopenharmony_ci        .use_physical_device(cur_icd_2.physical_devices[1])
32865db71995Sopenharmony_ci        .use_physical_device(cur_icd_2.physical_devices[2]);
32875db71995Sopenharmony_ci    cur_icd_2.physical_device_groups.push_back({cur_icd_2.physical_devices[0]});
32885db71995Sopenharmony_ci
32895db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2, VK_API_VERSION_1_1));
32905db71995Sopenharmony_ci    auto& cur_icd_3 = env.get_test_icd(3);
32915db71995Sopenharmony_ci    cur_icd_3.set_icd_api_version(VK_API_VERSION_1_1);
32925db71995Sopenharmony_ci    cur_icd_3.physical_devices.push_back({"pd7"});
32935db71995Sopenharmony_ci    cur_icd_3.physical_devices.back().set_pci_bus(0);
32945db71995Sopenharmony_ci    cur_icd_3.physical_devices.back().extensions.push_back({VK_EXT_PCI_BUS_INFO_EXTENSION_NAME, 0});
32955db71995Sopenharmony_ci    FillInRandomDeviceProps(cur_icd_3.physical_devices.back().properties, VK_PHYSICAL_DEVICE_TYPE_VIRTUAL_GPU, VK_API_VERSION_1_1,
32965db71995Sopenharmony_ci                            6940, 0xDDDD001);
32975db71995Sopenharmony_ci
32985db71995Sopenharmony_ci    InstWrapper inst(env.vulkan_functions);
32995db71995Sopenharmony_ci    inst.create_info.set_api_version(VK_API_VERSION_1_1);
33005db71995Sopenharmony_ci    inst.CheckCreate();
33015db71995Sopenharmony_ci
33025db71995Sopenharmony_ci    PFN_vkGetPhysicalDeviceProperties2 GetPhysDevProps2 = inst.load("vkGetPhysicalDeviceProperties2");
33035db71995Sopenharmony_ci    ASSERT_NE(GetPhysDevProps2, nullptr);
33045db71995Sopenharmony_ci
33055db71995Sopenharmony_ci    const uint32_t max_phys_devs = 8;
33065db71995Sopenharmony_ci    uint32_t device_count = max_phys_devs;
33075db71995Sopenharmony_ci    std::array<VkPhysicalDevice, max_phys_devs> physical_devices;
33085db71995Sopenharmony_ci    ASSERT_EQ(VK_SUCCESS, inst->vkEnumeratePhysicalDevices(inst, &device_count, physical_devices.data()));
33095db71995Sopenharmony_ci    ASSERT_EQ(device_count, max_phys_devs);
33105db71995Sopenharmony_ci
33115db71995Sopenharmony_ci    const uint32_t max_phys_dev_groups = 6;
33125db71995Sopenharmony_ci    uint32_t group_count = max_phys_dev_groups;
33135db71995Sopenharmony_ci    std::array<VkPhysicalDeviceGroupProperties, max_phys_dev_groups> physical_device_groups{};
33145db71995Sopenharmony_ci    for (auto& group : physical_device_groups) group.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GROUP_PROPERTIES;
33155db71995Sopenharmony_ci    ASSERT_EQ(VK_SUCCESS, inst->vkEnumeratePhysicalDeviceGroups(inst, &group_count, physical_device_groups.data()));
33165db71995Sopenharmony_ci    ASSERT_EQ(group_count, max_phys_dev_groups);
33175db71995Sopenharmony_ci
33185db71995Sopenharmony_ci    uint32_t cur_dev = 0;
33195db71995Sopenharmony_ci    for (uint32_t group = 0; group < max_phys_dev_groups; ++group) {
33205db71995Sopenharmony_ci        for (uint32_t dev = 0; dev < physical_device_groups[group].physicalDeviceCount; ++dev) {
33215db71995Sopenharmony_ci            VkPhysicalDeviceProperties props{};
33225db71995Sopenharmony_ci            inst->vkGetPhysicalDeviceProperties(physical_device_groups[group].physicalDevices[dev], &props);
33235db71995Sopenharmony_ci            VkPhysicalDeviceProperties2 props2{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2};
33245db71995Sopenharmony_ci            VkPhysicalDevicePCIBusInfoPropertiesEXT pci_bus_info{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PCI_BUS_INFO_PROPERTIES_EXT};
33255db71995Sopenharmony_ci            props2.pNext = &pci_bus_info;
33265db71995Sopenharmony_ci            GetPhysDevProps2(physical_device_groups[group].physicalDevices[dev], &props2);
33275db71995Sopenharmony_ci            switch (cur_dev++) {
33285db71995Sopenharmony_ci                case 0:
33295db71995Sopenharmony_ci                    ASSERT_EQ(props.deviceType, VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU);
33305db71995Sopenharmony_ci                    ASSERT_EQ(true, !strcmp("pd4", props.deviceName));
33315db71995Sopenharmony_ci                    ASSERT_EQ(props.vendorID, 75);
33325db71995Sopenharmony_ci                    ASSERT_EQ(props.deviceID, 0xCCCC001);
33335db71995Sopenharmony_ci                    ASSERT_EQ(pci_bus_info.pciBus, 1U);
33345db71995Sopenharmony_ci                    break;
33355db71995Sopenharmony_ci                case 1:
33365db71995Sopenharmony_ci                    ASSERT_EQ(props.deviceType, VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU);
33375db71995Sopenharmony_ci                    ASSERT_EQ(true, !strcmp("pd6", props.deviceName));
33385db71995Sopenharmony_ci                    ASSERT_EQ(props.vendorID, 75);
33395db71995Sopenharmony_ci                    ASSERT_EQ(props.deviceID, 0xCCCC003);
33405db71995Sopenharmony_ci                    ASSERT_EQ(pci_bus_info.pciBus, 2U);
33415db71995Sopenharmony_ci                    break;
33425db71995Sopenharmony_ci                case 2:
33435db71995Sopenharmony_ci                    ASSERT_EQ(props.deviceType, VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU);
33445db71995Sopenharmony_ci                    ASSERT_EQ(true, !strcmp("pd5", props.deviceName));
33455db71995Sopenharmony_ci                    ASSERT_EQ(props.vendorID, 75);
33465db71995Sopenharmony_ci                    ASSERT_EQ(props.deviceID, 0xCCCC002);
33475db71995Sopenharmony_ci                    ASSERT_EQ(pci_bus_info.pciBus, 4U);
33485db71995Sopenharmony_ci                    break;
33495db71995Sopenharmony_ci                case 3:
33505db71995Sopenharmony_ci                    ASSERT_EQ(props.deviceType, VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU);
33515db71995Sopenharmony_ci                    ASSERT_EQ(true, !strcmp("pd2", props.deviceName));
33525db71995Sopenharmony_ci                    ASSERT_EQ(props.vendorID, 888);
33535db71995Sopenharmony_ci                    ASSERT_EQ(props.deviceID, 0xAAA003);
33545db71995Sopenharmony_ci                    ASSERT_EQ(pci_bus_info.pciBus, 6);
33555db71995Sopenharmony_ci                    break;
33565db71995Sopenharmony_ci                case 4:
33575db71995Sopenharmony_ci                    ASSERT_EQ(props.deviceType, VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU);
33585db71995Sopenharmony_ci                    ASSERT_EQ(true, !strcmp("pd0", props.deviceName));
33595db71995Sopenharmony_ci                    ASSERT_EQ(props.vendorID, 888);
33605db71995Sopenharmony_ci                    ASSERT_EQ(props.deviceID, 0xAAA001);
33615db71995Sopenharmony_ci                    ASSERT_EQ(pci_bus_info.pciBus, 7);
33625db71995Sopenharmony_ci                    break;
33635db71995Sopenharmony_ci                case 5:
33645db71995Sopenharmony_ci                    ASSERT_EQ(props.deviceType, VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU);
33655db71995Sopenharmony_ci                    ASSERT_EQ(true, !strcmp("pd1", props.deviceName));
33665db71995Sopenharmony_ci                    ASSERT_EQ(props.vendorID, 888);
33675db71995Sopenharmony_ci                    ASSERT_EQ(props.deviceID, 0xAAA002);
33685db71995Sopenharmony_ci                    ASSERT_EQ(pci_bus_info.pciBus, 3U);
33695db71995Sopenharmony_ci                    break;
33705db71995Sopenharmony_ci                case 6:
33715db71995Sopenharmony_ci                    ASSERT_EQ(props.deviceType, VK_PHYSICAL_DEVICE_TYPE_VIRTUAL_GPU);
33725db71995Sopenharmony_ci                    ASSERT_EQ(true, !strcmp("pd7", props.deviceName));
33735db71995Sopenharmony_ci                    ASSERT_EQ(props.vendorID, 6940U);
33745db71995Sopenharmony_ci                    ASSERT_EQ(props.deviceID, 0xDDDD001);
33755db71995Sopenharmony_ci                    ASSERT_EQ(pci_bus_info.pciBus, 0U);
33765db71995Sopenharmony_ci                    break;
33775db71995Sopenharmony_ci                case 7:
33785db71995Sopenharmony_ci                    ASSERT_EQ(props.deviceType, VK_PHYSICAL_DEVICE_TYPE_CPU);
33795db71995Sopenharmony_ci                    ASSERT_EQ(true, !strcmp("pd3", props.deviceName));
33805db71995Sopenharmony_ci                    ASSERT_EQ(props.vendorID, 1U);
33815db71995Sopenharmony_ci                    ASSERT_EQ(props.deviceID, 0xBBBB001);
33825db71995Sopenharmony_ci                    ASSERT_EQ(pci_bus_info.pciBus, 0U);
33835db71995Sopenharmony_ci                    break;
33845db71995Sopenharmony_ci                default:
33855db71995Sopenharmony_ci                    ASSERT_EQ(false, true);
33865db71995Sopenharmony_ci            }
33875db71995Sopenharmony_ci        }
33885db71995Sopenharmony_ci    }
33895db71995Sopenharmony_ci
33905db71995Sopenharmony_ci    // Make sure if we call enumerate again, the information is the same
33915db71995Sopenharmony_ci    std::array<VkPhysicalDeviceGroupProperties, max_phys_dev_groups> physical_device_groups_again{};
33925db71995Sopenharmony_ci    for (auto& group : physical_device_groups_again) group.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GROUP_PROPERTIES;
33935db71995Sopenharmony_ci
33945db71995Sopenharmony_ci    ASSERT_EQ(VK_SUCCESS, inst->vkEnumeratePhysicalDeviceGroups(inst, &group_count, physical_device_groups_again.data()));
33955db71995Sopenharmony_ci    ASSERT_EQ(group_count, max_phys_dev_groups);
33965db71995Sopenharmony_ci    for (uint32_t group = 0; group < max_phys_dev_groups; ++group) {
33975db71995Sopenharmony_ci        ASSERT_EQ(physical_device_groups[group].physicalDeviceCount, physical_device_groups_again[group].physicalDeviceCount);
33985db71995Sopenharmony_ci        for (uint32_t dev = 0; dev < physical_device_groups[group].physicalDeviceCount; ++dev) {
33995db71995Sopenharmony_ci            ASSERT_EQ(physical_device_groups[group].physicalDevices[dev], physical_device_groups_again[group].physicalDevices[dev]);
34005db71995Sopenharmony_ci        }
34015db71995Sopenharmony_ci    }
34025db71995Sopenharmony_ci}
34035db71995Sopenharmony_ci
34045db71995Sopenharmony_ciTEST(SortedPhysicalDevices, DeviceGroupsSortedDisabled) {
34055db71995Sopenharmony_ci    FrameworkEnvironment env{};
34065db71995Sopenharmony_ci
34075db71995Sopenharmony_ci    EnvVarWrapper disable_select_env_var{"VK_LOADER_DISABLE_SELECT", "1"};
34085db71995Sopenharmony_ci
34095db71995Sopenharmony_ci    // ICD 0: Vulkan 1.1
34105db71995Sopenharmony_ci    //   PhysDev 0: pd0, Discrete, Vulkan 1.1, Bus 7
34115db71995Sopenharmony_ci    //   PhysDev 1: pd1, Integrated, Vulkan 1.1, Bus 3
34125db71995Sopenharmony_ci    //   PhysDev 2: pd2, Discrete, Vulkan 1.1, Bus 6
34135db71995Sopenharmony_ci    //   Group 0: PhysDev 0, PhysDev 2
34145db71995Sopenharmony_ci    //   Group 1: PhysDev 1
34155db71995Sopenharmony_ci    // ICD 1: Vulkan 1.1
34165db71995Sopenharmony_ci    //   PhysDev 3: pd3, CPU, Vulkan 1.1, Bus 0
34175db71995Sopenharmony_ci    // ICD 2: Vulkan 1.1
34185db71995Sopenharmony_ci    //   PhysDev 4: pd4, Discrete, Vulkan 1.1, Bus 1
34195db71995Sopenharmony_ci    //   PhysDev 5: pd5, Discrete, Vulkan 1.1, Bus 4
34205db71995Sopenharmony_ci    //   PhysDev 6: pd6, Discrete, Vulkan 1.1, Bus 2
34215db71995Sopenharmony_ci    //   Group 0: PhysDev 5, PhysDev 6
34225db71995Sopenharmony_ci    //   Group 1: PhysDev 4
34235db71995Sopenharmony_ci    // ICD 3: Vulkan 1.1
34245db71995Sopenharmony_ci    //   PhysDev 7: pd7, Virtual, Vulkan 1.1, Bus 0
34255db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2, VK_API_VERSION_1_1));
34265db71995Sopenharmony_ci    auto& cur_icd_0 = env.get_test_icd(0);
34275db71995Sopenharmony_ci    cur_icd_0.set_icd_api_version(VK_API_VERSION_1_1);
34285db71995Sopenharmony_ci    cur_icd_0.physical_devices.push_back({"pd0"});
34295db71995Sopenharmony_ci    cur_icd_0.physical_devices.back().extensions.push_back({VK_EXT_PCI_BUS_INFO_EXTENSION_NAME, 0});
34305db71995Sopenharmony_ci    FillInRandomDeviceProps(cur_icd_0.physical_devices.back().properties, VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU, VK_API_VERSION_1_1,
34315db71995Sopenharmony_ci                            888, 0xAAA001);
34325db71995Sopenharmony_ci    cur_icd_0.physical_devices.push_back({"pd1"});
34335db71995Sopenharmony_ci    cur_icd_0.physical_devices.back().extensions.push_back({VK_EXT_PCI_BUS_INFO_EXTENSION_NAME, 0});
34345db71995Sopenharmony_ci    FillInRandomDeviceProps(cur_icd_0.physical_devices.back().properties, VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU,
34355db71995Sopenharmony_ci                            VK_API_VERSION_1_1, 888, 0xAAA002);
34365db71995Sopenharmony_ci    cur_icd_0.physical_devices.push_back({"pd2"});
34375db71995Sopenharmony_ci    cur_icd_0.physical_devices.back().extensions.push_back({VK_EXT_PCI_BUS_INFO_EXTENSION_NAME, 0});
34385db71995Sopenharmony_ci    FillInRandomDeviceProps(cur_icd_0.physical_devices.back().properties, VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU, VK_API_VERSION_1_1,
34395db71995Sopenharmony_ci                            888, 0xAAA003);
34405db71995Sopenharmony_ci    cur_icd_0.physical_device_groups.push_back({});
34415db71995Sopenharmony_ci    cur_icd_0.physical_device_groups.back()
34425db71995Sopenharmony_ci        .use_physical_device(cur_icd_0.physical_devices[0])
34435db71995Sopenharmony_ci        .use_physical_device(cur_icd_0.physical_devices[2]);
34445db71995Sopenharmony_ci    cur_icd_0.physical_device_groups.push_back({cur_icd_0.physical_devices[1]});
34455db71995Sopenharmony_ci
34465db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2, VK_API_VERSION_1_1));
34475db71995Sopenharmony_ci    auto& cur_icd_1 = env.get_test_icd(1);
34485db71995Sopenharmony_ci    cur_icd_1.set_icd_api_version(VK_API_VERSION_1_1);
34495db71995Sopenharmony_ci    cur_icd_1.physical_devices.push_back({"pd3"});
34505db71995Sopenharmony_ci    cur_icd_1.physical_devices.back().extensions.push_back({VK_EXT_PCI_BUS_INFO_EXTENSION_NAME, 0});
34515db71995Sopenharmony_ci    FillInRandomDeviceProps(cur_icd_1.physical_devices.back().properties, VK_PHYSICAL_DEVICE_TYPE_CPU, VK_API_VERSION_1_1, 1,
34525db71995Sopenharmony_ci                            0xBBBB001);
34535db71995Sopenharmony_ci
34545db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2, VK_API_VERSION_1_1));
34555db71995Sopenharmony_ci    auto& cur_icd_2 = env.get_test_icd(2);
34565db71995Sopenharmony_ci    cur_icd_2.set_icd_api_version(VK_API_VERSION_1_1);
34575db71995Sopenharmony_ci    cur_icd_2.physical_devices.push_back({"pd4"});
34585db71995Sopenharmony_ci    cur_icd_2.physical_devices.back().extensions.push_back({VK_EXT_PCI_BUS_INFO_EXTENSION_NAME, 0});
34595db71995Sopenharmony_ci    FillInRandomDeviceProps(cur_icd_2.physical_devices.back().properties, VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU, VK_API_VERSION_1_1,
34605db71995Sopenharmony_ci                            75, 0xCCCC001);
34615db71995Sopenharmony_ci    cur_icd_2.physical_devices.push_back({"pd5"});
34625db71995Sopenharmony_ci    cur_icd_2.physical_devices.back().extensions.push_back({VK_EXT_PCI_BUS_INFO_EXTENSION_NAME, 0});
34635db71995Sopenharmony_ci    FillInRandomDeviceProps(cur_icd_2.physical_devices.back().properties, VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU, VK_API_VERSION_1_1,
34645db71995Sopenharmony_ci                            75, 0xCCCC002);
34655db71995Sopenharmony_ci    cur_icd_2.physical_devices.push_back({"pd6"});
34665db71995Sopenharmony_ci    cur_icd_2.physical_devices.back().extensions.push_back({VK_EXT_PCI_BUS_INFO_EXTENSION_NAME, 0});
34675db71995Sopenharmony_ci    FillInRandomDeviceProps(cur_icd_2.physical_devices.back().properties, VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU, VK_API_VERSION_1_1,
34685db71995Sopenharmony_ci                            75, 0xCCCC003);
34695db71995Sopenharmony_ci    cur_icd_2.physical_device_groups.push_back({});
34705db71995Sopenharmony_ci    cur_icd_2.physical_device_groups.back()
34715db71995Sopenharmony_ci        .use_physical_device(cur_icd_2.physical_devices[1])
34725db71995Sopenharmony_ci        .use_physical_device(cur_icd_2.physical_devices[2]);
34735db71995Sopenharmony_ci    cur_icd_2.physical_device_groups.push_back({cur_icd_2.physical_devices[0]});
34745db71995Sopenharmony_ci
34755db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2, VK_API_VERSION_1_1));
34765db71995Sopenharmony_ci    auto& cur_icd_3 = env.get_test_icd(3);
34775db71995Sopenharmony_ci    cur_icd_3.set_icd_api_version(VK_API_VERSION_1_1);
34785db71995Sopenharmony_ci    cur_icd_3.physical_devices.push_back({"pd7"});
34795db71995Sopenharmony_ci    cur_icd_3.physical_devices.back().extensions.push_back({VK_EXT_PCI_BUS_INFO_EXTENSION_NAME, 0});
34805db71995Sopenharmony_ci    FillInRandomDeviceProps(cur_icd_3.physical_devices.back().properties, VK_PHYSICAL_DEVICE_TYPE_VIRTUAL_GPU, VK_API_VERSION_1_1,
34815db71995Sopenharmony_ci                            6940, 0xDDDD001);
34825db71995Sopenharmony_ci
34835db71995Sopenharmony_ci    InstWrapper inst(env.vulkan_functions);
34845db71995Sopenharmony_ci    inst.create_info.set_api_version(VK_API_VERSION_1_1);
34855db71995Sopenharmony_ci    inst.CheckCreate();
34865db71995Sopenharmony_ci
34875db71995Sopenharmony_ci    PFN_vkGetPhysicalDeviceProperties2 GetPhysDevProps2 = inst.load("vkGetPhysicalDeviceProperties2");
34885db71995Sopenharmony_ci    ASSERT_NE(GetPhysDevProps2, nullptr);
34895db71995Sopenharmony_ci
34905db71995Sopenharmony_ci    const uint32_t max_phys_devs = 8;
34915db71995Sopenharmony_ci    uint32_t device_count = max_phys_devs;
34925db71995Sopenharmony_ci    std::array<VkPhysicalDevice, max_phys_devs> physical_devices;
34935db71995Sopenharmony_ci    ASSERT_EQ(VK_SUCCESS, inst->vkEnumeratePhysicalDevices(inst, &device_count, physical_devices.data()));
34945db71995Sopenharmony_ci    ASSERT_EQ(device_count, max_phys_devs);
34955db71995Sopenharmony_ci
34965db71995Sopenharmony_ci    const uint32_t max_phys_dev_groups = 6;
34975db71995Sopenharmony_ci    uint32_t group_count = max_phys_dev_groups;
34985db71995Sopenharmony_ci    std::array<VkPhysicalDeviceGroupProperties, max_phys_dev_groups> physical_device_groups{};
34995db71995Sopenharmony_ci    for (auto& group : physical_device_groups) group.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GROUP_PROPERTIES;
35005db71995Sopenharmony_ci
35015db71995Sopenharmony_ci    ASSERT_EQ(VK_SUCCESS, inst->vkEnumeratePhysicalDeviceGroups(inst, &group_count, physical_device_groups.data()));
35025db71995Sopenharmony_ci    ASSERT_EQ(group_count, max_phys_dev_groups);
35035db71995Sopenharmony_ci
35045db71995Sopenharmony_ci    // Make sure the devices are not in the sorted order.  The order is really undefined, but the chances of
35055db71995Sopenharmony_ci    // it being exactly the expected sorted is very low.
35065db71995Sopenharmony_ci    bool sorted = true;
35075db71995Sopenharmony_ci    uint32_t cur_dev = 0;
35085db71995Sopenharmony_ci    for (uint32_t group = 0; group < max_phys_dev_groups; ++group) {
35095db71995Sopenharmony_ci        for (uint32_t dev = 0; dev < physical_device_groups[group].physicalDeviceCount; ++dev) {
35105db71995Sopenharmony_ci            VkPhysicalDeviceProperties props{};
35115db71995Sopenharmony_ci            inst->vkGetPhysicalDeviceProperties(physical_device_groups[group].physicalDevices[dev], &props);
35125db71995Sopenharmony_ci            switch (cur_dev++) {
35135db71995Sopenharmony_ci                case 0:
35145db71995Sopenharmony_ci                    if (props.deviceType != VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU || strcmp("pd4", props.deviceName)) {
35155db71995Sopenharmony_ci                        sorted = false;
35165db71995Sopenharmony_ci                    }
35175db71995Sopenharmony_ci                    break;
35185db71995Sopenharmony_ci                case 1:
35195db71995Sopenharmony_ci                    if (props.deviceType != VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU || strcmp("pd6", props.deviceName)) {
35205db71995Sopenharmony_ci                        sorted = false;
35215db71995Sopenharmony_ci                    }
35225db71995Sopenharmony_ci                    break;
35235db71995Sopenharmony_ci                case 2:
35245db71995Sopenharmony_ci                    if (props.deviceType != VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU || strcmp("pd5", props.deviceName)) {
35255db71995Sopenharmony_ci                        sorted = false;
35265db71995Sopenharmony_ci                    }
35275db71995Sopenharmony_ci                    break;
35285db71995Sopenharmony_ci                case 3:
35295db71995Sopenharmony_ci                    if (props.deviceType != VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU || strcmp("pd2", props.deviceName)) {
35305db71995Sopenharmony_ci                        sorted = false;
35315db71995Sopenharmony_ci                    }
35325db71995Sopenharmony_ci                    break;
35335db71995Sopenharmony_ci                case 4:
35345db71995Sopenharmony_ci                    if (props.deviceType != VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU || strcmp("pd0", props.deviceName)) {
35355db71995Sopenharmony_ci                        sorted = false;
35365db71995Sopenharmony_ci                    }
35375db71995Sopenharmony_ci                    break;
35385db71995Sopenharmony_ci                case 5:
35395db71995Sopenharmony_ci                    if (props.deviceType != VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU || strcmp("pd1", props.deviceName)) {
35405db71995Sopenharmony_ci                        sorted = false;
35415db71995Sopenharmony_ci                    }
35425db71995Sopenharmony_ci                    break;
35435db71995Sopenharmony_ci                case 6:
35445db71995Sopenharmony_ci                    if (props.deviceType != VK_PHYSICAL_DEVICE_TYPE_VIRTUAL_GPU || strcmp("pd7", props.deviceName)) {
35455db71995Sopenharmony_ci                        sorted = false;
35465db71995Sopenharmony_ci                    }
35475db71995Sopenharmony_ci                    break;
35485db71995Sopenharmony_ci                case 7:
35495db71995Sopenharmony_ci                    if (props.deviceType != VK_PHYSICAL_DEVICE_TYPE_CPU || strcmp("pd3", props.deviceName)) {
35505db71995Sopenharmony_ci                        sorted = false;
35515db71995Sopenharmony_ci                    }
35525db71995Sopenharmony_ci                    break;
35535db71995Sopenharmony_ci                default:
35545db71995Sopenharmony_ci                    ASSERT_EQ(false, true);
35555db71995Sopenharmony_ci            }
35565db71995Sopenharmony_ci        }
35575db71995Sopenharmony_ci        if (!sorted) {
35585db71995Sopenharmony_ci            break;
35595db71995Sopenharmony_ci        }
35605db71995Sopenharmony_ci    }
35615db71995Sopenharmony_ci    ASSERT_EQ(false, sorted);
35625db71995Sopenharmony_ci
35635db71995Sopenharmony_ci    // Make sure if we call enumerate again, the information is the same
35645db71995Sopenharmony_ci    std::array<VkPhysicalDeviceGroupProperties, max_phys_dev_groups> physical_device_groups_again{};
35655db71995Sopenharmony_ci    for (auto& group : physical_device_groups_again) group.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GROUP_PROPERTIES;
35665db71995Sopenharmony_ci
35675db71995Sopenharmony_ci    ASSERT_EQ(VK_SUCCESS, inst->vkEnumeratePhysicalDeviceGroups(inst, &group_count, physical_device_groups_again.data()));
35685db71995Sopenharmony_ci    ASSERT_EQ(group_count, max_phys_dev_groups);
35695db71995Sopenharmony_ci    for (uint32_t group = 0; group < max_phys_dev_groups; ++group) {
35705db71995Sopenharmony_ci        ASSERT_EQ(physical_device_groups[group].physicalDeviceCount, physical_device_groups_again[group].physicalDeviceCount);
35715db71995Sopenharmony_ci        for (uint32_t dev = 0; dev < physical_device_groups[group].physicalDeviceCount; ++dev) {
35725db71995Sopenharmony_ci            ASSERT_EQ(physical_device_groups[group].physicalDevices[dev], physical_device_groups_again[group].physicalDevices[dev]);
35735db71995Sopenharmony_ci        }
35745db71995Sopenharmony_ci    }
35755db71995Sopenharmony_ci}
35765db71995Sopenharmony_ci
35775db71995Sopenharmony_ci#endif  // __linux__ || __FreeBSD__ || __OpenBSD__ || __GNU__
35785db71995Sopenharmony_ci
35795db71995Sopenharmony_ciconst char* portability_driver_warning =
35805db71995Sopenharmony_ci    "vkCreateInstance: Found drivers that contain devices which support the portability subset, but "
35815db71995Sopenharmony_ci    "the instance does not enumerate portability drivers! Applications that wish to enumerate portability "
35825db71995Sopenharmony_ci    "drivers must set the VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR bit in the VkInstanceCreateInfo "
35835db71995Sopenharmony_ci    "flags and enable the VK_KHR_portability_enumeration instance extension.";
35845db71995Sopenharmony_ci
35855db71995Sopenharmony_ciconst char* portability_flag_missing =
35865db71995Sopenharmony_ci    "vkCreateInstance: Found drivers that contain devices which support the portability subset, but "
35875db71995Sopenharmony_ci    "the instance does not enumerate portability drivers! Applications that wish to enumerate portability "
35885db71995Sopenharmony_ci    "drivers must set the VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR bit in the VkInstanceCreateInfo "
35895db71995Sopenharmony_ci    "flags.";
35905db71995Sopenharmony_ci
35915db71995Sopenharmony_ciconst char* portability_extension_missing =
35925db71995Sopenharmony_ci    "VkInstanceCreateInfo: If flags has the VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR bit set, the "
35935db71995Sopenharmony_ci    "list of enabled extensions in ppEnabledExtensionNames must contain VK_KHR_portability_enumeration "
35945db71995Sopenharmony_ci    "[VUID-VkInstanceCreateInfo-flags-06559 ]"
35955db71995Sopenharmony_ci    "Applications that wish to enumerate portability drivers must enable the VK_KHR_portability_enumeration "
35965db71995Sopenharmony_ci    "instance extension.";
35975db71995Sopenharmony_ci
35985db71995Sopenharmony_ciTEST(PortabilityICDConfiguration, PortabilityICDOnly) {
35995db71995Sopenharmony_ci    FrameworkEnvironment env{};
36005db71995Sopenharmony_ci    env.add_icd(
36015db71995Sopenharmony_ci           TestICDDetails(ManifestICD{}.set_lib_path(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA).set_is_portability_driver(true)))
36025db71995Sopenharmony_ci        .add_physical_device("physical_device_0")
36035db71995Sopenharmony_ci        .set_max_icd_interface_version(1);
36045db71995Sopenharmony_ci    {  // enable portability extension and flag
36055db71995Sopenharmony_ci        InstWrapper inst{env.vulkan_functions};
36065db71995Sopenharmony_ci        inst.create_info.add_extension(VK_EXT_DEBUG_UTILS_EXTENSION_NAME);
36075db71995Sopenharmony_ci        inst.create_info.add_extension("VK_KHR_portability_enumeration");
36085db71995Sopenharmony_ci        inst.create_info.flags = VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR;
36095db71995Sopenharmony_ci        FillDebugUtilsCreateDetails(inst.create_info, env.debug_log);
36105db71995Sopenharmony_ci        inst.CheckCreate();
36115db71995Sopenharmony_ci        ASSERT_FALSE(env.debug_log.find(portability_driver_warning));
36125db71995Sopenharmony_ci
36135db71995Sopenharmony_ci        DebugUtilsWrapper log{inst, VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT};
36145db71995Sopenharmony_ci        CreateDebugUtilsMessenger(log);
36155db71995Sopenharmony_ci
36165db71995Sopenharmony_ci        auto phys_dev = inst.GetPhysDev();
36175db71995Sopenharmony_ci        handle_assert_has_value(phys_dev);
36185db71995Sopenharmony_ci
36195db71995Sopenharmony_ci        DeviceWrapper dev_info{inst};
36205db71995Sopenharmony_ci        dev_info.CheckCreate(phys_dev);
36215db71995Sopenharmony_ci        ASSERT_FALSE(log.find(portability_driver_warning));
36225db71995Sopenharmony_ci        ASSERT_FALSE(log.find(portability_flag_missing));
36235db71995Sopenharmony_ci        ASSERT_FALSE(log.find(portability_extension_missing));
36245db71995Sopenharmony_ci    }
36255db71995Sopenharmony_ci    {  // enable portability flag but not extension - shouldn't be able to create an instance when filtering is enabled
36265db71995Sopenharmony_ci        InstWrapper inst{env.vulkan_functions};
36275db71995Sopenharmony_ci        inst.create_info.flags = VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR;
36285db71995Sopenharmony_ci        inst.create_info.add_extension(VK_EXT_DEBUG_UTILS_EXTENSION_NAME);
36295db71995Sopenharmony_ci        FillDebugUtilsCreateDetails(inst.create_info, env.debug_log);
36305db71995Sopenharmony_ci        inst.CheckCreate(VK_ERROR_INCOMPATIBLE_DRIVER);
36315db71995Sopenharmony_ci        ASSERT_TRUE(env.debug_log.find(portability_extension_missing));
36325db71995Sopenharmony_ci    }
36335db71995Sopenharmony_ci    {  // enable portability extension but not flag - shouldn't be able to create an instance when filtering is enabled
36345db71995Sopenharmony_ci        InstWrapper inst{env.vulkan_functions};
36355db71995Sopenharmony_ci        inst.create_info.add_extension("VK_KHR_portability_enumeration");
36365db71995Sopenharmony_ci        inst.create_info.add_extension(VK_EXT_DEBUG_UTILS_EXTENSION_NAME);
36375db71995Sopenharmony_ci        FillDebugUtilsCreateDetails(inst.create_info, env.debug_log);
36385db71995Sopenharmony_ci        inst.CheckCreate(VK_ERROR_INCOMPATIBLE_DRIVER);
36395db71995Sopenharmony_ci        ASSERT_TRUE(env.debug_log.find(portability_flag_missing));
36405db71995Sopenharmony_ci    }
36415db71995Sopenharmony_ci    {  // enable neither the portability extension or the flag - shouldn't be able to create an instance when filtering is enabled
36425db71995Sopenharmony_ci        InstWrapper inst{env.vulkan_functions};
36435db71995Sopenharmony_ci        inst.create_info.flags = 0;  // make sure its 0 - no portability
36445db71995Sopenharmony_ci        inst.create_info.add_extension(VK_EXT_DEBUG_UTILS_EXTENSION_NAME);
36455db71995Sopenharmony_ci        FillDebugUtilsCreateDetails(inst.create_info, env.debug_log);
36465db71995Sopenharmony_ci        inst.CheckCreate(VK_ERROR_INCOMPATIBLE_DRIVER);
36475db71995Sopenharmony_ci        ASSERT_TRUE(env.debug_log.find(portability_driver_warning));
36485db71995Sopenharmony_ci    }
36495db71995Sopenharmony_ci}
36505db71995Sopenharmony_ci
36515db71995Sopenharmony_ciTEST(PortabilityICDConfiguration, PortabilityAndRegularICD) {
36525db71995Sopenharmony_ci    FrameworkEnvironment env{};
36535db71995Sopenharmony_ci    env.add_icd(TestICDDetails(ManifestICD{}.set_lib_path(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA)));
36545db71995Sopenharmony_ci    env.add_icd(
36555db71995Sopenharmony_ci        TestICDDetails(ManifestICD{}.set_lib_path(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA).set_is_portability_driver(true)));
36565db71995Sopenharmony_ci
36575db71995Sopenharmony_ci    auto& driver0 = env.get_test_icd(0);
36585db71995Sopenharmony_ci    auto& driver1 = env.get_test_icd(1);
36595db71995Sopenharmony_ci
36605db71995Sopenharmony_ci    driver0.physical_devices.emplace_back("physical_device_0");
36615db71995Sopenharmony_ci    driver0.max_icd_interface_version = 1;
36625db71995Sopenharmony_ci
36635db71995Sopenharmony_ci    driver1.physical_devices.emplace_back("portability_physical_device_1");
36645db71995Sopenharmony_ci    driver1.max_icd_interface_version = 1;
36655db71995Sopenharmony_ci    {  // enable portability extension and flag
36665db71995Sopenharmony_ci        InstWrapper inst{env.vulkan_functions};
36675db71995Sopenharmony_ci        inst.create_info.add_extension(VK_EXT_DEBUG_UTILS_EXTENSION_NAME);
36685db71995Sopenharmony_ci        inst.create_info.add_extension("VK_KHR_portability_enumeration");
36695db71995Sopenharmony_ci        inst.create_info.flags = VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR;
36705db71995Sopenharmony_ci        FillDebugUtilsCreateDetails(inst.create_info, env.debug_log);
36715db71995Sopenharmony_ci        inst.CheckCreate();
36725db71995Sopenharmony_ci        ASSERT_FALSE(env.debug_log.find(portability_driver_warning));
36735db71995Sopenharmony_ci
36745db71995Sopenharmony_ci        DebugUtilsWrapper log{inst, VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT};
36755db71995Sopenharmony_ci        CreateDebugUtilsMessenger(log);
36765db71995Sopenharmony_ci
36775db71995Sopenharmony_ci        auto phys_devs = inst.GetPhysDevs(2);
36785db71995Sopenharmony_ci        for (const auto& phys_dev : phys_devs) {
36795db71995Sopenharmony_ci            handle_assert_has_value(phys_dev);
36805db71995Sopenharmony_ci        }
36815db71995Sopenharmony_ci        DeviceWrapper dev_info_0{inst};
36825db71995Sopenharmony_ci        DeviceWrapper dev_info_1{inst};
36835db71995Sopenharmony_ci        dev_info_0.CheckCreate(phys_devs[0]);
36845db71995Sopenharmony_ci        dev_info_1.CheckCreate(phys_devs[1]);
36855db71995Sopenharmony_ci    }
36865db71995Sopenharmony_ci    {  // enable portability extension but not flag - should only enumerate 1 physical device when filtering is enabled
36875db71995Sopenharmony_ci        InstWrapper inst{env.vulkan_functions};
36885db71995Sopenharmony_ci        inst.create_info.add_extension(VK_EXT_DEBUG_UTILS_EXTENSION_NAME);
36895db71995Sopenharmony_ci        inst.create_info.add_extension("VK_KHR_portability_enumeration");
36905db71995Sopenharmony_ci        FillDebugUtilsCreateDetails(inst.create_info, env.debug_log);
36915db71995Sopenharmony_ci        inst.CheckCreate();
36925db71995Sopenharmony_ci        ASSERT_FALSE(env.debug_log.find(portability_driver_warning));
36935db71995Sopenharmony_ci
36945db71995Sopenharmony_ci        DebugUtilsWrapper log{inst, VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT};
36955db71995Sopenharmony_ci        CreateDebugUtilsMessenger(log);
36965db71995Sopenharmony_ci        auto phys_dev = inst.GetPhysDev();
36975db71995Sopenharmony_ci        handle_assert_has_value(phys_dev);
36985db71995Sopenharmony_ci        DeviceWrapper dev_info_0{inst};
36995db71995Sopenharmony_ci        dev_info_0.CheckCreate(phys_dev);
37005db71995Sopenharmony_ci    }
37015db71995Sopenharmony_ci    {  // enable portability flag but not extension - should only enumerate 1 physical device when filtering is enabled
37025db71995Sopenharmony_ci        InstWrapper inst{env.vulkan_functions};
37035db71995Sopenharmony_ci        inst.create_info.add_extension(VK_EXT_DEBUG_UTILS_EXTENSION_NAME);
37045db71995Sopenharmony_ci        inst.create_info.flags = VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR;
37055db71995Sopenharmony_ci        FillDebugUtilsCreateDetails(inst.create_info, env.debug_log);
37065db71995Sopenharmony_ci        inst.CheckCreate();
37075db71995Sopenharmony_ci        ASSERT_FALSE(env.debug_log.find(portability_driver_warning));
37085db71995Sopenharmony_ci
37095db71995Sopenharmony_ci        DebugUtilsWrapper log{inst, VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT};
37105db71995Sopenharmony_ci        CreateDebugUtilsMessenger(log);
37115db71995Sopenharmony_ci        auto phys_dev = inst.GetPhysDev();
37125db71995Sopenharmony_ci        handle_assert_has_value(phys_dev);
37135db71995Sopenharmony_ci        DeviceWrapper dev_info_0{inst};
37145db71995Sopenharmony_ci        dev_info_0.CheckCreate(phys_dev);
37155db71995Sopenharmony_ci    }
37165db71995Sopenharmony_ci    {  // do not enable portability extension or flag - should only enumerate 1 physical device when filtering is enabled
37175db71995Sopenharmony_ci        InstWrapper inst{env.vulkan_functions};
37185db71995Sopenharmony_ci        inst.create_info.add_extension(VK_EXT_DEBUG_UTILS_EXTENSION_NAME);
37195db71995Sopenharmony_ci        FillDebugUtilsCreateDetails(inst.create_info, env.debug_log);
37205db71995Sopenharmony_ci        inst.CheckCreate();
37215db71995Sopenharmony_ci        ASSERT_FALSE(env.debug_log.find(portability_driver_warning));
37225db71995Sopenharmony_ci
37235db71995Sopenharmony_ci        DebugUtilsWrapper log{inst, VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT};
37245db71995Sopenharmony_ci        CreateDebugUtilsMessenger(log);
37255db71995Sopenharmony_ci        auto phys_dev = inst.GetPhysDev();
37265db71995Sopenharmony_ci        handle_assert_has_value(phys_dev);
37275db71995Sopenharmony_ci        DeviceWrapper dev_info_0{inst};
37285db71995Sopenharmony_ci        dev_info_0.CheckCreate(phys_dev);
37295db71995Sopenharmony_ci    }
37305db71995Sopenharmony_ci}
37315db71995Sopenharmony_ci
37325db71995Sopenharmony_ci// Check that the portability enumeration flag bit doesn't get passed down
37335db71995Sopenharmony_ciTEST(PortabilityICDConfiguration, PortabilityAndRegularICDCheckFlagsPassedIntoICD) {
37345db71995Sopenharmony_ci    FrameworkEnvironment env{};
37355db71995Sopenharmony_ci    env.add_icd(TestICDDetails(ManifestICD{}.set_lib_path(TEST_ICD_PATH_VERSION_2)));
37365db71995Sopenharmony_ci    env.add_icd(TestICDDetails(ManifestICD{}.set_lib_path(TEST_ICD_PATH_VERSION_2).set_is_portability_driver(true)));
37375db71995Sopenharmony_ci
37385db71995Sopenharmony_ci    auto& driver0 = env.get_test_icd(0);
37395db71995Sopenharmony_ci    auto& driver1 = env.get_test_icd(1);
37405db71995Sopenharmony_ci
37415db71995Sopenharmony_ci    driver0.physical_devices.emplace_back("physical_device_0");
37425db71995Sopenharmony_ci    driver0.max_icd_interface_version = 1;
37435db71995Sopenharmony_ci
37445db71995Sopenharmony_ci    driver1.physical_devices.emplace_back("portability_physical_device_1");
37455db71995Sopenharmony_ci    driver1.add_instance_extension("VK_KHR_portability_enumeration");
37465db71995Sopenharmony_ci    driver1.max_icd_interface_version = 1;
37475db71995Sopenharmony_ci
37485db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
37495db71995Sopenharmony_ci    inst.create_info.add_extension(VK_EXT_DEBUG_UTILS_EXTENSION_NAME);
37505db71995Sopenharmony_ci    inst.create_info.add_extension("VK_KHR_portability_enumeration");
37515db71995Sopenharmony_ci    inst.create_info.flags = VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR | 4;
37525db71995Sopenharmony_ci
37535db71995Sopenharmony_ci    FillDebugUtilsCreateDetails(inst.create_info, env.debug_log);
37545db71995Sopenharmony_ci    inst.CheckCreate();
37555db71995Sopenharmony_ci    ASSERT_FALSE(env.debug_log.find(portability_driver_warning));
37565db71995Sopenharmony_ci
37575db71995Sopenharmony_ci    ASSERT_EQ(static_cast<VkInstanceCreateFlags>(4), driver0.passed_in_instance_create_flags);
37585db71995Sopenharmony_ci    ASSERT_EQ(VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR | static_cast<VkInstanceCreateFlags>(4),
37595db71995Sopenharmony_ci              driver1.passed_in_instance_create_flags);
37605db71995Sopenharmony_ci}
37615db71995Sopenharmony_ci
37625db71995Sopenharmony_ciTEST(PortabilityICDConfiguration, PortabilityAndRegularICDPreInstanceFunctions) {
37635db71995Sopenharmony_ci    FrameworkEnvironment env{};
37645db71995Sopenharmony_ci    Extension first_ext{"VK_EXT_validation_features"};  // known instance extensions
37655db71995Sopenharmony_ci    Extension second_ext{"VK_EXT_headless_surface"};
37665db71995Sopenharmony_ci    env.add_icd(TestICDDetails(ManifestICD{}.set_lib_path(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA)))
37675db71995Sopenharmony_ci        .add_physical_device("physical_device_0")
37685db71995Sopenharmony_ci        .set_max_icd_interface_version(1)
37695db71995Sopenharmony_ci        .add_instance_extensions({first_ext, second_ext});
37705db71995Sopenharmony_ci    env.add_icd(
37715db71995Sopenharmony_ci           TestICDDetails(ManifestICD{}.set_lib_path(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA).set_is_portability_driver(true)))
37725db71995Sopenharmony_ci        .add_physical_device("portability_physical_device_1")
37735db71995Sopenharmony_ci        .set_max_icd_interface_version(1);
37745db71995Sopenharmony_ci    {
37755db71995Sopenharmony_ci        // check that enumerating instance extensions work with a portability driver present
37765db71995Sopenharmony_ci        auto extensions = env.GetInstanceExtensions(6);
37775db71995Sopenharmony_ci        EXPECT_TRUE(string_eq(extensions.at(0).extensionName, first_ext.extensionName.c_str()));
37785db71995Sopenharmony_ci        EXPECT_TRUE(string_eq(extensions.at(1).extensionName, second_ext.extensionName.c_str()));
37795db71995Sopenharmony_ci        EXPECT_TRUE(string_eq(extensions.at(2).extensionName, VK_EXT_DEBUG_REPORT_EXTENSION_NAME));
37805db71995Sopenharmony_ci        EXPECT_TRUE(string_eq(extensions.at(3).extensionName, VK_EXT_DEBUG_UTILS_EXTENSION_NAME));
37815db71995Sopenharmony_ci        EXPECT_TRUE(string_eq(extensions.at(4).extensionName, VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME));
37825db71995Sopenharmony_ci        EXPECT_TRUE(string_eq(extensions.at(5).extensionName, VK_LUNARG_DIRECT_DRIVER_LOADING_EXTENSION_NAME));
37835db71995Sopenharmony_ci    }
37845db71995Sopenharmony_ci
37855db71995Sopenharmony_ci    const char* layer_name = "TestLayer";
37865db71995Sopenharmony_ci    env.add_explicit_layer(
37875db71995Sopenharmony_ci        ManifestLayer{}.add_layer(
37885db71995Sopenharmony_ci            ManifestLayer::LayerDescription{}.set_name(layer_name).set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)),
37895db71995Sopenharmony_ci        "test_layer.json");
37905db71995Sopenharmony_ci
37915db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
37925db71995Sopenharmony_ci    inst.create_info.add_layer(layer_name);
37935db71995Sopenharmony_ci    inst.CheckCreate();
37945db71995Sopenharmony_ci
37955db71995Sopenharmony_ci    VkPhysicalDevice phys_dev = inst.GetPhysDev();
37965db71995Sopenharmony_ci    {  // LayersMatch
37975db71995Sopenharmony_ci        auto layer_props = inst.GetActiveLayers(phys_dev, 1);
37985db71995Sopenharmony_ci        ASSERT_TRUE(string_eq(layer_props.at(0).layerName, layer_name));
37995db71995Sopenharmony_ci    }
38005db71995Sopenharmony_ci    {  // Property count less than available
38015db71995Sopenharmony_ci        VkLayerProperties layer_props;
38025db71995Sopenharmony_ci        uint32_t layer_count = 0;
38035db71995Sopenharmony_ci        ASSERT_EQ(VK_INCOMPLETE, env.vulkan_functions.vkEnumerateDeviceLayerProperties(phys_dev, &layer_count, &layer_props));
38045db71995Sopenharmony_ci        ASSERT_EQ(layer_count, 0U);
38055db71995Sopenharmony_ci    }
38065db71995Sopenharmony_ci}
38075db71995Sopenharmony_ci
38085db71995Sopenharmony_ci#if defined(_WIN32)
38095db71995Sopenharmony_ciTEST(AppPackageDriverDiscovery, AppPackageTest) {
38105db71995Sopenharmony_ci    FrameworkEnvironment env;
38115db71995Sopenharmony_ci    env.add_icd(TestICDDetails{TEST_ICD_PATH_VERSION_2}.set_discovery_type(ManifestDiscoveryType::windows_app_package))
38125db71995Sopenharmony_ci        .add_physical_device({});
38135db71995Sopenharmony_ci
38145db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
38155db71995Sopenharmony_ci    inst.CheckCreate();
38165db71995Sopenharmony_ci}
38175db71995Sopenharmony_ci
38185db71995Sopenharmony_ci// Make sure that stale layer manifests (path to nonexistant file) which have the same name as real manifests don't cause the real
38195db71995Sopenharmony_ci// manifests to be skipped. Stale registry entries happen when a registry is written on layer/driver installation but not cleaned up
38205db71995Sopenharmony_ci// when the corresponding manifest is removed from the file system.
38215db71995Sopenharmony_ciTEST(DuplicateRegistryEntries, Layers) {
38225db71995Sopenharmony_ci    FrameworkEnvironment env{};
38235db71995Sopenharmony_ci    env.add_icd(TestICDDetails(ManifestICD{}.set_lib_path(TEST_ICD_PATH_VERSION_2)));
38245db71995Sopenharmony_ci
38255db71995Sopenharmony_ci    auto null_path = env.get_folder(ManifestLocation::null).location() / "test_layer.json";
38265db71995Sopenharmony_ci
38275db71995Sopenharmony_ci    env.platform_shim->add_manifest(ManifestCategory::explicit_layer, null_path.str());
38285db71995Sopenharmony_ci
38295db71995Sopenharmony_ci    const char* layer_name = "TestLayer";
38305db71995Sopenharmony_ci    env.add_explicit_layer(
38315db71995Sopenharmony_ci        ManifestLayer{}.add_layer(
38325db71995Sopenharmony_ci            ManifestLayer::LayerDescription{}.set_name(layer_name).set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)),
38335db71995Sopenharmony_ci        "test_layer.json");
38345db71995Sopenharmony_ci
38355db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
38365db71995Sopenharmony_ci    inst.create_info.add_layer(layer_name);
38375db71995Sopenharmony_ci    inst.CheckCreate();
38385db71995Sopenharmony_ci}
38395db71995Sopenharmony_ci
38405db71995Sopenharmony_ci// Check that the de-duplication of drivers found in both PnP and generic Khronos/Vulkan/Drivers doesn't result in the same thing
38415db71995Sopenharmony_ci// being added twice
38425db71995Sopenharmony_ciTEST(DuplicateRegistryEntries, Drivers) {
38435db71995Sopenharmony_ci    FrameworkEnvironment env{};
38445db71995Sopenharmony_ci    auto null_path = env.get_folder(ManifestLocation::null).location() / "test_icd_0.json";
38455db71995Sopenharmony_ci    env.platform_shim->add_manifest(ManifestCategory::icd, null_path.str());
38465db71995Sopenharmony_ci
38475db71995Sopenharmony_ci    env.add_icd(TestICDDetails{TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA}.set_discovery_type(ManifestDiscoveryType::null_dir))
38485db71995Sopenharmony_ci        .add_physical_device("physical_device_0")
38495db71995Sopenharmony_ci        .set_adapterLUID(_LUID{10, 1000});
38505db71995Sopenharmony_ci    env.platform_shim->add_d3dkmt_adapter(D3DKMT_Adapter{0, _LUID{10, 1000}}.add_driver_manifest_path(env.get_icd_manifest_path()));
38515db71995Sopenharmony_ci
38525db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
38535db71995Sopenharmony_ci    FillDebugUtilsCreateDetails(inst.create_info, env.debug_log);
38545db71995Sopenharmony_ci    inst.CheckCreate();
38555db71995Sopenharmony_ci    ASSERT_TRUE(env.debug_log.find(std::string("Skipping adding of json file \"") + null_path.str() +
38565db71995Sopenharmony_ci                                   "\" from registry \"HKEY_LOCAL_MACHINE\\" VK_DRIVERS_INFO_REGISTRY_LOC
38575db71995Sopenharmony_ci                                   "\" to the list due to duplication"));
38585db71995Sopenharmony_ci}
38595db71995Sopenharmony_ci#endif
38605db71995Sopenharmony_ci
38615db71995Sopenharmony_ciTEST(LibraryLoading, SystemLocations) {
38625db71995Sopenharmony_ci    FrameworkEnvironment env{};
38635db71995Sopenharmony_ci    EnvVarWrapper ld_library_path("LD_LIBRARY_PATH", env.get_folder(ManifestLocation::driver).location().str());
38645db71995Sopenharmony_ci    ld_library_path.add_to_list(env.get_folder(ManifestLocation::explicit_layer).location().str());
38655db71995Sopenharmony_ci
38665db71995Sopenharmony_ci    auto& driver = env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2).set_library_path_type(LibraryPathType::default_search_paths))
38675db71995Sopenharmony_ci                       .add_physical_device({});
38685db71995Sopenharmony_ci    const char* fake_ext_name = "VK_FAKE_extension";
38695db71995Sopenharmony_ci    driver.physical_devices.back().add_extension(fake_ext_name);
38705db71995Sopenharmony_ci
38715db71995Sopenharmony_ci    const char* layer_name = "TestLayer";
38725db71995Sopenharmony_ci    env.add_explicit_layer(
38735db71995Sopenharmony_ci        TestLayerDetails{ManifestLayer{}.add_layer(
38745db71995Sopenharmony_ci                             ManifestLayer::LayerDescription{}.set_name(layer_name).set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)),
38755db71995Sopenharmony_ci                         "test_layer.json"}
38765db71995Sopenharmony_ci            .set_library_path_type(LibraryPathType::default_search_paths));
38775db71995Sopenharmony_ci
38785db71995Sopenharmony_ci    auto props = env.GetLayerProperties(1);
38795db71995Sopenharmony_ci    ASSERT_TRUE(string_eq(props.at(0).layerName, layer_name));
38805db71995Sopenharmony_ci
38815db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
38825db71995Sopenharmony_ci    inst.create_info.add_layer(layer_name);
38835db71995Sopenharmony_ci    FillDebugUtilsCreateDetails(inst.create_info, env.debug_log);
38845db71995Sopenharmony_ci    inst.CheckCreate();
38855db71995Sopenharmony_ci
38865db71995Sopenharmony_ci    auto phys_dev = inst.GetPhysDev();
38875db71995Sopenharmony_ci
38885db71995Sopenharmony_ci    auto active_props = inst.GetActiveLayers(phys_dev, 1);
38895db71995Sopenharmony_ci    ASSERT_TRUE(string_eq(active_props.at(0).layerName, layer_name));
38905db71995Sopenharmony_ci
38915db71995Sopenharmony_ci    auto device_extensions = inst.EnumerateDeviceExtensions(phys_dev, 1);
38925db71995Sopenharmony_ci    ASSERT_TRUE(string_eq(device_extensions.at(0).extensionName, fake_ext_name));
38935db71995Sopenharmony_ci}
38945db71995Sopenharmony_ci
38955db71995Sopenharmony_ci#if defined(__linux__) || defined(__FreeBSD__) || defined(__OpenBSD__)
38965db71995Sopenharmony_ci// Check that valid symlinks do not cause the loader to crash when directly in an XDG env-var
38975db71995Sopenharmony_ciTEST(ManifestDiscovery, ValidSymlinkInXDGEnvVar) {
38985db71995Sopenharmony_ci    FrameworkEnvironment env{FrameworkSettings{}.set_enable_default_search_paths(false)};
38995db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA).set_discovery_type(ManifestDiscoveryType::override_folder))
39005db71995Sopenharmony_ci        .add_physical_device({});
39015db71995Sopenharmony_ci    auto driver_path = env.get_icd_manifest_path(0);
39025db71995Sopenharmony_ci    std::string symlink_name = "symlink_to_driver.json";
39035db71995Sopenharmony_ci    fs::path symlink_path = env.get_folder(ManifestLocation::driver_env_var).location() / symlink_name;
39045db71995Sopenharmony_ci    env.get_folder(ManifestLocation::driver_env_var).add_existing_file(symlink_name);
39055db71995Sopenharmony_ci    int res = symlink(driver_path.c_str(), symlink_path.c_str());
39065db71995Sopenharmony_ci    ASSERT_EQ(res, 0);
39075db71995Sopenharmony_ci    EnvVarWrapper xdg_config_dirs_env_var{"XDG_CONFIG_DIRS", symlink_path.str()};
39085db71995Sopenharmony_ci
39095db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
39105db71995Sopenharmony_ci    FillDebugUtilsCreateDetails(inst.create_info, env.debug_log);
39115db71995Sopenharmony_ci    inst.CheckCreate();
39125db71995Sopenharmony_ci}
39135db71995Sopenharmony_ci
39145db71995Sopenharmony_ci// Check that valid symlinks do not cause the loader to crash
39155db71995Sopenharmony_ciTEST(ManifestDiscovery, ValidSymlink) {
39165db71995Sopenharmony_ci    FrameworkEnvironment env{FrameworkSettings{}.set_enable_default_search_paths(false)};
39175db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA).set_discovery_type(ManifestDiscoveryType::override_folder))
39185db71995Sopenharmony_ci        .add_physical_device({});
39195db71995Sopenharmony_ci
39205db71995Sopenharmony_ci    auto driver_path = env.get_icd_manifest_path(0);
39215db71995Sopenharmony_ci    std::string symlink_name = "symlink_to_driver.json";
39225db71995Sopenharmony_ci    fs::path symlink_path = env.get_folder(ManifestLocation::driver_env_var).location() / symlink_name;
39235db71995Sopenharmony_ci    env.get_folder(ManifestLocation::driver_env_var).add_existing_file(symlink_name);
39245db71995Sopenharmony_ci    int res = symlink(driver_path.c_str(), symlink_path.c_str());
39255db71995Sopenharmony_ci    ASSERT_EQ(res, 0);
39265db71995Sopenharmony_ci
39275db71995Sopenharmony_ci    env.platform_shim->set_fake_path(ManifestCategory::icd, env.get_folder(ManifestLocation::driver_env_var).location());
39285db71995Sopenharmony_ci
39295db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
39305db71995Sopenharmony_ci    FillDebugUtilsCreateDetails(inst.create_info, env.debug_log);
39315db71995Sopenharmony_ci    inst.CheckCreate();
39325db71995Sopenharmony_ci}
39335db71995Sopenharmony_ci
39345db71995Sopenharmony_ci// Check that invalid symlinks do not cause the loader to crash when directly in an XDG env-var
39355db71995Sopenharmony_ciTEST(ManifestDiscovery, InvalidSymlinkXDGEnvVar) {
39365db71995Sopenharmony_ci    FrameworkEnvironment env{FrameworkSettings{}.set_enable_default_search_paths(false)};
39375db71995Sopenharmony_ci    std::string symlink_name = "symlink_to_nothing.json";
39385db71995Sopenharmony_ci    fs::path symlink_path = env.get_folder(ManifestLocation::driver_env_var).location() / symlink_name;
39395db71995Sopenharmony_ci    fs::path invalid_driver_path = env.get_folder(ManifestLocation::driver).location() / "nothing_here.json";
39405db71995Sopenharmony_ci    int res = symlink(invalid_driver_path.c_str(), symlink_path.c_str());
39415db71995Sopenharmony_ci    ASSERT_EQ(res, 0);
39425db71995Sopenharmony_ci    env.get_folder(ManifestLocation::driver_env_var).add_existing_file(symlink_name);
39435db71995Sopenharmony_ci
39445db71995Sopenharmony_ci    EnvVarWrapper xdg_config_dirs_env_var{symlink_path.str()};
39455db71995Sopenharmony_ci
39465db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
39475db71995Sopenharmony_ci    FillDebugUtilsCreateDetails(inst.create_info, env.debug_log);
39485db71995Sopenharmony_ci    inst.CheckCreate(VK_ERROR_INCOMPATIBLE_DRIVER);
39495db71995Sopenharmony_ci}
39505db71995Sopenharmony_ci
39515db71995Sopenharmony_ci// Check that invalid symlinks do not cause the loader to crash
39525db71995Sopenharmony_ciTEST(ManifestDiscovery, InvalidSymlink) {
39535db71995Sopenharmony_ci    FrameworkEnvironment env{FrameworkSettings{}.set_enable_default_search_paths(false)};
39545db71995Sopenharmony_ci    std::string symlink_name = "symlink_to_nothing.json";
39555db71995Sopenharmony_ci    fs::path symlink_path = env.get_folder(ManifestLocation::driver).location() / symlink_name;
39565db71995Sopenharmony_ci    fs::path invalid_driver_path = env.get_folder(ManifestLocation::driver_env_var).location() / "nothing_here.json";
39575db71995Sopenharmony_ci    int res = symlink(invalid_driver_path.c_str(), symlink_path.c_str());
39585db71995Sopenharmony_ci    ASSERT_EQ(res, 0);
39595db71995Sopenharmony_ci    env.get_folder(ManifestLocation::driver).add_existing_file(symlink_name);
39605db71995Sopenharmony_ci
39615db71995Sopenharmony_ci    env.platform_shim->set_fake_path(ManifestCategory::icd, env.get_folder(ManifestLocation::driver_env_var).location());
39625db71995Sopenharmony_ci
39635db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
39645db71995Sopenharmony_ci    FillDebugUtilsCreateDetails(inst.create_info, env.debug_log);
39655db71995Sopenharmony_ci    inst.CheckCreate(VK_ERROR_INCOMPATIBLE_DRIVER);
39665db71995Sopenharmony_ci}
39675db71995Sopenharmony_ci#endif
39685db71995Sopenharmony_ci
39695db71995Sopenharmony_ci#if defined(__APPLE__)
39705db71995Sopenharmony_ci// Add two drivers, one to the bundle and one to the system locations
39715db71995Sopenharmony_ciTEST(ManifestDiscovery, AppleBundles) {
39725db71995Sopenharmony_ci    FrameworkEnvironment env{};
39735db71995Sopenharmony_ci    env.setup_macos_bundle();
39745db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA).set_discovery_type(ManifestDiscoveryType::macos_bundle));
39755db71995Sopenharmony_ci    env.get_test_icd(0).physical_devices.push_back({});
39765db71995Sopenharmony_ci    env.get_test_icd(0).physical_devices.at(0).properties.deviceID = 1337;
39775db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA));
39785db71995Sopenharmony_ci    env.get_test_icd(1).physical_devices.push_back({});
39795db71995Sopenharmony_ci    env.get_test_icd(1).physical_devices.at(0).properties.deviceID = 9999;
39805db71995Sopenharmony_ci
39815db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
39825db71995Sopenharmony_ci    ASSERT_NO_FATAL_FAILURE(inst.CheckCreate());
39835db71995Sopenharmony_ci    auto physical_devices = inst.GetPhysDevs();
39845db71995Sopenharmony_ci    ASSERT_EQ(1, physical_devices.size());
39855db71995Sopenharmony_ci
39865db71995Sopenharmony_ci    // Verify that this is the 'right' GPU, aka the one from the bundle
39875db71995Sopenharmony_ci    VkPhysicalDeviceProperties props{};
39885db71995Sopenharmony_ci    inst->vkGetPhysicalDeviceProperties(physical_devices[0], &props);
39895db71995Sopenharmony_ci    ASSERT_EQ(env.get_test_icd(0).physical_devices.at(0).properties.deviceID, props.deviceID);
39905db71995Sopenharmony_ci}
39915db71995Sopenharmony_ci
39925db71995Sopenharmony_ci// Add two drivers, one to the bundle and one using the driver env-var
39935db71995Sopenharmony_ciTEST(ManifestDiscovery, AppleBundlesEnvVarActive) {
39945db71995Sopenharmony_ci    FrameworkEnvironment env{};
39955db71995Sopenharmony_ci    env.setup_macos_bundle();
39965db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA).set_discovery_type(ManifestDiscoveryType::macos_bundle));
39975db71995Sopenharmony_ci    env.get_test_icd(0).physical_devices.push_back({});
39985db71995Sopenharmony_ci    env.get_test_icd(0).physical_devices.at(0).properties.deviceID = 1337;
39995db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA).set_discovery_type(ManifestDiscoveryType::env_var));
40005db71995Sopenharmony_ci    env.get_test_icd(1).physical_devices.push_back({});
40015db71995Sopenharmony_ci    env.get_test_icd(1).physical_devices.at(0).properties.deviceID = 9999;
40025db71995Sopenharmony_ci
40035db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
40045db71995Sopenharmony_ci    ASSERT_NO_FATAL_FAILURE(inst.CheckCreate());
40055db71995Sopenharmony_ci    auto physical_devices = inst.GetPhysDevs();
40065db71995Sopenharmony_ci    ASSERT_EQ(1, physical_devices.size());
40075db71995Sopenharmony_ci
40085db71995Sopenharmony_ci    // Verify that this is the 'right' GPU, aka the one from the env-var
40095db71995Sopenharmony_ci    VkPhysicalDeviceProperties props{};
40105db71995Sopenharmony_ci    inst->vkGetPhysicalDeviceProperties(physical_devices[0], &props);
40115db71995Sopenharmony_ci    ASSERT_EQ(env.get_test_icd(1).physical_devices.at(0).properties.deviceID, props.deviceID);
40125db71995Sopenharmony_ci}
40135db71995Sopenharmony_ci#endif
40145db71995Sopenharmony_ci
40155db71995Sopenharmony_ciTEST(LayerCreatesDevice, Basic) {
40165db71995Sopenharmony_ci    FrameworkEnvironment env{};
40175db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2)).add_physical_device({});
40185db71995Sopenharmony_ci
40195db71995Sopenharmony_ci    env.add_implicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{}
40205db71995Sopenharmony_ci                                                         .set_name("implicit_layer_name")
40215db71995Sopenharmony_ci                                                         .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)
40225db71995Sopenharmony_ci                                                         .set_disable_environment("DISABLE_ME")),
40235db71995Sopenharmony_ci                           "implicit_test_layer.json");
40245db71995Sopenharmony_ci    env.get_test_layer().set_call_create_device_while_create_device_is_called(true);
40255db71995Sopenharmony_ci    env.get_test_layer().set_physical_device_index_to_use_during_create_device(0);
40265db71995Sopenharmony_ci
40275db71995Sopenharmony_ci    env.add_implicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{}
40285db71995Sopenharmony_ci                                                         .set_name("implicit_layer_name2")
40295db71995Sopenharmony_ci                                                         .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)
40305db71995Sopenharmony_ci                                                         .set_disable_environment("DISABLE_ME")),
40315db71995Sopenharmony_ci                           "implicit_test_layer2.json");
40325db71995Sopenharmony_ci
40335db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
40345db71995Sopenharmony_ci    inst.CheckCreate();
40355db71995Sopenharmony_ci
40365db71995Sopenharmony_ci    DeviceWrapper dev{inst};
40375db71995Sopenharmony_ci    dev.CheckCreate(inst.GetPhysDev());
40385db71995Sopenharmony_ci}
40395db71995Sopenharmony_ci
40405db71995Sopenharmony_ciTEST(LayerCreatesDevice, DifferentPhysicalDevice) {
40415db71995Sopenharmony_ci    FrameworkEnvironment env{};
40425db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2));
40435db71995Sopenharmony_ci    env.get_test_icd(0).physical_devices.emplace_back("Device0");
40445db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2));
40455db71995Sopenharmony_ci    env.get_test_icd(1).physical_devices.emplace_back("Device1");
40465db71995Sopenharmony_ci
40475db71995Sopenharmony_ci    env.add_implicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{}
40485db71995Sopenharmony_ci                                                         .set_name("implicit_layer_name")
40495db71995Sopenharmony_ci                                                         .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)
40505db71995Sopenharmony_ci                                                         .set_disable_environment("DISABLE_ME")),
40515db71995Sopenharmony_ci                           "implicit_test_layer.json");
40525db71995Sopenharmony_ci    env.get_test_layer().set_call_create_device_while_create_device_is_called(true);
40535db71995Sopenharmony_ci    env.get_test_layer().set_physical_device_index_to_use_during_create_device(1);
40545db71995Sopenharmony_ci
40555db71995Sopenharmony_ci    env.add_implicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{}
40565db71995Sopenharmony_ci                                                         .set_name("implicit_layer_name2")
40575db71995Sopenharmony_ci                                                         .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)
40585db71995Sopenharmony_ci                                                         .set_disable_environment("DISABLE_ME")),
40595db71995Sopenharmony_ci                           "implicit_test_layer2.json");
40605db71995Sopenharmony_ci
40615db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
40625db71995Sopenharmony_ci    inst.CheckCreate();
40635db71995Sopenharmony_ci
40645db71995Sopenharmony_ci    auto phys_devs = inst.GetPhysDevs();
40655db71995Sopenharmony_ci
40665db71995Sopenharmony_ci    DeviceWrapper dev{inst};
40675db71995Sopenharmony_ci    dev.CheckCreate(phys_devs.at(0));
40685db71995Sopenharmony_ci}
40695db71995Sopenharmony_ci
40705db71995Sopenharmony_ciTEST(Layer, pfnNextGetInstanceProcAddr_should_not_return_layers_own_functions) {
40715db71995Sopenharmony_ci    FrameworkEnvironment env{};
40725db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2)).add_physical_device({});
40735db71995Sopenharmony_ci
40745db71995Sopenharmony_ci    env.add_implicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{}
40755db71995Sopenharmony_ci                                                         .set_name("implicit_layer_name")
40765db71995Sopenharmony_ci                                                         .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)
40775db71995Sopenharmony_ci                                                         .set_disable_environment("DISABLE_ME")),
40785db71995Sopenharmony_ci                           "implicit_test_layer.json");
40795db71995Sopenharmony_ci    env.get_test_layer(0).set_check_if_EnumDevExtProps_is_same_as_queried_function(true);
40805db71995Sopenharmony_ci
40815db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
40825db71995Sopenharmony_ci    inst.CheckCreate();
40835db71995Sopenharmony_ci
40845db71995Sopenharmony_ci    auto phys_devs = inst.GetPhysDevs();
40855db71995Sopenharmony_ci
40865db71995Sopenharmony_ci    DeviceWrapper dev{inst};
40875db71995Sopenharmony_ci    dev.CheckCreate(phys_devs.at(0));
40885db71995Sopenharmony_ci}
40895db71995Sopenharmony_ci
40905db71995Sopenharmony_ciTEST(Layer, LLP_LAYER_21) {
40915db71995Sopenharmony_ci    FrameworkEnvironment env{};
40925db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2)).add_physical_device({});
40935db71995Sopenharmony_ci
40945db71995Sopenharmony_ci    env.add_implicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{}
40955db71995Sopenharmony_ci                                                         .set_name("implicit_layer_name")
40965db71995Sopenharmony_ci                                                         .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)
40975db71995Sopenharmony_ci                                                         .set_disable_environment("DISABLE_ME")),
40985db71995Sopenharmony_ci                           "implicit_test_layer.json");
40995db71995Sopenharmony_ci    env.get_test_layer(0).set_clobber_pInstance(true);
41005db71995Sopenharmony_ci
41015db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
41025db71995Sopenharmony_ci    FillDebugUtilsCreateDetails(inst.create_info, env.debug_log);
41035db71995Sopenharmony_ci#if defined(WIN32)
41045db71995Sopenharmony_ci#if defined(_WIN64)
41055db71995Sopenharmony_ci    ASSERT_DEATH(
41065db71995Sopenharmony_ci        inst.CheckCreate(),
41075db71995Sopenharmony_ci        testing::ContainsRegex(
41085db71995Sopenharmony_ci            R"(terminator_CreateInstance: Instance pointer \(................\) has invalid MAGIC value 0x00000000. Instance value )"
41095db71995Sopenharmony_ci            R"(possibly corrupted by active layer \(Policy #LLP_LAYER_21\))"));
41105db71995Sopenharmony_ci#else
41115db71995Sopenharmony_ci    ASSERT_DEATH(
41125db71995Sopenharmony_ci        inst.CheckCreate(),
41135db71995Sopenharmony_ci        testing::ContainsRegex(
41145db71995Sopenharmony_ci            R"(terminator_CreateInstance: Instance pointer \(........\) has invalid MAGIC value 0x00000000. Instance value )"
41155db71995Sopenharmony_ci            R"(possibly corrupted by active layer \(Policy #LLP_LAYER_21\))"));
41165db71995Sopenharmony_ci#endif
41175db71995Sopenharmony_ci#else
41185db71995Sopenharmony_ci    ASSERT_DEATH(
41195db71995Sopenharmony_ci        inst.CheckCreate(),
41205db71995Sopenharmony_ci        testing::ContainsRegex(
41215db71995Sopenharmony_ci            R"(terminator_CreateInstance: Instance pointer \(0x[0-9A-Fa-f]+\) has invalid MAGIC value 0x00000000. Instance value )"
41225db71995Sopenharmony_ci            R"(possibly corrupted by active layer \(Policy #LLP_LAYER_21\))"));
41235db71995Sopenharmony_ci#endif
41245db71995Sopenharmony_ci}
41255db71995Sopenharmony_ci
41265db71995Sopenharmony_ciTEST(Layer, LLP_LAYER_22) {
41275db71995Sopenharmony_ci    FrameworkEnvironment env{};
41285db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2)).add_physical_device({});
41295db71995Sopenharmony_ci
41305db71995Sopenharmony_ci    env.add_implicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{}
41315db71995Sopenharmony_ci                                                         .set_name("implicit_layer_name")
41325db71995Sopenharmony_ci                                                         .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)
41335db71995Sopenharmony_ci                                                         .set_disable_environment("DISABLE_ME")),
41345db71995Sopenharmony_ci                           "implicit_test_layer.json");
41355db71995Sopenharmony_ci    env.get_test_layer(0).set_clobber_pDevice(true);
41365db71995Sopenharmony_ci
41375db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
41385db71995Sopenharmony_ci    inst.create_info.add_extension("VK_EXT_debug_utils");
41395db71995Sopenharmony_ci    inst.CheckCreate();
41405db71995Sopenharmony_ci
41415db71995Sopenharmony_ci    DebugUtilsWrapper log{inst};
41425db71995Sopenharmony_ci    CreateDebugUtilsMessenger(log);
41435db71995Sopenharmony_ci
41445db71995Sopenharmony_ci    DeviceWrapper dev{inst};
41455db71995Sopenharmony_ci#if defined(WIN32)
41465db71995Sopenharmony_ci#if defined(_WIN64)
41475db71995Sopenharmony_ci    ASSERT_DEATH(
41485db71995Sopenharmony_ci        dev.CheckCreate(inst.GetPhysDev()),
41495db71995Sopenharmony_ci        testing::ContainsRegex(
41505db71995Sopenharmony_ci            R"(terminator_CreateDevice: Device pointer \(................\) has invalid MAGIC value 0x00000000. The expected value is 0x10ADED040410ADED. Device value )"
41515db71995Sopenharmony_ci            R"(possibly corrupted by active layer \(Policy #LLP_LAYER_22\))"));
41525db71995Sopenharmony_ci#else
41535db71995Sopenharmony_ci    ASSERT_DEATH(
41545db71995Sopenharmony_ci        dev.CheckCreate(inst.GetPhysDev()),
41555db71995Sopenharmony_ci        testing::ContainsRegex(
41565db71995Sopenharmony_ci            R"(terminator_CreateDevice: Device pointer \(........\) has invalid MAGIC value 0x00000000. The expected value is 0x10ADED040410ADED. Device value )"
41575db71995Sopenharmony_ci            R"(possibly corrupted by active layer \(Policy #LLP_LAYER_22\))"));
41585db71995Sopenharmony_ci#endif
41595db71995Sopenharmony_ci#else
41605db71995Sopenharmony_ci    ASSERT_DEATH(
41615db71995Sopenharmony_ci        dev.CheckCreate(inst.GetPhysDev()),
41625db71995Sopenharmony_ci        testing::ContainsRegex(
41635db71995Sopenharmony_ci            R"(terminator_CreateDevice: Device pointer \(0x[0-9A-Fa-f]+\) has invalid MAGIC value 0x00000000. The expected value is 0x10ADED040410ADED. Device value )"
41645db71995Sopenharmony_ci            R"(possibly corrupted by active layer \(Policy #LLP_LAYER_22\))"));
41655db71995Sopenharmony_ci#endif
41665db71995Sopenharmony_ci}
41675db71995Sopenharmony_ci
41685db71995Sopenharmony_ciTEST(InvalidManifest, ICD) {
41695db71995Sopenharmony_ci    FrameworkEnvironment env{};
41705db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2)).add_physical_device({});
41715db71995Sopenharmony_ci
41725db71995Sopenharmony_ci    std::vector<std::string> invalid_jsons;
41735db71995Sopenharmony_ci    invalid_jsons.push_back(",");
41745db71995Sopenharmony_ci    invalid_jsons.push_back("{},[]");
41755db71995Sopenharmony_ci    invalid_jsons.push_back("{ \"foo\":\"bar\", }");
41765db71995Sopenharmony_ci    invalid_jsons.push_back("{\"foo\":\"bar\", \"baz\": [], },");
41775db71995Sopenharmony_ci    invalid_jsons.push_back("{\"foo\":\"bar\", \"baz\": [{},] },");
41785db71995Sopenharmony_ci    invalid_jsons.push_back("{\"foo\":\"bar\", \"baz\": {\"fee\"} },");
41795db71995Sopenharmony_ci    invalid_jsons.push_back("{\"\":\"bar\", \"baz\": {}");
41805db71995Sopenharmony_ci    invalid_jsons.push_back("{\"foo\":\"bar\", \"baz\": {\"fee\":1234, true, \"ab\":\"bc\"} },");
41815db71995Sopenharmony_ci
41825db71995Sopenharmony_ci    for (size_t i = 0; i < invalid_jsons.size(); i++) {
41835db71995Sopenharmony_ci        auto file_name = std::string("invalid_driver_") + std::to_string(i) + ".json";
41845db71995Sopenharmony_ci        fs::path new_path = env.get_folder(ManifestLocation::driver).write_manifest(file_name, invalid_jsons[i]);
41855db71995Sopenharmony_ci        env.platform_shim->add_manifest(ManifestCategory::icd, new_path);
41865db71995Sopenharmony_ci    }
41875db71995Sopenharmony_ci
41885db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
41895db71995Sopenharmony_ci    inst.CheckCreate();
41905db71995Sopenharmony_ci}
41915db71995Sopenharmony_ci
41925db71995Sopenharmony_ciTEST(InvalidManifest, Layer) {
41935db71995Sopenharmony_ci    FrameworkEnvironment env{};
41945db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2)).add_physical_device({});
41955db71995Sopenharmony_ci
41965db71995Sopenharmony_ci    std::vector<std::string> invalid_jsons;
41975db71995Sopenharmony_ci    invalid_jsons.push_back(",");
41985db71995Sopenharmony_ci    invalid_jsons.push_back("{},[]");
41995db71995Sopenharmony_ci    invalid_jsons.push_back("{ \"foo\":\"bar\", }");
42005db71995Sopenharmony_ci    invalid_jsons.push_back("{\"foo\":\"bar\", \"baz\": [], },");
42015db71995Sopenharmony_ci    invalid_jsons.push_back("{\"foo\":\"bar\", \"baz\": [{},] },");
42025db71995Sopenharmony_ci    invalid_jsons.push_back("{\"foo\":\"bar\", \"baz\": {\"fee\"} },");
42035db71995Sopenharmony_ci    invalid_jsons.push_back("{\"\":\"bar\", \"baz\": {}");
42045db71995Sopenharmony_ci    invalid_jsons.push_back("{\"foo\":\"bar\", \"baz\": {\"fee\":1234, true, \"ab\":\"bc\"} },");
42055db71995Sopenharmony_ci
42065db71995Sopenharmony_ci    for (size_t i = 0; i < invalid_jsons.size(); i++) {
42075db71995Sopenharmony_ci        auto file_name = std::string("invalid_implicit_layer_") + std::to_string(i) + ".json";
42085db71995Sopenharmony_ci        fs::path new_path = env.get_folder(ManifestLocation::implicit_layer).write_manifest(file_name, invalid_jsons[i]);
42095db71995Sopenharmony_ci        env.platform_shim->add_manifest(ManifestCategory::implicit_layer, new_path);
42105db71995Sopenharmony_ci    }
42115db71995Sopenharmony_ci
42125db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
42135db71995Sopenharmony_ci    inst.CheckCreate();
42145db71995Sopenharmony_ci}
42155db71995Sopenharmony_ci#if defined(WIN32)
42165db71995Sopenharmony_civoid add_dxgi_adapter(FrameworkEnvironment& env, const char* name, LUID luid, uint32_t vendor_id) {
42175db71995Sopenharmony_ci    auto& driver = env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_6).set_discovery_type(ManifestDiscoveryType::null_dir));
42185db71995Sopenharmony_ci    driver.set_min_icd_interface_version(5);
42195db71995Sopenharmony_ci    driver.set_max_icd_interface_version(6);
42205db71995Sopenharmony_ci    driver.setup_WSI();
42215db71995Sopenharmony_ci    driver.set_icd_api_version(VK_API_VERSION_1_1);
42225db71995Sopenharmony_ci    driver.physical_devices.emplace_back(name);
42235db71995Sopenharmony_ci    auto& pd0 = driver.physical_devices.back();
42245db71995Sopenharmony_ci    pd0.properties.apiVersion = VK_API_VERSION_1_1;
42255db71995Sopenharmony_ci
42265db71995Sopenharmony_ci    DXGI_ADAPTER_DESC1 desc{};
42275db71995Sopenharmony_ci    desc.VendorId = known_driver_list.at(vendor_id).vendor_id;
42285db71995Sopenharmony_ci    desc.AdapterLuid = luid;
42295db71995Sopenharmony_ci    auto wide_name = conver_str_to_wstr(name);
42305db71995Sopenharmony_ci    wcsncpy_s(desc.Description, 128, wide_name.c_str(), wide_name.size());
42315db71995Sopenharmony_ci    driver.set_adapterLUID(desc.AdapterLuid);
42325db71995Sopenharmony_ci    env.platform_shim->add_dxgi_adapter(GpuType::discrete, desc);
42335db71995Sopenharmony_ci
42345db71995Sopenharmony_ci    env.platform_shim->add_d3dkmt_adapter(
42355db71995Sopenharmony_ci        D3DKMT_Adapter{static_cast<UINT>(env.icds.size()) - 1U, desc.AdapterLuid}.add_driver_manifest_path(
42365db71995Sopenharmony_ci            env.get_icd_manifest_path(env.icds.size() - 1)));
42375db71995Sopenharmony_ci}
42385db71995Sopenharmony_ci
42395db71995Sopenharmony_ciTEST(EnumerateAdapterPhysicalDevices, SameAdapterLUID_reordered) {
42405db71995Sopenharmony_ci    FrameworkEnvironment env;
42415db71995Sopenharmony_ci
42425db71995Sopenharmony_ci    uint32_t physical_count = 3;
42435db71995Sopenharmony_ci
42445db71995Sopenharmony_ci    // Physical devices are enumerate in reverse order to the drivers insertion into the test framework
42455db71995Sopenharmony_ci    add_dxgi_adapter(env, "physical_device_2", LUID{10, 100}, 2);
42465db71995Sopenharmony_ci    add_dxgi_adapter(env, "physical_device_1", LUID{20, 200}, 1);
42475db71995Sopenharmony_ci    add_dxgi_adapter(env, "physical_device_0", LUID{10, 100}, 2);
42485db71995Sopenharmony_ci
42495db71995Sopenharmony_ci    {
42505db71995Sopenharmony_ci        uint32_t returned_physical_count = 0;
42515db71995Sopenharmony_ci        InstWrapper inst{env.vulkan_functions};
42525db71995Sopenharmony_ci        inst.create_info.setup_WSI().set_api_version(VK_API_VERSION_1_1);
42535db71995Sopenharmony_ci        inst.CheckCreate();
42545db71995Sopenharmony_ci
42555db71995Sopenharmony_ci        ASSERT_EQ(VK_SUCCESS, env.vulkan_functions.vkEnumeratePhysicalDevices(inst.inst, &returned_physical_count, nullptr));
42565db71995Sopenharmony_ci        ASSERT_EQ(physical_count, returned_physical_count);
42575db71995Sopenharmony_ci        std::vector<VkPhysicalDevice> physical_device_handles{returned_physical_count};
42585db71995Sopenharmony_ci        ASSERT_EQ(VK_SUCCESS, env.vulkan_functions.vkEnumeratePhysicalDevices(inst.inst, &returned_physical_count,
42595db71995Sopenharmony_ci                                                                              physical_device_handles.data()));
42605db71995Sopenharmony_ci        ASSERT_EQ(physical_count, returned_physical_count);
42615db71995Sopenharmony_ci
42625db71995Sopenharmony_ci        VkPhysicalDeviceProperties phys_dev_props[3]{};
42635db71995Sopenharmony_ci        env.vulkan_functions.vkGetPhysicalDeviceProperties(physical_device_handles[0], &(phys_dev_props[0]));
42645db71995Sopenharmony_ci        env.vulkan_functions.vkGetPhysicalDeviceProperties(physical_device_handles[1], &(phys_dev_props[1]));
42655db71995Sopenharmony_ci        env.vulkan_functions.vkGetPhysicalDeviceProperties(physical_device_handles[2], &(phys_dev_props[2]));
42665db71995Sopenharmony_ci
42675db71995Sopenharmony_ci        EXPECT_TRUE(string_eq(phys_dev_props[0].deviceName, "physical_device_0"));
42685db71995Sopenharmony_ci        EXPECT_TRUE(string_eq(phys_dev_props[1].deviceName, "physical_device_2"));
42695db71995Sopenharmony_ci        // Because LUID{10,100} is encountered first, all physical devices which correspond to that LUID are enumerated before any
42705db71995Sopenharmony_ci        // other physical devices.
42715db71995Sopenharmony_ci        EXPECT_TRUE(string_eq(phys_dev_props[2].deviceName, "physical_device_1"));
42725db71995Sopenharmony_ci
42735db71995Sopenharmony_ci        // Check that both devices do not report VK_LAYERED_DRIVER_UNDERLYING_API_D3D12_MSFT
42745db71995Sopenharmony_ci        VkPhysicalDeviceLayeredDriverPropertiesMSFT layered_driver_properties_msft{};
42755db71995Sopenharmony_ci        layered_driver_properties_msft.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LAYERED_DRIVER_PROPERTIES_MSFT;
42765db71995Sopenharmony_ci        VkPhysicalDeviceProperties2 props2{};
42775db71995Sopenharmony_ci        props2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2;
42785db71995Sopenharmony_ci        props2.pNext = (void*)&layered_driver_properties_msft;
42795db71995Sopenharmony_ci
42805db71995Sopenharmony_ci        env.vulkan_functions.vkGetPhysicalDeviceProperties2(physical_device_handles[0], &props2);
42815db71995Sopenharmony_ci        EXPECT_EQ(layered_driver_properties_msft.underlyingAPI, VK_LAYERED_DRIVER_UNDERLYING_API_NONE_MSFT);
42825db71995Sopenharmony_ci
42835db71995Sopenharmony_ci        env.vulkan_functions.vkGetPhysicalDeviceProperties2(physical_device_handles[1], &props2);
42845db71995Sopenharmony_ci        EXPECT_EQ(layered_driver_properties_msft.underlyingAPI, VK_LAYERED_DRIVER_UNDERLYING_API_NONE_MSFT);
42855db71995Sopenharmony_ci
42865db71995Sopenharmony_ci        env.vulkan_functions.vkGetPhysicalDeviceProperties2(physical_device_handles[2], &props2);
42875db71995Sopenharmony_ci        EXPECT_EQ(layered_driver_properties_msft.underlyingAPI, VK_LAYERED_DRIVER_UNDERLYING_API_NONE_MSFT);
42885db71995Sopenharmony_ci    }
42895db71995Sopenharmony_ci    // Set the first physical device that is enumerated to be a 'layered' driver so it should be swapped with the first physical
42905db71995Sopenharmony_ci    // device
42915db71995Sopenharmony_ci    env.get_test_icd(2).physical_devices.back().layered_driver_underlying_api = VK_LAYERED_DRIVER_UNDERLYING_API_D3D12_MSFT;
42925db71995Sopenharmony_ci    {
42935db71995Sopenharmony_ci        uint32_t returned_physical_count = 0;
42945db71995Sopenharmony_ci        InstWrapper inst{env.vulkan_functions};
42955db71995Sopenharmony_ci        inst.create_info.setup_WSI().set_api_version(VK_API_VERSION_1_1);
42965db71995Sopenharmony_ci        inst.CheckCreate();
42975db71995Sopenharmony_ci
42985db71995Sopenharmony_ci        ASSERT_EQ(VK_SUCCESS, env.vulkan_functions.vkEnumeratePhysicalDevices(inst.inst, &returned_physical_count, nullptr));
42995db71995Sopenharmony_ci        ASSERT_EQ(physical_count, returned_physical_count);
43005db71995Sopenharmony_ci        std::vector<VkPhysicalDevice> physical_device_handles{returned_physical_count};
43015db71995Sopenharmony_ci        ASSERT_EQ(VK_SUCCESS, env.vulkan_functions.vkEnumeratePhysicalDevices(inst.inst, &returned_physical_count,
43025db71995Sopenharmony_ci                                                                              physical_device_handles.data()));
43035db71995Sopenharmony_ci        ASSERT_EQ(physical_count, returned_physical_count);
43045db71995Sopenharmony_ci
43055db71995Sopenharmony_ci        VkPhysicalDeviceProperties phys_dev_props[3]{};
43065db71995Sopenharmony_ci        env.vulkan_functions.vkGetPhysicalDeviceProperties(physical_device_handles[0], &(phys_dev_props[0]));
43075db71995Sopenharmony_ci        env.vulkan_functions.vkGetPhysicalDeviceProperties(physical_device_handles[1], &(phys_dev_props[1]));
43085db71995Sopenharmony_ci        env.vulkan_functions.vkGetPhysicalDeviceProperties(physical_device_handles[2], &(phys_dev_props[2]));
43095db71995Sopenharmony_ci
43105db71995Sopenharmony_ci        // Because the 'last' driver has the layered_driver set to D3D12, the order is modified
43115db71995Sopenharmony_ci        EXPECT_TRUE(string_eq(phys_dev_props[0].deviceName, "physical_device_2"));
43125db71995Sopenharmony_ci        EXPECT_TRUE(string_eq(phys_dev_props[1].deviceName, "physical_device_0"));
43135db71995Sopenharmony_ci        // Because LUID{10,100} is encountered first, all physical devices which correspond to that LUID are enumerated before any
43145db71995Sopenharmony_ci        // other physical devices.
43155db71995Sopenharmony_ci        EXPECT_TRUE(string_eq(phys_dev_props[2].deviceName, "physical_device_1"));
43165db71995Sopenharmony_ci
43175db71995Sopenharmony_ci        // Check that the correct physical device reports VK_LAYERED_DRIVER_UNDERLYING_API_D3D12_MSFT
43185db71995Sopenharmony_ci        VkPhysicalDeviceLayeredDriverPropertiesMSFT layered_driver_properties_msft{};
43195db71995Sopenharmony_ci        layered_driver_properties_msft.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LAYERED_DRIVER_PROPERTIES_MSFT;
43205db71995Sopenharmony_ci        VkPhysicalDeviceProperties2 props2{};
43215db71995Sopenharmony_ci        props2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2;
43225db71995Sopenharmony_ci        props2.pNext = (void*)&layered_driver_properties_msft;
43235db71995Sopenharmony_ci
43245db71995Sopenharmony_ci        env.vulkan_functions.vkGetPhysicalDeviceProperties2(physical_device_handles[0], &props2);
43255db71995Sopenharmony_ci        EXPECT_EQ(layered_driver_properties_msft.underlyingAPI, VK_LAYERED_DRIVER_UNDERLYING_API_NONE_MSFT);
43265db71995Sopenharmony_ci
43275db71995Sopenharmony_ci        env.vulkan_functions.vkGetPhysicalDeviceProperties2(physical_device_handles[1], &props2);
43285db71995Sopenharmony_ci        EXPECT_EQ(layered_driver_properties_msft.underlyingAPI, VK_LAYERED_DRIVER_UNDERLYING_API_D3D12_MSFT);
43295db71995Sopenharmony_ci
43305db71995Sopenharmony_ci        env.vulkan_functions.vkGetPhysicalDeviceProperties2(physical_device_handles[2], &props2);
43315db71995Sopenharmony_ci        EXPECT_EQ(layered_driver_properties_msft.underlyingAPI, VK_LAYERED_DRIVER_UNDERLYING_API_NONE_MSFT);
43325db71995Sopenharmony_ci    }
43335db71995Sopenharmony_ci}
43345db71995Sopenharmony_ci
43355db71995Sopenharmony_ciTEST(EnumerateAdapterPhysicalDevices, SameAdapterLUID_same_order) {
43365db71995Sopenharmony_ci    FrameworkEnvironment env;
43375db71995Sopenharmony_ci
43385db71995Sopenharmony_ci    uint32_t physical_count = 3;
43395db71995Sopenharmony_ci
43405db71995Sopenharmony_ci    // Physical devices are enumerate in reverse order to the drivers insertion into the test framework
43415db71995Sopenharmony_ci    add_dxgi_adapter(env, "physical_device_2", LUID{10, 100}, 2);
43425db71995Sopenharmony_ci    add_dxgi_adapter(env, "physical_device_1", LUID{20, 200}, 1);
43435db71995Sopenharmony_ci    add_dxgi_adapter(env, "physical_device_0", LUID{10, 100}, 2);
43445db71995Sopenharmony_ci
43455db71995Sopenharmony_ci    // Set the last physical device that is enumerated last to be a 'layered'  physical device - no swapping should occur
43465db71995Sopenharmony_ci    env.get_test_icd(0).physical_devices.back().layered_driver_underlying_api = VK_LAYERED_DRIVER_UNDERLYING_API_D3D12_MSFT;
43475db71995Sopenharmony_ci
43485db71995Sopenharmony_ci    uint32_t returned_physical_count = 0;
43495db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
43505db71995Sopenharmony_ci    inst.create_info.setup_WSI().set_api_version(VK_API_VERSION_1_1);
43515db71995Sopenharmony_ci    inst.CheckCreate();
43525db71995Sopenharmony_ci
43535db71995Sopenharmony_ci    ASSERT_EQ(VK_SUCCESS, env.vulkan_functions.vkEnumeratePhysicalDevices(inst.inst, &returned_physical_count, nullptr));
43545db71995Sopenharmony_ci    ASSERT_EQ(physical_count, returned_physical_count);
43555db71995Sopenharmony_ci    std::vector<VkPhysicalDevice> physical_device_handles{returned_physical_count};
43565db71995Sopenharmony_ci    ASSERT_EQ(VK_SUCCESS,
43575db71995Sopenharmony_ci              env.vulkan_functions.vkEnumeratePhysicalDevices(inst.inst, &returned_physical_count, physical_device_handles.data()));
43585db71995Sopenharmony_ci    ASSERT_EQ(physical_count, returned_physical_count);
43595db71995Sopenharmony_ci
43605db71995Sopenharmony_ci    VkPhysicalDeviceProperties phys_dev_props[3]{};
43615db71995Sopenharmony_ci    env.vulkan_functions.vkGetPhysicalDeviceProperties(physical_device_handles[0], &(phys_dev_props[0]));
43625db71995Sopenharmony_ci    env.vulkan_functions.vkGetPhysicalDeviceProperties(physical_device_handles[1], &(phys_dev_props[1]));
43635db71995Sopenharmony_ci    env.vulkan_functions.vkGetPhysicalDeviceProperties(physical_device_handles[2], &(phys_dev_props[2]));
43645db71995Sopenharmony_ci
43655db71995Sopenharmony_ci    // Make sure that reordering doesn't occur if the MSFT layered driver appears second
43665db71995Sopenharmony_ci    EXPECT_TRUE(string_eq(phys_dev_props[0].deviceName, "physical_device_0"));
43675db71995Sopenharmony_ci    EXPECT_TRUE(string_eq(phys_dev_props[1].deviceName, "physical_device_2"));
43685db71995Sopenharmony_ci    // Because LUID{10,100} is encountered first, all physical devices which correspond to that LUID are enumerated before any
43695db71995Sopenharmony_ci    // other physical devices.
43705db71995Sopenharmony_ci    EXPECT_TRUE(string_eq(phys_dev_props[2].deviceName, "physical_device_1"));
43715db71995Sopenharmony_ci
43725db71995Sopenharmony_ci    // Check that the correct physical device reports VK_LAYERED_DRIVER_UNDERLYING_API_D3D12_MSFT
43735db71995Sopenharmony_ci    VkPhysicalDeviceLayeredDriverPropertiesMSFT layered_driver_properties_msft{};
43745db71995Sopenharmony_ci    layered_driver_properties_msft.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LAYERED_DRIVER_PROPERTIES_MSFT;
43755db71995Sopenharmony_ci    VkPhysicalDeviceProperties2 props2{};
43765db71995Sopenharmony_ci    props2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2;
43775db71995Sopenharmony_ci    props2.pNext = (void*)&layered_driver_properties_msft;
43785db71995Sopenharmony_ci
43795db71995Sopenharmony_ci    env.vulkan_functions.vkGetPhysicalDeviceProperties2(physical_device_handles[0], &props2);
43805db71995Sopenharmony_ci    EXPECT_EQ(layered_driver_properties_msft.underlyingAPI, VK_LAYERED_DRIVER_UNDERLYING_API_NONE_MSFT);
43815db71995Sopenharmony_ci
43825db71995Sopenharmony_ci    env.vulkan_functions.vkGetPhysicalDeviceProperties2(physical_device_handles[1], &props2);
43835db71995Sopenharmony_ci    EXPECT_EQ(layered_driver_properties_msft.underlyingAPI, VK_LAYERED_DRIVER_UNDERLYING_API_D3D12_MSFT);
43845db71995Sopenharmony_ci
43855db71995Sopenharmony_ci    env.vulkan_functions.vkGetPhysicalDeviceProperties2(physical_device_handles[2], &props2);
43865db71995Sopenharmony_ci    EXPECT_EQ(layered_driver_properties_msft.underlyingAPI, VK_LAYERED_DRIVER_UNDERLYING_API_NONE_MSFT);
43875db71995Sopenharmony_ci}
43885db71995Sopenharmony_ci#endif  // defined(WIN32)
4389