15db71995Sopenharmony_ci/*
25db71995Sopenharmony_ci * Copyright (c) 2021-2023 The Khronos Group Inc.
35db71995Sopenharmony_ci * Copyright (c) 2021-2023 Valve Corporation
45db71995Sopenharmony_ci * Copyright (c) 2021-2023 LunarG, Inc.
55db71995Sopenharmony_ci *
65db71995Sopenharmony_ci * Permission is hereby granted, free of charge, to any person obtaining a copy
75db71995Sopenharmony_ci * of this software and/or associated documentation files (the "Materials"), to
85db71995Sopenharmony_ci * deal in the Materials without restriction, including without limitation the
95db71995Sopenharmony_ci * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
105db71995Sopenharmony_ci * sell copies of the Materials, and to permit persons to whom the Materials are
115db71995Sopenharmony_ci * furnished to do so, subject to the following conditions:
125db71995Sopenharmony_ci *
135db71995Sopenharmony_ci * The above copyright notice(s) and this permission notice shall be included in
145db71995Sopenharmony_ci * all copies or substantial portions of the Materials.
155db71995Sopenharmony_ci *
165db71995Sopenharmony_ci * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
175db71995Sopenharmony_ci * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
185db71995Sopenharmony_ci * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
195db71995Sopenharmony_ci *
205db71995Sopenharmony_ci * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
215db71995Sopenharmony_ci * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
225db71995Sopenharmony_ci * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE
235db71995Sopenharmony_ci * USE OR OTHER DEALINGS IN THE MATERIALS.
245db71995Sopenharmony_ci *
255db71995Sopenharmony_ci * Author: Charles Giessen <charles@lunarg.com>
265db71995Sopenharmony_ci */
275db71995Sopenharmony_ci
285db71995Sopenharmony_ci#include "test_environment.h"
295db71995Sopenharmony_ci
305db71995Sopenharmony_ciTEST(ICDInterfaceVersion2Plus, vk_icdNegotiateLoaderICDInterfaceVersion) {
315db71995Sopenharmony_ci    FrameworkEnvironment env{};
325db71995Sopenharmony_ci    auto& driver = env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2));
335db71995Sopenharmony_ci
345db71995Sopenharmony_ci    for (uint32_t i = 0; i <= 6; i++) {
355db71995Sopenharmony_ci        for (uint32_t j = i; j <= 6; j++) {
365db71995Sopenharmony_ci            driver.set_min_icd_interface_version(i).set_max_icd_interface_version(j);
375db71995Sopenharmony_ci            InstWrapper inst{env.vulkan_functions};
385db71995Sopenharmony_ci            inst.CheckCreate();
395db71995Sopenharmony_ci        }
405db71995Sopenharmony_ci    }
415db71995Sopenharmony_ci}
425db71995Sopenharmony_ci
435db71995Sopenharmony_ciTEST(ICDInterfaceVersion2Plus, version_3) {
445db71995Sopenharmony_ci    FrameworkEnvironment env{};
455db71995Sopenharmony_ci    auto& driver = env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2)).add_physical_device("physical_device_0");
465db71995Sopenharmony_ci    {
475db71995Sopenharmony_ci        driver.set_min_icd_interface_version(2).set_enable_icd_wsi(true);
485db71995Sopenharmony_ci        InstWrapper inst{env.vulkan_functions};
495db71995Sopenharmony_ci        inst.CheckCreate();
505db71995Sopenharmony_ci
515db71995Sopenharmony_ci        ASSERT_FALSE(driver.is_using_icd_wsi);
525db71995Sopenharmony_ci    }
535db71995Sopenharmony_ci    {
545db71995Sopenharmony_ci        driver.set_min_icd_interface_version(3).set_enable_icd_wsi(false);
555db71995Sopenharmony_ci        InstWrapper inst{env.vulkan_functions};
565db71995Sopenharmony_ci        inst.CheckCreate();
575db71995Sopenharmony_ci
585db71995Sopenharmony_ci        ASSERT_FALSE(driver.is_using_icd_wsi);
595db71995Sopenharmony_ci    }
605db71995Sopenharmony_ci    {
615db71995Sopenharmony_ci        driver.set_min_icd_interface_version(3).set_enable_icd_wsi(true);
625db71995Sopenharmony_ci        InstWrapper inst{env.vulkan_functions};
635db71995Sopenharmony_ci        inst.CheckCreate();
645db71995Sopenharmony_ci
655db71995Sopenharmony_ci        ASSERT_TRUE(driver.is_using_icd_wsi);
665db71995Sopenharmony_ci    }
675db71995Sopenharmony_ci}
685db71995Sopenharmony_ci
695db71995Sopenharmony_ciTEST(ICDInterfaceVersion2Plus, version_4) {
705db71995Sopenharmony_ci    FrameworkEnvironment env{};
715db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2)).add_physical_device("physical_device_0");
725db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
735db71995Sopenharmony_ci    inst.CheckCreate();
745db71995Sopenharmony_ci}
755db71995Sopenharmony_ci
765db71995Sopenharmony_ciTEST(ICDInterfaceVersion2Plus, l4_icd4) {
775db71995Sopenharmony_ci    // TODO:
785db71995Sopenharmony_ci    // ICD must fail with VK_ERROR_INCOMPATIBLE_DRIVER for all vkCreateInstance calls with apiVersion set to > Vulkan 1.0
795db71995Sopenharmony_ci    // because both the loader and ICD support interface version <= 4. Otherwise, the ICD should behave as normal.
805db71995Sopenharmony_ci}
815db71995Sopenharmony_ciTEST(ICDInterfaceVersion2Plus, l4_icd5) {
825db71995Sopenharmony_ci    // TODO:
835db71995Sopenharmony_ci    // ICD must fail with VK_ERROR_INCOMPATIBLE_DRIVER for all vkCreateInstance calls with apiVersion set to > Vulkan 1.0
845db71995Sopenharmony_ci    // because the loader is still at interface version <= 4. Otherwise, the ICD should behave as normal.
855db71995Sopenharmony_ci}
865db71995Sopenharmony_ciTEST(ICDInterfaceVersion2Plus, l5_icd4) {
875db71995Sopenharmony_ci    // TODO:
885db71995Sopenharmony_ci    // Loader will fail with VK_ERROR_INCOMPATIBLE_DRIVER if it can't handle the apiVersion. ICD may pass for all apiVersions,
895db71995Sopenharmony_ci    // but since its interface is <= 4, it is best if it assumes it needs to do the work of rejecting anything > Vulkan 1.0 and
905db71995Sopenharmony_ci    // fail with VK_ERROR_INCOMPATIBLE_DRIVER. Otherwise, the ICD should behave as normal.
915db71995Sopenharmony_ci}
925db71995Sopenharmony_ciTEST(ICDInterfaceVersion2Plus, l5_icd5) {
935db71995Sopenharmony_ci    // TODO:
945db71995Sopenharmony_ci    // Loader will fail with VK_ERROR_INCOMPATIBLE_DRIVER if it can't handle the apiVersion, and ICDs should fail with
955db71995Sopenharmony_ci    // VK_ERROR_INCOMPATIBLE_DRIVER only if they can not support the specified apiVersion. Otherwise, the ICD should behave as
965db71995Sopenharmony_ci    // normal.
975db71995Sopenharmony_ci}
985db71995Sopenharmony_ci
995db71995Sopenharmony_ci#if defined(WIN32)
1005db71995Sopenharmony_ci// This test makes sure that EnumerateAdapterPhysicalDevices on drivers found in the Khronos/Vulkan/Drivers registry
1015db71995Sopenharmony_ciTEST(ICDInterfaceVersion2PlusEnumerateAdapterPhysicalDevices, version_6_in_drivers_registry) {
1025db71995Sopenharmony_ci    FrameworkEnvironment env{};
1035db71995Sopenharmony_ci    auto& driver = env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_ENUMERATE_ADAPTER_PHYSICAL_DEVICES));
1045db71995Sopenharmony_ci    driver.physical_devices.emplace_back("physical_device_1");
1055db71995Sopenharmony_ci    driver.physical_devices.emplace_back("physical_device_0");
1065db71995Sopenharmony_ci    uint32_t physical_count = static_cast<uint32_t>(driver.physical_devices.size());
1075db71995Sopenharmony_ci    uint32_t returned_physical_count = static_cast<uint32_t>(driver.physical_devices.size());
1085db71995Sopenharmony_ci    std::vector<VkPhysicalDevice> physical_device_handles = std::vector<VkPhysicalDevice>(physical_count);
1095db71995Sopenharmony_ci
1105db71995Sopenharmony_ci    driver.min_icd_interface_version = 5;
1115db71995Sopenharmony_ci
1125db71995Sopenharmony_ci    auto& known_driver = known_driver_list.at(2);  // which drive this test pretends to be
1135db71995Sopenharmony_ci    DXGI_ADAPTER_DESC1 desc1{};
1145db71995Sopenharmony_ci    desc1.AdapterLuid = _LUID{10, 1000};
1155db71995Sopenharmony_ci    desc1.VendorId = known_driver.vendor_id;
1165db71995Sopenharmony_ci    env.platform_shim->add_dxgi_adapter(GpuType::discrete, desc1);
1175db71995Sopenharmony_ci    driver.set_adapterLUID(desc1.AdapterLuid);
1185db71995Sopenharmony_ci
1195db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
1205db71995Sopenharmony_ci    inst.CheckCreate();
1215db71995Sopenharmony_ci
1225db71995Sopenharmony_ci    ASSERT_EQ(VK_SUCCESS,
1235db71995Sopenharmony_ci              env.vulkan_functions.vkEnumeratePhysicalDevices(inst.inst, &returned_physical_count, physical_device_handles.data()));
1245db71995Sopenharmony_ci    ASSERT_EQ(physical_count, returned_physical_count);
1255db71995Sopenharmony_ci    ASSERT_TRUE(driver.called_enumerate_adapter_physical_devices);
1265db71995Sopenharmony_ci}
1275db71995Sopenharmony_ci// Make the version_6 driver found through the D3DKMT driver discovery mechanism of the loader
1285db71995Sopenharmony_ciTEST(ICDInterfaceVersion2PlusEnumerateAdapterPhysicalDevices, version_6) {
1295db71995Sopenharmony_ci    FrameworkEnvironment env{};
1305db71995Sopenharmony_ci    env.add_icd(TestICDDetails{TEST_ICD_PATH_VERSION_6, VK_API_VERSION_1_3}.set_discovery_type(ManifestDiscoveryType::null_dir));
1315db71995Sopenharmony_ci    // Version 6 provides a mechanism to allow the loader to sort physical devices.
1325db71995Sopenharmony_ci    // The loader will only attempt to sort physical devices on an ICD if version 6 of the interface is supported.
1335db71995Sopenharmony_ci    // This version provides the vk_icdEnumerateAdapterPhysicalDevices function.
1345db71995Sopenharmony_ci    auto& driver = env.get_test_icd(0);
1355db71995Sopenharmony_ci    driver.physical_devices.emplace_back("physical_device_1");
1365db71995Sopenharmony_ci    driver.physical_devices.emplace_back("physical_device_0");
1375db71995Sopenharmony_ci    uint32_t physical_count = 2;
1385db71995Sopenharmony_ci    uint32_t returned_physical_count = physical_count;
1395db71995Sopenharmony_ci    std::vector<VkPhysicalDevice> physical_device_handles{physical_count};
1405db71995Sopenharmony_ci
1415db71995Sopenharmony_ci    driver.min_icd_interface_version = 6;
1425db71995Sopenharmony_ci
1435db71995Sopenharmony_ci    auto& known_driver = known_driver_list.at(2);  // which drive this test pretends to be
1445db71995Sopenharmony_ci    DXGI_ADAPTER_DESC1 desc1{};
1455db71995Sopenharmony_ci    desc1.AdapterLuid = _LUID{10, 1000};
1465db71995Sopenharmony_ci    desc1.VendorId = known_driver.vendor_id;
1475db71995Sopenharmony_ci    env.platform_shim->add_dxgi_adapter(GpuType::discrete, desc1);
1485db71995Sopenharmony_ci    driver.set_adapterLUID(desc1.AdapterLuid);
1495db71995Sopenharmony_ci
1505db71995Sopenharmony_ci    env.platform_shim->add_d3dkmt_adapter(
1515db71995Sopenharmony_ci        D3DKMT_Adapter{0, desc1.AdapterLuid}.add_driver_manifest_path(env.get_icd_manifest_path(0)));
1525db71995Sopenharmony_ci
1535db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
1545db71995Sopenharmony_ci    inst.CheckCreate();
1555db71995Sopenharmony_ci
1565db71995Sopenharmony_ci    ASSERT_EQ(VK_SUCCESS, env.vulkan_functions.vkEnumeratePhysicalDevices(inst.inst, &returned_physical_count, nullptr));
1575db71995Sopenharmony_ci    ASSERT_EQ(physical_count, returned_physical_count);
1585db71995Sopenharmony_ci    ASSERT_EQ(VK_SUCCESS,
1595db71995Sopenharmony_ci              env.vulkan_functions.vkEnumeratePhysicalDevices(inst.inst, &returned_physical_count, physical_device_handles.data()));
1605db71995Sopenharmony_ci    ASSERT_EQ(physical_count, returned_physical_count);
1615db71995Sopenharmony_ci    ASSERT_TRUE(driver.called_enumerate_adapter_physical_devices);
1625db71995Sopenharmony_ci
1635db71995Sopenharmony_ci    // Make sure that the loader doesn't write past the the end of the pointer
1645db71995Sopenharmony_ci    auto temp_ptr = std::unique_ptr<int>(new int());
1655db71995Sopenharmony_ci    for (auto& phys_dev : physical_device_handles) {
1665db71995Sopenharmony_ci        phys_dev = reinterpret_cast<VkPhysicalDevice>(temp_ptr.get());
1675db71995Sopenharmony_ci    }
1685db71995Sopenharmony_ci
1695db71995Sopenharmony_ci    ASSERT_EQ(VK_SUCCESS, env.vulkan_functions.vkEnumeratePhysicalDevices(inst.inst, &returned_physical_count, nullptr));
1705db71995Sopenharmony_ci    returned_physical_count = 0;
1715db71995Sopenharmony_ci    ASSERT_EQ(VK_INCOMPLETE,
1725db71995Sopenharmony_ci              env.vulkan_functions.vkEnumeratePhysicalDevices(inst.inst, &returned_physical_count, physical_device_handles.data()));
1735db71995Sopenharmony_ci    ASSERT_EQ(0U, returned_physical_count);
1745db71995Sopenharmony_ci    for (auto& phys_dev : physical_device_handles) {
1755db71995Sopenharmony_ci        ASSERT_EQ(phys_dev, reinterpret_cast<VkPhysicalDevice>(temp_ptr.get()));
1765db71995Sopenharmony_ci    }
1775db71995Sopenharmony_ci}
1785db71995Sopenharmony_ci
1795db71995Sopenharmony_ci// Declare drivers using the D3DKMT driver interface and make sure the loader can find them - but don't export
1805db71995Sopenharmony_ci// EnumerateAdapterPhysicalDevices
1815db71995Sopenharmony_ciTEST(ICDInterfaceVersion2, EnumAdapters2) {
1825db71995Sopenharmony_ci    FrameworkEnvironment env{};
1835db71995Sopenharmony_ci    auto& driver =
1845db71995Sopenharmony_ci        env.add_icd(TestICDDetails{TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA}.set_discovery_type(ManifestDiscoveryType::null_dir));
1855db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
1865db71995Sopenharmony_ci    driver.physical_devices.emplace_back("physical_device_1");
1875db71995Sopenharmony_ci    driver.physical_devices.emplace_back("physical_device_0");
1885db71995Sopenharmony_ci    uint32_t physical_count = static_cast<uint32_t>(driver.physical_devices.size());
1895db71995Sopenharmony_ci    uint32_t returned_physical_count = static_cast<uint32_t>(driver.physical_devices.size());
1905db71995Sopenharmony_ci    std::vector<VkPhysicalDevice> physical_device_handles = std::vector<VkPhysicalDevice>(physical_count);
1915db71995Sopenharmony_ci    driver.adapterLUID = _LUID{10, 1000};
1925db71995Sopenharmony_ci    env.platform_shim->add_d3dkmt_adapter(D3DKMT_Adapter{0, _LUID{10, 1000}}.add_driver_manifest_path(env.get_icd_manifest_path()));
1935db71995Sopenharmony_ci
1945db71995Sopenharmony_ci    inst.CheckCreate();
1955db71995Sopenharmony_ci
1965db71995Sopenharmony_ci    ASSERT_EQ(VK_SUCCESS, env.vulkan_functions.vkEnumeratePhysicalDevices(inst.inst, &returned_physical_count, nullptr));
1975db71995Sopenharmony_ci    ASSERT_EQ(physical_count, returned_physical_count);
1985db71995Sopenharmony_ci    ASSERT_EQ(VK_SUCCESS,
1995db71995Sopenharmony_ci              env.vulkan_functions.vkEnumeratePhysicalDevices(inst.inst, &returned_physical_count, physical_device_handles.data()));
2005db71995Sopenharmony_ci    ASSERT_EQ(physical_count, returned_physical_count);
2015db71995Sopenharmony_ci    ASSERT_FALSE(driver.called_enumerate_adapter_physical_devices);
2025db71995Sopenharmony_ci}
2035db71995Sopenharmony_ci
2045db71995Sopenharmony_ci// Make sure that physical devices are found through EnumerateAdapterPhysicalDevices
2055db71995Sopenharmony_ci// Verify that the handles are correct by calling vkGetPhysicalDeviceProperties with them
2065db71995Sopenharmony_ciTEST(ICDInterfaceVersion2PlusEnumerateAdapterPhysicalDevices, VerifyPhysDevResults) {
2075db71995Sopenharmony_ci    FrameworkEnvironment env{};
2085db71995Sopenharmony_ci    auto& driver =
2095db71995Sopenharmony_ci        env.add_icd(TestICDDetails{TEST_ICD_PATH_VERSION_2_EXPORT_ICD_ENUMERATE_ADAPTER_PHYSICAL_DEVICES, VK_API_VERSION_1_1}
2105db71995Sopenharmony_ci                        .set_discovery_type(ManifestDiscoveryType::null_dir))
2115db71995Sopenharmony_ci            .set_min_icd_interface_version(6)
2125db71995Sopenharmony_ci            .set_icd_api_version(VK_API_VERSION_1_1);
2135db71995Sopenharmony_ci    const std::vector<std::string> physical_device_names = {"physical_device_4", "physical_device_3", "physical_device_2",
2145db71995Sopenharmony_ci                                                            "physical_device_1", "physical_device_0"};
2155db71995Sopenharmony_ci    for (const auto& dev_name : physical_device_names) driver.physical_devices.push_back(dev_name);
2165db71995Sopenharmony_ci
2175db71995Sopenharmony_ci    auto& known_driver = known_driver_list.at(2);  // which drive this test pretends to be
2185db71995Sopenharmony_ci    DXGI_ADAPTER_DESC1 desc1{};
2195db71995Sopenharmony_ci    desc1.VendorId = known_driver.vendor_id;
2205db71995Sopenharmony_ci    desc1.AdapterLuid = _LUID{10, 1000};
2215db71995Sopenharmony_ci    env.platform_shim->add_dxgi_adapter(GpuType::discrete, desc1);
2225db71995Sopenharmony_ci    driver.set_adapterLUID(desc1.AdapterLuid);
2235db71995Sopenharmony_ci
2245db71995Sopenharmony_ci    env.platform_shim->add_d3dkmt_adapter(D3DKMT_Adapter{0, _LUID{10, 1000}}.add_driver_manifest_path(env.get_icd_manifest_path()));
2255db71995Sopenharmony_ci
2265db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
2275db71995Sopenharmony_ci    inst.CheckCreate();
2285db71995Sopenharmony_ci
2295db71995Sopenharmony_ci    const size_t phys_dev_count = physical_device_names.size();
2305db71995Sopenharmony_ci
2315db71995Sopenharmony_ci    // The test ICD should completely swap the order of devices.
2325db71995Sopenharmony_ci    // Since we can't compare VkPhysicalDevice handles because they will be different per VkInstance, we will
2335db71995Sopenharmony_ci    // compare the property names returned, which should still be equal.
2345db71995Sopenharmony_ci
2355db71995Sopenharmony_ci    std::vector<VkPhysicalDevice> adapter_pds{phys_dev_count};
2365db71995Sopenharmony_ci    uint32_t count = static_cast<uint32_t>(adapter_pds.size());
2375db71995Sopenharmony_ci    ASSERT_EQ(VK_SUCCESS, env.vulkan_functions.vkEnumeratePhysicalDevices(inst, &count, adapter_pds.data()));
2385db71995Sopenharmony_ci    ASSERT_EQ(phys_dev_count, count);
2395db71995Sopenharmony_ci
2405db71995Sopenharmony_ci    for (uint32_t dev = 0; dev < phys_dev_count; ++dev) {
2415db71995Sopenharmony_ci        VkPhysicalDeviceProperties props;
2425db71995Sopenharmony_ci        env.vulkan_functions.vkGetPhysicalDeviceProperties(adapter_pds[dev], &props);
2435db71995Sopenharmony_ci        std::string dev_name = props.deviceName;
2445db71995Sopenharmony_ci        // index in reverse
2455db71995Sopenharmony_ci        ASSERT_EQ(dev_name, physical_device_names[physical_device_names.size() - 1 - dev]);
2465db71995Sopenharmony_ci    }
2475db71995Sopenharmony_ci}
2485db71995Sopenharmony_ci
2495db71995Sopenharmony_ci// Make sure physical device groups enumerated through EnumerateAdapterPhysicalDevices are properly found
2505db71995Sopenharmony_ciTEST(ICDInterfaceVersion2PlusEnumerateAdapterPhysicalDevices, VerifyGroupResults) {
2515db71995Sopenharmony_ci    FrameworkEnvironment env{};
2525db71995Sopenharmony_ci    auto& driver =
2535db71995Sopenharmony_ci        env.add_icd(TestICDDetails{TEST_ICD_PATH_VERSION_2_EXPORT_ICD_ENUMERATE_ADAPTER_PHYSICAL_DEVICES, VK_API_VERSION_1_1}
2545db71995Sopenharmony_ci                        .set_discovery_type(ManifestDiscoveryType::null_dir))
2555db71995Sopenharmony_ci            .set_min_icd_interface_version(6)
2565db71995Sopenharmony_ci            .set_icd_api_version(VK_API_VERSION_1_1);
2575db71995Sopenharmony_ci    const std::vector<std::string> physical_device_names = {"physical_device_4", "physical_device_3", "physical_device_2",
2585db71995Sopenharmony_ci                                                            "physical_device_1", "physical_device_0"};
2595db71995Sopenharmony_ci    for (const auto& dev_name : physical_device_names) {
2605db71995Sopenharmony_ci        driver.physical_devices.push_back(dev_name);
2615db71995Sopenharmony_ci    }
2625db71995Sopenharmony_ci
2635db71995Sopenharmony_ci    driver.physical_device_groups.emplace_back(driver.physical_devices[0]).use_physical_device(driver.physical_devices[1]);
2645db71995Sopenharmony_ci    driver.physical_device_groups.emplace_back(driver.physical_devices[2]);
2655db71995Sopenharmony_ci    driver.physical_device_groups.emplace_back(driver.physical_devices[3]).use_physical_device(driver.physical_devices[4]);
2665db71995Sopenharmony_ci
2675db71995Sopenharmony_ci    auto& known_driver = known_driver_list.at(2);  // which driver this test pretends to be
2685db71995Sopenharmony_ci    DXGI_ADAPTER_DESC1 desc1{};
2695db71995Sopenharmony_ci    desc1.VendorId = known_driver.vendor_id;
2705db71995Sopenharmony_ci    desc1.AdapterLuid = _LUID{10, 1000};
2715db71995Sopenharmony_ci    env.platform_shim->add_dxgi_adapter(GpuType::discrete, desc1);
2725db71995Sopenharmony_ci    driver.set_adapterLUID(desc1.AdapterLuid);
2735db71995Sopenharmony_ci
2745db71995Sopenharmony_ci    env.platform_shim->add_d3dkmt_adapter(D3DKMT_Adapter{0, _LUID{10, 1000}}.add_driver_manifest_path(env.get_icd_manifest_path()));
2755db71995Sopenharmony_ci
2765db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
2775db71995Sopenharmony_ci    inst.CheckCreate();
2785db71995Sopenharmony_ci
2795db71995Sopenharmony_ci    // The test ICD should completely swap the order of devices.
2805db71995Sopenharmony_ci    // Since we can't compare VkPhysicalDevice handles because they will be different per VkInstance, we will
2815db71995Sopenharmony_ci    // compare the property names returned, which should still be equal.
2825db71995Sopenharmony_ci    // And, since this is device groups, the groups themselves should also be in reverse order with the devices
2835db71995Sopenharmony_ci    // inside each group in revers order.
2845db71995Sopenharmony_ci
2855db71995Sopenharmony_ci    const uint32_t actual_group_count = 3;
2865db71995Sopenharmony_ci    uint32_t count = actual_group_count;
2875db71995Sopenharmony_ci    std::array<VkPhysicalDeviceGroupProperties, actual_group_count> groups{};
2885db71995Sopenharmony_ci    for (uint32_t group = 0; group < actual_group_count; ++group) {
2895db71995Sopenharmony_ci        groups[group].sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GROUP_PROPERTIES;
2905db71995Sopenharmony_ci    }
2915db71995Sopenharmony_ci    ASSERT_EQ(VK_SUCCESS, inst->vkEnumeratePhysicalDeviceGroups(inst, &count, groups.data()));
2925db71995Sopenharmony_ci    ASSERT_EQ(actual_group_count, count);
2935db71995Sopenharmony_ci
2945db71995Sopenharmony_ci    size_t cur_device_name_index = physical_device_names.size() - 1;  // start at last index and reverse through it
2955db71995Sopenharmony_ci    for (uint32_t group = 0; group < actual_group_count; ++group) {
2965db71995Sopenharmony_ci        for (uint32_t dev = 0; dev < groups[group].physicalDeviceCount; ++dev) {
2975db71995Sopenharmony_ci            VkPhysicalDeviceProperties props;
2985db71995Sopenharmony_ci            env.vulkan_functions.vkGetPhysicalDeviceProperties(groups[group].physicalDevices[dev], &props);
2995db71995Sopenharmony_ci            std::string dev_name = props.deviceName;
3005db71995Sopenharmony_ci            ASSERT_EQ(dev_name, physical_device_names[cur_device_name_index]);
3015db71995Sopenharmony_ci            cur_device_name_index--;
3025db71995Sopenharmony_ci        }
3035db71995Sopenharmony_ci    }
3045db71995Sopenharmony_ci}
3055db71995Sopenharmony_ci
3065db71995Sopenharmony_ci#endif  // defined(WIN32)
3075db71995Sopenharmony_ciTEST(ICDInterfaceVersion7, SingleDriver) {
3085db71995Sopenharmony_ci    FrameworkEnvironment env{};
3095db71995Sopenharmony_ci    auto& driver = env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_7_WITH_ADDITIONAL_EXPORTS)).add_physical_device({});
3105db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
3115db71995Sopenharmony_ci    inst.CheckCreate();
3125db71995Sopenharmony_ci    DeviceWrapper dev{inst};
3135db71995Sopenharmony_ci    dev.CheckCreate(inst.GetPhysDev());
3145db71995Sopenharmony_ci    ASSERT_EQ(driver.interface_version_check, InterfaceVersionCheck::version_is_supported);
3155db71995Sopenharmony_ci}
3165db71995Sopenharmony_ci
3175db71995Sopenharmony_ciTEST(ICDInterfaceVersion7, SingleDriverWithoutExportedFunctions) {
3185db71995Sopenharmony_ci    FrameworkEnvironment env{};
3195db71995Sopenharmony_ci    auto& driver = env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_7)).add_physical_device({});
3205db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
3215db71995Sopenharmony_ci    inst.CheckCreate();
3225db71995Sopenharmony_ci    DeviceWrapper dev{inst};
3235db71995Sopenharmony_ci    dev.CheckCreate(inst.GetPhysDev());
3245db71995Sopenharmony_ci    ASSERT_EQ(driver.interface_version_check, InterfaceVersionCheck::version_is_supported);
3255db71995Sopenharmony_ci}
3265db71995Sopenharmony_ci
3275db71995Sopenharmony_ciTEST(MultipleICDConfig, Basic) {
3285db71995Sopenharmony_ci    FrameworkEnvironment env{};
3295db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2));
3305db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2));
3315db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2));
3325db71995Sopenharmony_ci
3335db71995Sopenharmony_ci    env.get_test_icd(0).physical_devices.emplace_back("physical_device_0");
3345db71995Sopenharmony_ci    env.get_test_icd(1).physical_devices.emplace_back("physical_device_1");
3355db71995Sopenharmony_ci    env.get_test_icd(2).physical_devices.emplace_back("physical_device_2");
3365db71995Sopenharmony_ci
3375db71995Sopenharmony_ci    env.get_test_icd(0).physical_devices.at(0).properties.deviceType = VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU;
3385db71995Sopenharmony_ci    env.get_test_icd(1).physical_devices.at(0).properties.deviceType = VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU;
3395db71995Sopenharmony_ci    env.get_test_icd(2).physical_devices.at(0).properties.deviceType = VK_PHYSICAL_DEVICE_TYPE_CPU;
3405db71995Sopenharmony_ci
3415db71995Sopenharmony_ci    copy_string_to_char_array("dev0", env.get_test_icd(0).physical_devices.at(0).properties.deviceName, VK_MAX_EXTENSION_NAME_SIZE);
3425db71995Sopenharmony_ci    copy_string_to_char_array("dev1", env.get_test_icd(1).physical_devices.at(0).properties.deviceName, VK_MAX_EXTENSION_NAME_SIZE);
3435db71995Sopenharmony_ci    copy_string_to_char_array("dev2", env.get_test_icd(2).physical_devices.at(0).properties.deviceName, VK_MAX_EXTENSION_NAME_SIZE);
3445db71995Sopenharmony_ci
3455db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
3465db71995Sopenharmony_ci    inst.CheckCreate();
3475db71995Sopenharmony_ci
3485db71995Sopenharmony_ci    std::array<VkPhysicalDevice, 3> phys_devs_array;
3495db71995Sopenharmony_ci    uint32_t phys_dev_count = 3;
3505db71995Sopenharmony_ci    ASSERT_EQ(env.vulkan_functions.vkEnumeratePhysicalDevices(inst, &phys_dev_count, phys_devs_array.data()), VK_SUCCESS);
3515db71995Sopenharmony_ci    ASSERT_EQ(phys_dev_count, 3U);
3525db71995Sopenharmony_ci    ASSERT_EQ(env.get_test_icd(0).physical_devices.at(0).properties.deviceType, VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU);
3535db71995Sopenharmony_ci    ASSERT_EQ(env.get_test_icd(1).physical_devices.at(0).properties.deviceType, VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU);
3545db71995Sopenharmony_ci    ASSERT_EQ(env.get_test_icd(2).physical_devices.at(0).properties.deviceType, VK_PHYSICAL_DEVICE_TYPE_CPU);
3555db71995Sopenharmony_ci}
3565db71995Sopenharmony_ci
3575db71995Sopenharmony_ciTEST(MultipleDriverConfig, DifferentICDInterfaceVersions) {
3585db71995Sopenharmony_ci    FrameworkEnvironment env{};
3595db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_EXPORT_ICD_GIPA));
3605db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2));
3615db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA));
3625db71995Sopenharmony_ci
3635db71995Sopenharmony_ci    TestICD& icd0 = env.get_test_icd(0);
3645db71995Sopenharmony_ci    icd0.physical_devices.emplace_back("physical_device_0");
3655db71995Sopenharmony_ci    icd0.max_icd_interface_version = 1;
3665db71995Sopenharmony_ci
3675db71995Sopenharmony_ci    TestICD& icd1 = env.get_test_icd(1);
3685db71995Sopenharmony_ci    icd1.physical_devices.emplace_back("physical_device_1");
3695db71995Sopenharmony_ci    icd1.min_icd_interface_version = 2;
3705db71995Sopenharmony_ci    icd1.max_icd_interface_version = 5;
3715db71995Sopenharmony_ci
3725db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
3735db71995Sopenharmony_ci    inst.CheckCreate();
3745db71995Sopenharmony_ci
3755db71995Sopenharmony_ci    std::array<VkPhysicalDevice, 2> phys_devs_array;
3765db71995Sopenharmony_ci    uint32_t phys_dev_count = 2;
3775db71995Sopenharmony_ci    ASSERT_EQ(env.vulkan_functions.vkEnumeratePhysicalDevices(inst, &phys_dev_count, phys_devs_array.data()), VK_SUCCESS);
3785db71995Sopenharmony_ci    ASSERT_EQ(phys_dev_count, 2U);
3795db71995Sopenharmony_ci}
3805db71995Sopenharmony_ci
3815db71995Sopenharmony_ciTEST(MultipleDriverConfig, DifferentICDsWithDevices) {
3825db71995Sopenharmony_ci    FrameworkEnvironment env{};
3835db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_EXPORT_ICD_GIPA));
3845db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2));
3855db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA));
3865db71995Sopenharmony_ci
3875db71995Sopenharmony_ci    // Make sure the loader returns all devices from all active ICDs.  Many of the other
3885db71995Sopenharmony_ci    // tests add multiple devices to a single ICD, this just makes sure the loader combines
3895db71995Sopenharmony_ci    // device info across multiple drivers properly.
3905db71995Sopenharmony_ci    TestICD& icd0 = env.get_test_icd(0);
3915db71995Sopenharmony_ci    icd0.physical_devices.emplace_back("physical_device_0");
3925db71995Sopenharmony_ci    icd0.min_icd_interface_version = 5;
3935db71995Sopenharmony_ci    icd0.max_icd_interface_version = 5;
3945db71995Sopenharmony_ci
3955db71995Sopenharmony_ci    TestICD& icd1 = env.get_test_icd(1);
3965db71995Sopenharmony_ci    icd1.physical_devices.emplace_back("physical_device_1");
3975db71995Sopenharmony_ci    icd1.physical_devices.emplace_back("physical_device_2");
3985db71995Sopenharmony_ci    icd1.min_icd_interface_version = 5;
3995db71995Sopenharmony_ci    icd1.max_icd_interface_version = 5;
4005db71995Sopenharmony_ci
4015db71995Sopenharmony_ci    TestICD& icd2 = env.get_test_icd(2);
4025db71995Sopenharmony_ci    icd2.physical_devices.emplace_back("physical_device_3");
4035db71995Sopenharmony_ci    icd2.min_icd_interface_version = 5;
4045db71995Sopenharmony_ci    icd2.max_icd_interface_version = 5;
4055db71995Sopenharmony_ci
4065db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
4075db71995Sopenharmony_ci    inst.CheckCreate();
4085db71995Sopenharmony_ci
4095db71995Sopenharmony_ci    std::array<VkPhysicalDevice, 4> phys_devs_array;
4105db71995Sopenharmony_ci    uint32_t phys_dev_count = 4;
4115db71995Sopenharmony_ci    ASSERT_EQ(env.vulkan_functions.vkEnumeratePhysicalDevices(inst, &phys_dev_count, phys_devs_array.data()), VK_SUCCESS);
4125db71995Sopenharmony_ci    ASSERT_EQ(phys_dev_count, 4U);
4135db71995Sopenharmony_ci}
4145db71995Sopenharmony_ci
4155db71995Sopenharmony_ciTEST(MultipleDriverConfig, DifferentICDsWithDevicesAndGroups) {
4165db71995Sopenharmony_ci    FrameworkEnvironment env{};
4175db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_EXPORT_ICD_GIPA));
4185db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2, VK_API_VERSION_1_1));
4195db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA));
4205db71995Sopenharmony_ci
4215db71995Sopenharmony_ci    // The loader has to be able to handle drivers that support device groups in combination
4225db71995Sopenharmony_ci    // with drivers that don't support device groups.  When this is the case, the loader needs
4235db71995Sopenharmony_ci    // to take every driver that doesn't support device groups and put each of its devices in
4245db71995Sopenharmony_ci    // a separate group.  Then it combines that information with the drivers that support
4255db71995Sopenharmony_ci    // device groups returned info.
4265db71995Sopenharmony_ci
4275db71995Sopenharmony_ci    // ICD 0 :  No 1.1 support (so 1 device will become 1 group in loader)
4285db71995Sopenharmony_ci    TestICD& icd0 = env.get_test_icd(0);
4295db71995Sopenharmony_ci    icd0.physical_devices.emplace_back("physical_device_0");
4305db71995Sopenharmony_ci    icd0.min_icd_interface_version = 5;
4315db71995Sopenharmony_ci    icd0.max_icd_interface_version = 5;
4325db71995Sopenharmony_ci    icd0.set_icd_api_version(VK_API_VERSION_1_0);
4335db71995Sopenharmony_ci
4345db71995Sopenharmony_ci    // ICD 1 :  1.1 support (with 1 group with 2 devices)
4355db71995Sopenharmony_ci    TestICD& icd1 = env.get_test_icd(1);
4365db71995Sopenharmony_ci    icd1.physical_devices.emplace_back("physical_device_1").set_api_version(VK_API_VERSION_1_1);
4375db71995Sopenharmony_ci    icd1.physical_devices.emplace_back("physical_device_2").set_api_version(VK_API_VERSION_1_1);
4385db71995Sopenharmony_ci    icd1.physical_device_groups.emplace_back(icd1.physical_devices[0]);
4395db71995Sopenharmony_ci    icd1.physical_device_groups.back().use_physical_device(icd1.physical_devices[1]);
4405db71995Sopenharmony_ci    icd1.min_icd_interface_version = 5;
4415db71995Sopenharmony_ci    icd1.max_icd_interface_version = 5;
4425db71995Sopenharmony_ci    icd1.set_icd_api_version(VK_API_VERSION_1_1);
4435db71995Sopenharmony_ci
4445db71995Sopenharmony_ci    // ICD 2 :  No 1.1 support (so 3 devices will become 3 groups in loader)
4455db71995Sopenharmony_ci    TestICD& icd2 = env.get_test_icd(2);
4465db71995Sopenharmony_ci    icd2.physical_devices.emplace_back("physical_device_3");
4475db71995Sopenharmony_ci    icd2.physical_devices.emplace_back("physical_device_4");
4485db71995Sopenharmony_ci    icd2.physical_devices.emplace_back("physical_device_5");
4495db71995Sopenharmony_ci    icd2.min_icd_interface_version = 5;
4505db71995Sopenharmony_ci    icd2.max_icd_interface_version = 5;
4515db71995Sopenharmony_ci    icd2.set_icd_api_version(VK_API_VERSION_1_0);
4525db71995Sopenharmony_ci
4535db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
4545db71995Sopenharmony_ci    inst.create_info.set_api_version(1, 1, 0);
4555db71995Sopenharmony_ci    inst.CheckCreate();
4565db71995Sopenharmony_ci
4575db71995Sopenharmony_ci    uint32_t group_count = static_cast<uint32_t>(5);
4585db71995Sopenharmony_ci    uint32_t returned_group_count = 0;
4595db71995Sopenharmony_ci    ASSERT_EQ(VK_SUCCESS, inst->vkEnumeratePhysicalDeviceGroups(inst, &returned_group_count, nullptr));
4605db71995Sopenharmony_ci    ASSERT_EQ(group_count, returned_group_count);
4615db71995Sopenharmony_ci
4625db71995Sopenharmony_ci    std::vector<VkPhysicalDeviceGroupProperties> group_props{};
4635db71995Sopenharmony_ci    group_props.resize(group_count, VkPhysicalDeviceGroupProperties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GROUP_PROPERTIES});
4645db71995Sopenharmony_ci    ASSERT_EQ(VK_SUCCESS, inst->vkEnumeratePhysicalDeviceGroups(inst, &returned_group_count, group_props.data()));
4655db71995Sopenharmony_ci    ASSERT_EQ(group_count, returned_group_count);
4665db71995Sopenharmony_ci}
4675db71995Sopenharmony_ci
4685db71995Sopenharmony_ci#if defined(WIN32)
4695db71995Sopenharmony_ci// This is testing when there are drivers that support the Windows device adapter sorting mechanism by exporting
4705db71995Sopenharmony_ci// EnumerateAdapterPhysicalDevices and drivers that do not expose that functionality
4715db71995Sopenharmony_ciTEST(MultipleICDConfig, version_5_and_version_6) {
4725db71995Sopenharmony_ci    FrameworkEnvironment env;
4735db71995Sopenharmony_ci
4745db71995Sopenharmony_ci    const char* regular_layer_name = "VK_LAYER_TestLayer1";
4755db71995Sopenharmony_ci    env.add_implicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{}
4765db71995Sopenharmony_ci                                                         .set_name(regular_layer_name)
4775db71995Sopenharmony_ci                                                         .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)
4785db71995Sopenharmony_ci                                                         .set_api_version(VK_MAKE_API_VERSION(0, 1, 1, 0))
4795db71995Sopenharmony_ci                                                         .set_disable_environment("DisableMeIfYouCan")),
4805db71995Sopenharmony_ci                           "regular_test_layer.json");
4815db71995Sopenharmony_ci
4825db71995Sopenharmony_ci    MockQueueFamilyProperties family_props{{VK_QUEUE_GRAPHICS_BIT, 1, 0, {1, 1, 1}}, true};
4835db71995Sopenharmony_ci
4845db71995Sopenharmony_ci    uint32_t physical_count = 0;
4855db71995Sopenharmony_ci    for (uint32_t i = 0; i < 3; i++) {
4865db71995Sopenharmony_ci        env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_ENUMERATE_ADAPTER_PHYSICAL_DEVICES));
4875db71995Sopenharmony_ci        env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2));
4885db71995Sopenharmony_ci        auto& driver_5 = env.get_test_icd(i * 2 + 1);
4895db71995Sopenharmony_ci        driver_5.set_max_icd_interface_version(5);
4905db71995Sopenharmony_ci        driver_5.set_min_icd_interface_version(5);
4915db71995Sopenharmony_ci        driver_5.setup_WSI();
4925db71995Sopenharmony_ci        driver_5.physical_devices.push_back({});
4935db71995Sopenharmony_ci        driver_5.physical_devices.back().queue_family_properties.push_back(family_props);
4945db71995Sopenharmony_ci        driver_5.physical_devices.push_back({});
4955db71995Sopenharmony_ci        driver_5.physical_devices.back().queue_family_properties.push_back(family_props);
4965db71995Sopenharmony_ci        driver_5.physical_devices.push_back({});
4975db71995Sopenharmony_ci        driver_5.physical_devices.back().queue_family_properties.push_back(family_props);
4985db71995Sopenharmony_ci        physical_count += static_cast<uint32_t>(driver_5.physical_devices.size());
4995db71995Sopenharmony_ci
5005db71995Sopenharmony_ci        auto& driver_6 = env.get_test_icd(i * 2);
5015db71995Sopenharmony_ci        driver_6.setup_WSI();
5025db71995Sopenharmony_ci        driver_6.physical_devices.emplace_back("physical_device_0");
5035db71995Sopenharmony_ci        driver_6.physical_devices.back().queue_family_properties.push_back(family_props);
5045db71995Sopenharmony_ci        driver_6.physical_devices.emplace_back("physical_device_1");
5055db71995Sopenharmony_ci        driver_6.physical_devices.back().queue_family_properties.push_back(family_props);
5065db71995Sopenharmony_ci        physical_count += static_cast<uint32_t>(driver_6.physical_devices.size());
5075db71995Sopenharmony_ci
5085db71995Sopenharmony_ci        driver_6.set_max_icd_interface_version(6);
5095db71995Sopenharmony_ci        driver_6.set_min_icd_interface_version(5);
5105db71995Sopenharmony_ci
5115db71995Sopenharmony_ci        uint32_t driver_index = i % 4;  // which drive this test pretends to be, must stay below 4
5125db71995Sopenharmony_ci        auto& known_driver = known_driver_list.at(driver_index);
5135db71995Sopenharmony_ci        DXGI_ADAPTER_DESC1 desc1{};
5145db71995Sopenharmony_ci        desc1.VendorId = known_driver.vendor_id;
5155db71995Sopenharmony_ci        desc1.AdapterLuid = LUID{100 + i, static_cast<LONG>(100 + i)};
5165db71995Sopenharmony_ci        driver_6.set_adapterLUID(desc1.AdapterLuid);
5175db71995Sopenharmony_ci        env.platform_shim->add_dxgi_adapter(GpuType::discrete, desc1);
5185db71995Sopenharmony_ci    }
5195db71995Sopenharmony_ci    uint32_t returned_physical_count = 0;
5205db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
5215db71995Sopenharmony_ci    inst.create_info.setup_WSI();
5225db71995Sopenharmony_ci    inst.CheckCreate();
5235db71995Sopenharmony_ci
5245db71995Sopenharmony_ci    ASSERT_EQ(VK_SUCCESS, env.vulkan_functions.vkEnumeratePhysicalDevices(inst.inst, &returned_physical_count, nullptr));
5255db71995Sopenharmony_ci    ASSERT_EQ(physical_count, returned_physical_count);
5265db71995Sopenharmony_ci    std::vector<VkPhysicalDevice> physical_device_handles{returned_physical_count};
5275db71995Sopenharmony_ci    ASSERT_EQ(VK_SUCCESS,
5285db71995Sopenharmony_ci              env.vulkan_functions.vkEnumeratePhysicalDevices(inst.inst, &returned_physical_count, physical_device_handles.data()));
5295db71995Sopenharmony_ci    ASSERT_EQ(physical_count, returned_physical_count);
5305db71995Sopenharmony_ci
5315db71995Sopenharmony_ci    VkSurfaceKHR surface{};
5325db71995Sopenharmony_ci    ASSERT_EQ(VK_SUCCESS, create_surface(inst, surface));
5335db71995Sopenharmony_ci    for (const auto& handle : physical_device_handles) {
5345db71995Sopenharmony_ci        handle_assert_has_value(handle);
5355db71995Sopenharmony_ci
5365db71995Sopenharmony_ci        VkBool32 supported = false;
5375db71995Sopenharmony_ci        EXPECT_EQ(VK_SUCCESS, env.vulkan_functions.vkGetPhysicalDeviceSurfaceSupportKHR(handle, 0, surface, &supported));
5385db71995Sopenharmony_ci    }
5395db71995Sopenharmony_ci    for (uint32_t i = 0; i < 3; i++) {
5405db71995Sopenharmony_ci        auto& driver_6 = env.get_test_icd(i * 2);
5415db71995Sopenharmony_ci        EXPECT_EQ(driver_6.called_enumerate_adapter_physical_devices, true);
5425db71995Sopenharmony_ci    }
5435db71995Sopenharmony_ci}
5445db71995Sopenharmony_ci#endif  // defined(WIN32)
5455db71995Sopenharmony_ci
5465db71995Sopenharmony_ci// shim function pointers for 1.3
5475db71995Sopenharmony_ci// Should use autogen for this - it generates 'shim' functions for validation layers, maybe that could be used here.
5485db71995Sopenharmony_civoid test_vkCmdBeginRendering(VkCommandBuffer, const VkRenderingInfo*) {}
5495db71995Sopenharmony_civoid test_vkCmdBindVertexBuffers2(VkCommandBuffer, uint32_t, uint32_t, const VkBuffer*, const VkDeviceSize*, const VkDeviceSize*,
5505db71995Sopenharmony_ci                                  const VkDeviceSize*) {}
5515db71995Sopenharmony_civoid test_vkCmdBlitImage2(VkCommandBuffer, const VkBlitImageInfo2*) {}
5525db71995Sopenharmony_civoid test_vkCmdCopyBuffer2(VkCommandBuffer, const VkCopyBufferInfo2*) {}
5535db71995Sopenharmony_civoid test_vkCmdCopyBufferToImage2(VkCommandBuffer, const VkCopyBufferToImageInfo2*) {}
5545db71995Sopenharmony_civoid test_vkCmdCopyImage2(VkCommandBuffer, const VkCopyImageInfo2*) {}
5555db71995Sopenharmony_civoid test_vkCmdCopyImageToBuffer2(VkCommandBuffer, const VkCopyImageToBufferInfo2*) {}
5565db71995Sopenharmony_civoid test_vkCmdEndRendering(VkCommandBuffer) {}
5575db71995Sopenharmony_civoid test_vkCmdPipelineBarrier2(VkCommandBuffer, const VkDependencyInfo*) {}
5585db71995Sopenharmony_civoid test_vkCmdResetEvent2(VkCommandBuffer, VkEvent, VkPipelineStageFlags2) {}
5595db71995Sopenharmony_civoid test_vkCmdResolveImage2(VkCommandBuffer, const VkResolveImageInfo2*) {}
5605db71995Sopenharmony_civoid test_vkCmdSetCullMode(VkCommandBuffer, VkCullModeFlags) {}
5615db71995Sopenharmony_civoid test_vkCmdSetDepthBiasEnable(VkCommandBuffer, VkBool32) {}
5625db71995Sopenharmony_civoid test_vkCmdSetDepthBoundsTestEnable(VkCommandBuffer, VkBool32) {}
5635db71995Sopenharmony_civoid test_vkCmdSetDepthCompareOp(VkCommandBuffer, VkCompareOp) {}
5645db71995Sopenharmony_civoid test_vkCmdSetDepthTestEnable(VkCommandBuffer, VkBool32) {}
5655db71995Sopenharmony_civoid test_vkCmdSetDepthWriteEnable(VkCommandBuffer, VkBool32) {}
5665db71995Sopenharmony_civoid test_vkCmdSetEvent2(VkCommandBuffer, VkEvent, const VkDependencyInfo*) {}
5675db71995Sopenharmony_civoid test_vkCmdSetFrontFace(VkCommandBuffer, VkFrontFace) {}
5685db71995Sopenharmony_civoid test_vkCmdSetPrimitiveRestartEnable(VkCommandBuffer, VkBool32) {}
5695db71995Sopenharmony_civoid test_vkCmdSetPrimitiveTopology(VkCommandBuffer, VkPrimitiveTopology) {}
5705db71995Sopenharmony_civoid test_vkCmdSetRasterizerDiscardEnable(VkCommandBuffer, VkBool32) {}
5715db71995Sopenharmony_civoid test_vkCmdSetScissorWithCount(VkCommandBuffer, uint32_t, const VkRect2D*) {}
5725db71995Sopenharmony_civoid test_vkCmdSetStencilOp(VkCommandBuffer, VkStencilFaceFlags, VkStencilOp, VkStencilOp, VkStencilOp, VkCompareOp) {}
5735db71995Sopenharmony_civoid test_vkCmdSetStencilTestEnable(VkCommandBuffer, VkBool32) {}
5745db71995Sopenharmony_civoid test_vkCmdSetViewportWithCount(VkCommandBuffer, uint32_t, const VkViewport*) {}
5755db71995Sopenharmony_civoid test_vkCmdWaitEvents2(VkCommandBuffer, uint32_t, const VkEvent*, const VkDependencyInfo*) {}
5765db71995Sopenharmony_civoid test_vkCmdWriteTimestamp2(VkCommandBuffer, VkPipelineStageFlags2, VkQueryPool, uint32_t) {}
5775db71995Sopenharmony_ciVkResult test_vkCreatePrivateDataSlot(VkDevice, const VkPrivateDataSlotCreateInfo*, const VkAllocationCallbacks*,
5785db71995Sopenharmony_ci                                      VkPrivateDataSlot*) {
5795db71995Sopenharmony_ci    return VK_SUCCESS;
5805db71995Sopenharmony_ci}
5815db71995Sopenharmony_civoid test_vkDestroyPrivateDataSlot(VkDevice, VkPrivateDataSlot, const VkAllocationCallbacks*) {}
5825db71995Sopenharmony_civoid test_vkGetDeviceBufferMemoryRequirements(VkDevice, const VkDeviceBufferMemoryRequirements*, VkMemoryRequirements2*) {}
5835db71995Sopenharmony_civoid test_vkGetDeviceImageMemoryRequirements(VkDevice, const VkDeviceImageMemoryRequirements*, VkMemoryRequirements2*) {}
5845db71995Sopenharmony_civoid test_vkGetDeviceImageSparseMemoryRequirements(VkDevice, const VkDeviceImageMemoryRequirements*, uint32_t*,
5855db71995Sopenharmony_ci                                                   VkSparseImageMemoryRequirements2*) {}
5865db71995Sopenharmony_civoid test_vkGetPrivateData(VkDevice, VkObjectType, uint64_t, VkPrivateDataSlot, uint64_t*) {}
5875db71995Sopenharmony_ciVkResult test_vkQueueSubmit2(VkQueue, uint32_t, const VkSubmitInfo2*, VkFence) { return VK_SUCCESS; }
5885db71995Sopenharmony_ciVkResult test_vkSetPrivateData(VkDevice, VkObjectType, uint64_t, VkPrivateDataSlot, uint64_t) { return VK_SUCCESS; }
5895db71995Sopenharmony_ci
5905db71995Sopenharmony_ciTEST(MinorVersionUpdate, Version1_3) {
5915db71995Sopenharmony_ci    FrameworkEnvironment env{};
5925db71995Sopenharmony_ci    auto& driver = env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA)).add_physical_device({});
5935db71995Sopenharmony_ci    driver.physical_devices.back().known_device_functions = {
5945db71995Sopenharmony_ci        VulkanFunction{"vkCmdBeginRendering", to_vkVoidFunction(test_vkCmdBeginRendering)},
5955db71995Sopenharmony_ci        VulkanFunction{"vkCmdBindVertexBuffers2", to_vkVoidFunction(test_vkCmdBindVertexBuffers2)},
5965db71995Sopenharmony_ci        VulkanFunction{"vkCmdBlitImage2", to_vkVoidFunction(test_vkCmdBlitImage2)},
5975db71995Sopenharmony_ci        VulkanFunction{"vkCmdCopyBuffer2", to_vkVoidFunction(test_vkCmdCopyBuffer2)},
5985db71995Sopenharmony_ci        VulkanFunction{"vkCmdCopyBufferToImage2", to_vkVoidFunction(test_vkCmdCopyBufferToImage2)},
5995db71995Sopenharmony_ci        VulkanFunction{"vkCmdCopyImage2", to_vkVoidFunction(test_vkCmdCopyImage2)},
6005db71995Sopenharmony_ci        VulkanFunction{"vkCmdCopyImageToBuffer2", to_vkVoidFunction(test_vkCmdCopyImageToBuffer2)},
6015db71995Sopenharmony_ci        VulkanFunction{"vkCmdEndRendering", to_vkVoidFunction(test_vkCmdEndRendering)},
6025db71995Sopenharmony_ci        VulkanFunction{"vkCmdPipelineBarrier2", to_vkVoidFunction(test_vkCmdPipelineBarrier2)},
6035db71995Sopenharmony_ci        VulkanFunction{"vkCmdResetEvent2", to_vkVoidFunction(test_vkCmdResetEvent2)},
6045db71995Sopenharmony_ci        VulkanFunction{"vkCmdResolveImage2", to_vkVoidFunction(test_vkCmdResolveImage2)},
6055db71995Sopenharmony_ci        VulkanFunction{"vkCmdSetCullMode", to_vkVoidFunction(test_vkCmdSetCullMode)},
6065db71995Sopenharmony_ci        VulkanFunction{"vkCmdSetDepthBiasEnable", to_vkVoidFunction(test_vkCmdSetDepthBiasEnable)},
6075db71995Sopenharmony_ci        VulkanFunction{"vkCmdSetDepthBoundsTestEnable", to_vkVoidFunction(test_vkCmdSetDepthBoundsTestEnable)},
6085db71995Sopenharmony_ci        VulkanFunction{"vkCmdSetDepthCompareOp", to_vkVoidFunction(test_vkCmdSetDepthCompareOp)},
6095db71995Sopenharmony_ci        VulkanFunction{"vkCmdSetDepthTestEnable", to_vkVoidFunction(test_vkCmdSetDepthTestEnable)},
6105db71995Sopenharmony_ci        VulkanFunction{"vkCmdSetDepthWriteEnable", to_vkVoidFunction(test_vkCmdSetDepthWriteEnable)},
6115db71995Sopenharmony_ci        VulkanFunction{"vkCmdSetEvent2", to_vkVoidFunction(test_vkCmdSetEvent2)},
6125db71995Sopenharmony_ci        VulkanFunction{"vkCmdSetFrontFace", to_vkVoidFunction(test_vkCmdSetFrontFace)},
6135db71995Sopenharmony_ci        VulkanFunction{"vkCmdSetPrimitiveRestartEnable", to_vkVoidFunction(test_vkCmdSetPrimitiveRestartEnable)},
6145db71995Sopenharmony_ci        VulkanFunction{"vkCmdSetPrimitiveTopology", to_vkVoidFunction(test_vkCmdSetPrimitiveTopology)},
6155db71995Sopenharmony_ci        VulkanFunction{"vkCmdSetRasterizerDiscardEnable", to_vkVoidFunction(test_vkCmdSetRasterizerDiscardEnable)},
6165db71995Sopenharmony_ci        VulkanFunction{"vkCmdSetScissorWithCount", to_vkVoidFunction(test_vkCmdSetScissorWithCount)},
6175db71995Sopenharmony_ci        VulkanFunction{"vkCmdSetStencilOp", to_vkVoidFunction(test_vkCmdSetStencilOp)},
6185db71995Sopenharmony_ci        VulkanFunction{"vkCmdSetStencilTestEnable", to_vkVoidFunction(test_vkCmdSetStencilTestEnable)},
6195db71995Sopenharmony_ci        VulkanFunction{"vkCmdSetViewportWithCount", to_vkVoidFunction(test_vkCmdSetViewportWithCount)},
6205db71995Sopenharmony_ci        VulkanFunction{"vkCmdWaitEvents2", to_vkVoidFunction(test_vkCmdWaitEvents2)},
6215db71995Sopenharmony_ci        VulkanFunction{"vkCmdWriteTimestamp2", to_vkVoidFunction(test_vkCmdWriteTimestamp2)},
6225db71995Sopenharmony_ci        VulkanFunction{"vkCreatePrivateDataSlot", to_vkVoidFunction(test_vkCreatePrivateDataSlot)},
6235db71995Sopenharmony_ci        VulkanFunction{"vkDestroyPrivateDataSlot", to_vkVoidFunction(test_vkDestroyPrivateDataSlot)},
6245db71995Sopenharmony_ci        VulkanFunction{"vkGetDeviceBufferMemoryRequirements", to_vkVoidFunction(test_vkGetDeviceBufferMemoryRequirements)},
6255db71995Sopenharmony_ci        VulkanFunction{"vkGetDeviceImageMemoryRequirements", to_vkVoidFunction(test_vkGetDeviceImageMemoryRequirements)},
6265db71995Sopenharmony_ci        VulkanFunction{"vkGetDeviceImageSparseMemoryRequirements",
6275db71995Sopenharmony_ci                       to_vkVoidFunction(test_vkGetDeviceImageSparseMemoryRequirements)},
6285db71995Sopenharmony_ci        VulkanFunction{"vkGetPrivateData", to_vkVoidFunction(test_vkGetPrivateData)},
6295db71995Sopenharmony_ci        VulkanFunction{"vkQueueSubmit2", to_vkVoidFunction(test_vkQueueSubmit2)},
6305db71995Sopenharmony_ci        VulkanFunction{"vkSetPrivateData", to_vkVoidFunction(test_vkSetPrivateData)},
6315db71995Sopenharmony_ci    };
6325db71995Sopenharmony_ci    driver.physical_devices.back().add_extension({"VK_SOME_EXT_haha"});
6335db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
6345db71995Sopenharmony_ci    inst.create_info.set_api_version(1, 3, 0);
6355db71995Sopenharmony_ci    inst.CheckCreate();
6365db71995Sopenharmony_ci
6375db71995Sopenharmony_ci    auto phys_dev = inst.GetPhysDev();
6385db71995Sopenharmony_ci
6395db71995Sopenharmony_ci    PFN_vkGetPhysicalDeviceToolProperties GetPhysicalDeviceToolProperties = inst.load("vkGetPhysicalDeviceToolProperties");
6405db71995Sopenharmony_ci    uint32_t tool_count = 0;
6415db71995Sopenharmony_ci    ASSERT_EQ(VK_SUCCESS, GetPhysicalDeviceToolProperties(phys_dev, &tool_count, nullptr));
6425db71995Sopenharmony_ci    ASSERT_EQ(tool_count, 0U);
6435db71995Sopenharmony_ci    VkPhysicalDeviceToolProperties props;
6445db71995Sopenharmony_ci    ASSERT_EQ(VK_SUCCESS, GetPhysicalDeviceToolProperties(phys_dev, &tool_count, &props));
6455db71995Sopenharmony_ci
6465db71995Sopenharmony_ci    DeviceWrapper device{inst};
6475db71995Sopenharmony_ci    device.CheckCreate(phys_dev);
6485db71995Sopenharmony_ci
6495db71995Sopenharmony_ci    PFN_vkCreateCommandPool CreateCommandPool = device.load("vkCreateCommandPool");
6505db71995Sopenharmony_ci    PFN_vkAllocateCommandBuffers AllocateCommandBuffers = device.load("vkAllocateCommandBuffers");
6515db71995Sopenharmony_ci    PFN_vkDestroyCommandPool DestroyCommandPool = device.load("vkDestroyCommandPool");
6525db71995Sopenharmony_ci    VkCommandPool command_pool{};
6535db71995Sopenharmony_ci    VkCommandPoolCreateInfo pool_create_info{};
6545db71995Sopenharmony_ci    pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
6555db71995Sopenharmony_ci    ASSERT_EQ(VK_SUCCESS, CreateCommandPool(device, &pool_create_info, nullptr, &command_pool));
6565db71995Sopenharmony_ci    VkCommandBufferAllocateInfo buffer_allocate_info{};
6575db71995Sopenharmony_ci    buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
6585db71995Sopenharmony_ci    buffer_allocate_info.commandPool = command_pool;
6595db71995Sopenharmony_ci    buffer_allocate_info.commandBufferCount = 1;
6605db71995Sopenharmony_ci    VkCommandBuffer command_buffer{};
6615db71995Sopenharmony_ci    ASSERT_EQ(VK_SUCCESS, AllocateCommandBuffers(device, &buffer_allocate_info, &command_buffer));
6625db71995Sopenharmony_ci    DestroyCommandPool(device, command_pool, nullptr);
6635db71995Sopenharmony_ci
6645db71995Sopenharmony_ci    PFN_vkCmdBeginRendering CmdBeginRendering = device.load("vkCmdBeginRendering");
6655db71995Sopenharmony_ci    VkRenderingInfoKHR rendering_info{};
6665db71995Sopenharmony_ci    CmdBeginRendering(command_buffer, &rendering_info);
6675db71995Sopenharmony_ci
6685db71995Sopenharmony_ci    PFN_vkCmdBindVertexBuffers2 CmdBindVertexBuffers2 = device.load("vkCmdBindVertexBuffers2");
6695db71995Sopenharmony_ci    CmdBindVertexBuffers2(command_buffer, 0, 0, nullptr, nullptr, nullptr, nullptr);
6705db71995Sopenharmony_ci
6715db71995Sopenharmony_ci    PFN_vkCmdBlitImage2 CmdBlitImage2 = device.load("vkCmdBlitImage2");
6725db71995Sopenharmony_ci    VkBlitImageInfo2 image_info{};
6735db71995Sopenharmony_ci    CmdBlitImage2(command_buffer, &image_info);
6745db71995Sopenharmony_ci
6755db71995Sopenharmony_ci    PFN_vkCmdCopyBuffer2 CmdCopyBuffer2 = device.load("vkCmdCopyBuffer2");
6765db71995Sopenharmony_ci    VkCopyBufferInfo2 copy_info{};
6775db71995Sopenharmony_ci    CmdCopyBuffer2(command_buffer, &copy_info);
6785db71995Sopenharmony_ci
6795db71995Sopenharmony_ci    PFN_vkCmdCopyBufferToImage2 CmdCopyBufferToImage2 = device.load("vkCmdCopyBufferToImage2");
6805db71995Sopenharmony_ci    VkCopyBufferToImageInfo2 copy_buf_image{};
6815db71995Sopenharmony_ci    CmdCopyBufferToImage2(command_buffer, &copy_buf_image);
6825db71995Sopenharmony_ci
6835db71995Sopenharmony_ci    PFN_vkCmdCopyImage2 CmdCopyImage2 = device.load("vkCmdCopyImage2");
6845db71995Sopenharmony_ci    VkCopyImageInfo2 copy_image_info{};
6855db71995Sopenharmony_ci    CmdCopyImage2(command_buffer, &copy_image_info);
6865db71995Sopenharmony_ci
6875db71995Sopenharmony_ci    PFN_vkCmdCopyImageToBuffer2 CmdCopyImageToBuffer2 = device.load("vkCmdCopyImageToBuffer2");
6885db71995Sopenharmony_ci    VkCopyImageToBufferInfo2 copy_image_buf;
6895db71995Sopenharmony_ci    CmdCopyImageToBuffer2(command_buffer, &copy_image_buf);
6905db71995Sopenharmony_ci
6915db71995Sopenharmony_ci    PFN_vkCmdEndRendering CmdEndRendering = device.load("vkCmdEndRendering");
6925db71995Sopenharmony_ci    CmdEndRendering(command_buffer);
6935db71995Sopenharmony_ci
6945db71995Sopenharmony_ci    PFN_vkCmdPipelineBarrier2 CmdPipelineBarrier2 = device.load("vkCmdPipelineBarrier2");
6955db71995Sopenharmony_ci    VkDependencyInfo deps_info;
6965db71995Sopenharmony_ci    CmdPipelineBarrier2(command_buffer, &deps_info);
6975db71995Sopenharmony_ci
6985db71995Sopenharmony_ci    PFN_vkCmdResetEvent2 CmdResetEvent2 = device.load("vkCmdResetEvent2");
6995db71995Sopenharmony_ci    CmdResetEvent2(command_buffer, {}, VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT);
7005db71995Sopenharmony_ci
7015db71995Sopenharmony_ci    PFN_vkCmdResolveImage2 CmdResolveImage2 = device.load("vkCmdResolveImage2");
7025db71995Sopenharmony_ci    VkResolveImageInfo2 resolve_image{};
7035db71995Sopenharmony_ci    CmdResolveImage2(command_buffer, &resolve_image);
7045db71995Sopenharmony_ci
7055db71995Sopenharmony_ci    PFN_vkCmdSetCullMode CmdSetCullMode = device.load("vkCmdSetCullMode");
7065db71995Sopenharmony_ci    CmdSetCullMode(command_buffer, VK_CULL_MODE_BACK_BIT);
7075db71995Sopenharmony_ci
7085db71995Sopenharmony_ci    PFN_vkCmdSetDepthBiasEnable CmdSetDepthBiasEnable = device.load("vkCmdSetDepthBiasEnable");
7095db71995Sopenharmony_ci    CmdSetDepthBiasEnable(command_buffer, true);
7105db71995Sopenharmony_ci
7115db71995Sopenharmony_ci    PFN_vkCmdSetDepthBoundsTestEnable CmdSetDepthBoundsTestEnable = device.load("vkCmdSetDepthBoundsTestEnable");
7125db71995Sopenharmony_ci    CmdSetDepthBoundsTestEnable(command_buffer, true);
7135db71995Sopenharmony_ci
7145db71995Sopenharmony_ci    PFN_vkCmdSetDepthCompareOp CmdSetDepthCompareOp = device.load("vkCmdSetDepthCompareOp");
7155db71995Sopenharmony_ci    CmdSetDepthCompareOp(command_buffer, VK_COMPARE_OP_ALWAYS);
7165db71995Sopenharmony_ci
7175db71995Sopenharmony_ci    PFN_vkCmdSetDepthTestEnable CmdSetDepthTestEnable = device.load("vkCmdSetDepthTestEnable");
7185db71995Sopenharmony_ci    CmdSetDepthTestEnable(command_buffer, true);
7195db71995Sopenharmony_ci
7205db71995Sopenharmony_ci    PFN_vkCmdSetDepthWriteEnable CmdSetDepthWriteEnable = device.load("vkCmdSetDepthWriteEnable");
7215db71995Sopenharmony_ci    CmdSetDepthWriteEnable(command_buffer, true);
7225db71995Sopenharmony_ci
7235db71995Sopenharmony_ci    PFN_vkCmdSetEvent2 CmdSetEvent2 = device.load("vkCmdSetEvent2");
7245db71995Sopenharmony_ci    CmdSetEvent2(command_buffer, {}, &deps_info);
7255db71995Sopenharmony_ci
7265db71995Sopenharmony_ci    PFN_vkCmdSetFrontFace CmdSetFrontFace = device.load("vkCmdSetFrontFace");
7275db71995Sopenharmony_ci    CmdSetFrontFace(command_buffer, VK_FRONT_FACE_CLOCKWISE);
7285db71995Sopenharmony_ci
7295db71995Sopenharmony_ci    PFN_vkCmdSetPrimitiveRestartEnable CmdSetPrimitiveRestartEnable = device.load("vkCmdSetPrimitiveRestartEnable");
7305db71995Sopenharmony_ci    CmdSetPrimitiveRestartEnable(command_buffer, true);
7315db71995Sopenharmony_ci
7325db71995Sopenharmony_ci    PFN_vkCmdSetPrimitiveTopology CmdSetPrimitiveTopology = device.load("vkCmdSetPrimitiveTopology");
7335db71995Sopenharmony_ci    CmdSetPrimitiveTopology(command_buffer, VK_PRIMITIVE_TOPOLOGY_LINE_LIST);
7345db71995Sopenharmony_ci
7355db71995Sopenharmony_ci    PFN_vkCmdSetRasterizerDiscardEnable CmdSetRasterizerDiscardEnable = device.load("vkCmdSetRasterizerDiscardEnable");
7365db71995Sopenharmony_ci    CmdSetRasterizerDiscardEnable(command_buffer, true);
7375db71995Sopenharmony_ci
7385db71995Sopenharmony_ci    PFN_vkCmdSetScissorWithCount CmdSetScissorWithCount = device.load("vkCmdSetScissorWithCount");
7395db71995Sopenharmony_ci    CmdSetScissorWithCount(command_buffer, 0, nullptr);
7405db71995Sopenharmony_ci
7415db71995Sopenharmony_ci    PFN_vkCmdSetStencilOp CmdSetStencilOp = device.load("vkCmdSetStencilOp");
7425db71995Sopenharmony_ci    CmdSetStencilOp(command_buffer, VK_STENCIL_FACE_BACK_BIT, VK_STENCIL_OP_DECREMENT_AND_WRAP, VK_STENCIL_OP_DECREMENT_AND_CLAMP,
7435db71995Sopenharmony_ci                    VK_STENCIL_OP_DECREMENT_AND_WRAP, VK_COMPARE_OP_ALWAYS);
7445db71995Sopenharmony_ci
7455db71995Sopenharmony_ci    PFN_vkCmdSetStencilTestEnable CmdSetStencilTestEnable = device.load("vkCmdSetStencilTestEnable");
7465db71995Sopenharmony_ci    CmdSetStencilTestEnable(command_buffer, true);
7475db71995Sopenharmony_ci
7485db71995Sopenharmony_ci    PFN_vkCmdSetViewportWithCount CmdSetViewportWithCount = device.load("vkCmdSetViewportWithCount");
7495db71995Sopenharmony_ci    CmdSetViewportWithCount(command_buffer, 0, nullptr);
7505db71995Sopenharmony_ci
7515db71995Sopenharmony_ci    PFN_vkCmdWaitEvents2 CmdWaitEvents2 = device.load("vkCmdWaitEvents2");
7525db71995Sopenharmony_ci    CmdWaitEvents2(command_buffer, 0, nullptr, &deps_info);
7535db71995Sopenharmony_ci
7545db71995Sopenharmony_ci    PFN_vkCmdWriteTimestamp2 CmdWriteTimestamp2 = device.load("vkCmdWriteTimestamp2");
7555db71995Sopenharmony_ci    CmdWriteTimestamp2(command_buffer, VK_PIPELINE_STAGE_2_BLIT_BIT, {}, 0);
7565db71995Sopenharmony_ci
7575db71995Sopenharmony_ci    PFN_vkCreatePrivateDataSlot CreatePrivateDataSlot = device.load("vkCreatePrivateDataSlot");
7585db71995Sopenharmony_ci    CreatePrivateDataSlot(device, nullptr, nullptr, nullptr);
7595db71995Sopenharmony_ci    PFN_vkDestroyPrivateDataSlot DestroyPrivateDataSlot = device.load("vkDestroyPrivateDataSlot");
7605db71995Sopenharmony_ci    DestroyPrivateDataSlot(device, VK_NULL_HANDLE, nullptr);
7615db71995Sopenharmony_ci    PFN_vkGetDeviceBufferMemoryRequirements GetDeviceBufferMemoryRequirements = device.load("vkGetDeviceBufferMemoryRequirements");
7625db71995Sopenharmony_ci    GetDeviceBufferMemoryRequirements(device, nullptr, nullptr);
7635db71995Sopenharmony_ci    PFN_vkGetDeviceImageMemoryRequirements GetDeviceImageMemoryRequirements = device.load("vkGetDeviceImageMemoryRequirements");
7645db71995Sopenharmony_ci    GetDeviceImageMemoryRequirements(device, nullptr, nullptr);
7655db71995Sopenharmony_ci    PFN_vkGetDeviceImageSparseMemoryRequirements GetDeviceImageSparseMemoryRequirements =
7665db71995Sopenharmony_ci        device.load("vkGetDeviceImageSparseMemoryRequirements");
7675db71995Sopenharmony_ci    GetDeviceImageSparseMemoryRequirements(device, nullptr, nullptr, nullptr);
7685db71995Sopenharmony_ci    PFN_vkGetPrivateData GetPrivateData = device.load("vkGetPrivateData");
7695db71995Sopenharmony_ci    GetPrivateData(device, VK_OBJECT_TYPE_UNKNOWN, 0, {}, nullptr);
7705db71995Sopenharmony_ci    PFN_vkQueueSubmit2 QueueSubmit2 = device.load("vkQueueSubmit2");
7715db71995Sopenharmony_ci    QueueSubmit2(nullptr, 0, nullptr, VK_NULL_HANDLE);
7725db71995Sopenharmony_ci    PFN_vkSetPrivateData SetPrivateData = device.load("vkSetPrivateData");
7735db71995Sopenharmony_ci    SetPrivateData(device, VK_OBJECT_TYPE_UNKNOWN, 0, {}, 0);
7745db71995Sopenharmony_ci}
7755db71995Sopenharmony_ci
7765db71995Sopenharmony_ciTEST(ApplicationInfoVersion, NonVulkanVariant) {
7775db71995Sopenharmony_ci    FrameworkEnvironment env{};
7785db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA)).add_physical_device({});
7795db71995Sopenharmony_ci
7805db71995Sopenharmony_ci    DebugUtilsLogger log;
7815db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
7825db71995Sopenharmony_ci    inst.create_info.set_api_version(VK_MAKE_API_VERSION(1, 0, 0, 0));
7835db71995Sopenharmony_ci    FillDebugUtilsCreateDetails(inst.create_info, log);
7845db71995Sopenharmony_ci    inst.CheckCreate();
7855db71995Sopenharmony_ci    ASSERT_TRUE(log.find(
7865db71995Sopenharmony_ci        std::string("vkCreateInstance: The API Variant specified in pCreateInfo->pApplicationInfo.apiVersion is 1 instead of "
7875db71995Sopenharmony_ci                    "the expected value of 0.")));
7885db71995Sopenharmony_ci}
7895db71995Sopenharmony_ci
7905db71995Sopenharmony_ciTEST(DriverManifest, NonVulkanVariant) {
7915db71995Sopenharmony_ci    FrameworkEnvironment env{};
7925db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA, VK_MAKE_API_VERSION(1, 1, 0, 0))).add_physical_device({});
7935db71995Sopenharmony_ci
7945db71995Sopenharmony_ci    DebugUtilsLogger log;
7955db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
7965db71995Sopenharmony_ci    inst.create_info.set_api_version(VK_MAKE_API_VERSION(0, 1, 0, 0));
7975db71995Sopenharmony_ci    FillDebugUtilsCreateDetails(inst.create_info, log);
7985db71995Sopenharmony_ci    inst.CheckCreate(VK_ERROR_INCOMPATIBLE_DRIVER);
7995db71995Sopenharmony_ci    ASSERT_TRUE(log.find("loader_parse_icd_manifest: Driver's ICD JSON "));
8005db71995Sopenharmony_ci    // log prints the path to the file, don't look for it since it is hard to determine inside the test what the path should be.
8015db71995Sopenharmony_ci    ASSERT_TRUE(log.find("\'api_version\' field contains a non-zero variant value of 1.  Skipping ICD JSON."));
8025db71995Sopenharmony_ci}
8035db71995Sopenharmony_ci
8045db71995Sopenharmony_ciTEST(LayerManifest, ImplicitNonVulkanVariant) {
8055db71995Sopenharmony_ci    FrameworkEnvironment env{};
8065db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA, VK_MAKE_API_VERSION(0, 1, 0, 0))).add_physical_device({});
8075db71995Sopenharmony_ci
8085db71995Sopenharmony_ci    const char* implicit_layer_name = "ImplicitTestLayer";
8095db71995Sopenharmony_ci    env.add_implicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{}
8105db71995Sopenharmony_ci                                                         .set_name(implicit_layer_name)
8115db71995Sopenharmony_ci                                                         .set_api_version(VK_MAKE_API_VERSION(1, 1, 0, 0))
8125db71995Sopenharmony_ci                                                         .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)
8135db71995Sopenharmony_ci                                                         .set_disable_environment("DISABLE_ME")),
8145db71995Sopenharmony_ci                           "implicit_test_layer.json");
8155db71995Sopenharmony_ci
8165db71995Sopenharmony_ci    DebugUtilsLogger log;
8175db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
8185db71995Sopenharmony_ci    inst.create_info.set_api_version(VK_MAKE_API_VERSION(0, 1, 0, 0));
8195db71995Sopenharmony_ci    FillDebugUtilsCreateDetails(inst.create_info, log);
8205db71995Sopenharmony_ci    inst.CheckCreate();
8215db71995Sopenharmony_ci    ASSERT_TRUE(log.find(std::string("Layer \"") + implicit_layer_name +
8225db71995Sopenharmony_ci                         "\" has an \'api_version\' field which contains a non-zero variant value of 1.  Skipping Layer."));
8235db71995Sopenharmony_ci}
8245db71995Sopenharmony_ci
8255db71995Sopenharmony_ciTEST(LayerManifest, ExplicitNonVulkanVariant) {
8265db71995Sopenharmony_ci    FrameworkEnvironment env{};
8275db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA, VK_MAKE_API_VERSION(0, 1, 0, 0))).add_physical_device({});
8285db71995Sopenharmony_ci
8295db71995Sopenharmony_ci    const char* explicit_layer_name = "ExplicitTestLayer";
8305db71995Sopenharmony_ci    env.add_explicit_layer(ManifestLayer{}.add_layer(ManifestLayer::LayerDescription{}
8315db71995Sopenharmony_ci                                                         .set_name(explicit_layer_name)
8325db71995Sopenharmony_ci                                                         .set_api_version(VK_MAKE_API_VERSION(1, 1, 0, 0))
8335db71995Sopenharmony_ci                                                         .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)),
8345db71995Sopenharmony_ci                           "explicit_test_layer.json");
8355db71995Sopenharmony_ci
8365db71995Sopenharmony_ci    DebugUtilsLogger log;
8375db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
8385db71995Sopenharmony_ci    inst.create_info.set_api_version(VK_MAKE_API_VERSION(0, 1, 0, 0)).add_layer(explicit_layer_name);
8395db71995Sopenharmony_ci    FillDebugUtilsCreateDetails(inst.create_info, log);
8405db71995Sopenharmony_ci    inst.CheckCreate(VK_ERROR_LAYER_NOT_PRESENT);
8415db71995Sopenharmony_ci    ASSERT_TRUE(log.find(std::string("Layer \"") + explicit_layer_name +
8425db71995Sopenharmony_ci                         "\" has an \'api_version\' field which contains a non-zero variant value of 1.  Skipping Layer."));
8435db71995Sopenharmony_ci}
8445db71995Sopenharmony_ci
8455db71995Sopenharmony_ciTEST(DriverManifest, UnknownManifestVersion) {
8465db71995Sopenharmony_ci    FrameworkEnvironment env{};
8475db71995Sopenharmony_ci    env.add_icd(
8485db71995Sopenharmony_ci           TestICDDetails(ManifestICD{}.set_lib_path(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA).set_file_format_version({3, 2, 1})))
8495db71995Sopenharmony_ci        .add_physical_device({});
8505db71995Sopenharmony_ci
8515db71995Sopenharmony_ci    DebugUtilsLogger log;
8525db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
8535db71995Sopenharmony_ci    inst.create_info.set_api_version(VK_MAKE_API_VERSION(0, 1, 0, 0));
8545db71995Sopenharmony_ci    FillDebugUtilsCreateDetails(inst.create_info, log);
8555db71995Sopenharmony_ci    inst.CheckCreate();
8565db71995Sopenharmony_ci    ASSERT_TRUE(log.find("loader_parse_icd_manifest: "));
8575db71995Sopenharmony_ci    // log prints the path to the file, don't look for it since it is hard to determine inside the test what the path should be.
8585db71995Sopenharmony_ci    ASSERT_TRUE(log.find("has unknown icd manifest file version 3.2.1. May cause errors."));
8595db71995Sopenharmony_ci}
8605db71995Sopenharmony_ci
8615db71995Sopenharmony_ciTEST(DriverManifest, LargeUnknownManifestVersion) {
8625db71995Sopenharmony_ci    FrameworkEnvironment env{};
8635db71995Sopenharmony_ci    env.add_icd(TestICDDetails(
8645db71995Sopenharmony_ci                    ManifestICD{}.set_lib_path(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA).set_file_format_version({100, 222, 111})))
8655db71995Sopenharmony_ci        .add_physical_device({});
8665db71995Sopenharmony_ci
8675db71995Sopenharmony_ci    DebugUtilsLogger log;
8685db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
8695db71995Sopenharmony_ci    inst.create_info.set_api_version(VK_MAKE_API_VERSION(0, 1, 0, 0));
8705db71995Sopenharmony_ci    FillDebugUtilsCreateDetails(inst.create_info, log);
8715db71995Sopenharmony_ci    inst.CheckCreate();
8725db71995Sopenharmony_ci    ASSERT_TRUE(log.find("loader_parse_icd_manifest: "));
8735db71995Sopenharmony_ci    // log prints the path to the file, don't look for it since it is hard to determine inside the test what the path should be.
8745db71995Sopenharmony_ci    ASSERT_TRUE(log.find("has unknown icd manifest file version 100.222.111. May cause errors."));
8755db71995Sopenharmony_ci}
8765db71995Sopenharmony_ci
8775db71995Sopenharmony_ciTEST(LayerManifest, UnknownManifestVersion) {
8785db71995Sopenharmony_ci    FrameworkEnvironment env{};
8795db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA)).add_physical_device({});
8805db71995Sopenharmony_ci
8815db71995Sopenharmony_ci    const char* implicit_layer_name = "ImplicitTestLayer";
8825db71995Sopenharmony_ci    env.add_implicit_layer(ManifestLayer{}
8835db71995Sopenharmony_ci                               .add_layer(ManifestLayer::LayerDescription{}
8845db71995Sopenharmony_ci                                              .set_name(implicit_layer_name)
8855db71995Sopenharmony_ci                                              .set_api_version(VK_MAKE_API_VERSION(0, 1, 0, 0))
8865db71995Sopenharmony_ci                                              .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)
8875db71995Sopenharmony_ci                                              .set_disable_environment("DISABLE_ME"))
8885db71995Sopenharmony_ci                               .set_file_format_version({3, 2, 1}),
8895db71995Sopenharmony_ci                           "implicit_test_layer.json");
8905db71995Sopenharmony_ci
8915db71995Sopenharmony_ci    DebugUtilsLogger log;
8925db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
8935db71995Sopenharmony_ci    inst.create_info.set_api_version(VK_MAKE_API_VERSION(0, 1, 0, 0));
8945db71995Sopenharmony_ci    FillDebugUtilsCreateDetails(inst.create_info, log);
8955db71995Sopenharmony_ci    inst.CheckCreate();
8965db71995Sopenharmony_ci    ASSERT_TRUE(log.find("loader_add_layer_properties: "));
8975db71995Sopenharmony_ci    // log prints the path to the file, don't look for it since it is hard to determine inside the test what the path should be.
8985db71995Sopenharmony_ci    ASSERT_TRUE(log.find("has unknown layer manifest file version 3.2.1.  May cause errors."));
8995db71995Sopenharmony_ci}
9005db71995Sopenharmony_ci
9015db71995Sopenharmony_ciTEST(LayerManifest, LargeUnknownManifestVersion) {
9025db71995Sopenharmony_ci    FrameworkEnvironment env{};
9035db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA)).add_physical_device({});
9045db71995Sopenharmony_ci
9055db71995Sopenharmony_ci    const char* implicit_layer_name = "ImplicitTestLayer";
9065db71995Sopenharmony_ci    env.add_implicit_layer(ManifestLayer{}
9075db71995Sopenharmony_ci                               .add_layer(ManifestLayer::LayerDescription{}
9085db71995Sopenharmony_ci                                              .set_name(implicit_layer_name)
9095db71995Sopenharmony_ci                                              .set_api_version(VK_MAKE_API_VERSION(0, 1, 0, 0))
9105db71995Sopenharmony_ci                                              .set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)
9115db71995Sopenharmony_ci                                              .set_disable_environment("DISABLE_ME"))
9125db71995Sopenharmony_ci                               .set_file_format_version({100, 222, 111}),
9135db71995Sopenharmony_ci                           "implicit_test_layer.json");
9145db71995Sopenharmony_ci
9155db71995Sopenharmony_ci    DebugUtilsLogger log;
9165db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
9175db71995Sopenharmony_ci    inst.create_info.set_api_version(VK_MAKE_API_VERSION(0, 1, 0, 0));
9185db71995Sopenharmony_ci    FillDebugUtilsCreateDetails(inst.create_info, log);
9195db71995Sopenharmony_ci    inst.CheckCreate();
9205db71995Sopenharmony_ci    ASSERT_TRUE(log.find("loader_add_layer_properties: "));
9215db71995Sopenharmony_ci    // log prints the path to the file, don't look for it since it is hard to determine inside the test what the path should be.
9225db71995Sopenharmony_ci    ASSERT_TRUE(log.find("has unknown layer manifest file version 100.222.111.  May cause errors."));
9235db71995Sopenharmony_ci}
9245db71995Sopenharmony_ci
9255db71995Sopenharmony_cistruct DriverInfo {
9265db71995Sopenharmony_ci    DriverInfo(TestICDDetails icd_details, uint32_t driver_version, bool expect_to_find) noexcept
9275db71995Sopenharmony_ci        : icd_details(icd_details), driver_version(driver_version), expect_to_find(expect_to_find) {}
9285db71995Sopenharmony_ci    TestICDDetails icd_details;
9295db71995Sopenharmony_ci    uint32_t driver_version = 0;
9305db71995Sopenharmony_ci    bool expect_to_find = false;
9315db71995Sopenharmony_ci};
9325db71995Sopenharmony_ci
9335db71995Sopenharmony_civoid CheckDirectDriverLoading(FrameworkEnvironment& env, std::vector<DriverInfo> const& normal_drivers,
9345db71995Sopenharmony_ci                              std::vector<DriverInfo> const& direct_drivers, bool exclusive) {
9355db71995Sopenharmony_ci    std::vector<VkDirectDriverLoadingInfoLUNARG> ddl_infos;
9365db71995Sopenharmony_ci    uint32_t expected_driver_count = 0;
9375db71995Sopenharmony_ci
9385db71995Sopenharmony_ci    for (auto const& driver : direct_drivers) {
9395db71995Sopenharmony_ci        auto& direct_driver_icd = env.add_icd(driver.icd_details);
9405db71995Sopenharmony_ci        direct_driver_icd.physical_devices.push_back({});
9415db71995Sopenharmony_ci        direct_driver_icd.physical_devices.at(0).properties.driverVersion = driver.driver_version;
9425db71995Sopenharmony_ci        VkDirectDriverLoadingInfoLUNARG ddl_info{};
9435db71995Sopenharmony_ci        ddl_info.sType = VK_STRUCTURE_TYPE_DIRECT_DRIVER_LOADING_INFO_LUNARG;
9445db71995Sopenharmony_ci        ddl_info.pfnGetInstanceProcAddr = env.icds.back().icd_library.get_symbol("vk_icdGetInstanceProcAddr");
9455db71995Sopenharmony_ci        ddl_infos.push_back(ddl_info);
9465db71995Sopenharmony_ci        if (driver.expect_to_find) {
9475db71995Sopenharmony_ci            expected_driver_count++;
9485db71995Sopenharmony_ci        }
9495db71995Sopenharmony_ci    }
9505db71995Sopenharmony_ci
9515db71995Sopenharmony_ci    for (auto const& driver : normal_drivers) {
9525db71995Sopenharmony_ci        auto& direct_driver_icd = env.add_icd(driver.icd_details);
9535db71995Sopenharmony_ci        direct_driver_icd.physical_devices.push_back({});
9545db71995Sopenharmony_ci        direct_driver_icd.physical_devices.at(0).properties.driverVersion = driver.driver_version;
9555db71995Sopenharmony_ci        if (!exclusive && driver.expect_to_find) {
9565db71995Sopenharmony_ci            expected_driver_count++;
9575db71995Sopenharmony_ci        }
9585db71995Sopenharmony_ci    }
9595db71995Sopenharmony_ci
9605db71995Sopenharmony_ci    VkDirectDriverLoadingListLUNARG ddl_list{};
9615db71995Sopenharmony_ci    ddl_list.sType = VK_STRUCTURE_TYPE_DIRECT_DRIVER_LOADING_LIST_LUNARG;
9625db71995Sopenharmony_ci    ddl_list.mode = exclusive ? VK_DIRECT_DRIVER_LOADING_MODE_EXCLUSIVE_LUNARG : VK_DIRECT_DRIVER_LOADING_MODE_INCLUSIVE_LUNARG;
9635db71995Sopenharmony_ci    ddl_list.driverCount = static_cast<uint32_t>(ddl_infos.size());
9645db71995Sopenharmony_ci    ddl_list.pDrivers = ddl_infos.data();
9655db71995Sopenharmony_ci
9665db71995Sopenharmony_ci    DebugUtilsLogger log;
9675db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
9685db71995Sopenharmony_ci    FillDebugUtilsCreateDetails(inst.create_info, log);
9695db71995Sopenharmony_ci    log.get()->pNext = reinterpret_cast<const void*>(&ddl_list);
9705db71995Sopenharmony_ci    inst.create_info.add_extension(VK_LUNARG_DIRECT_DRIVER_LOADING_EXTENSION_NAME);
9715db71995Sopenharmony_ci    inst.create_info.set_api_version(VK_MAKE_API_VERSION(0, 1, 0, 0));
9725db71995Sopenharmony_ci    ASSERT_NO_FATAL_FAILURE(inst.CheckCreate());
9735db71995Sopenharmony_ci
9745db71995Sopenharmony_ci    if (exclusive) {
9755db71995Sopenharmony_ci        ASSERT_TRUE(
9765db71995Sopenharmony_ci            log.find("loader_scan_for_direct_drivers: The VK_LUNARG_direct_driver_loading extension is active and specified "
9775db71995Sopenharmony_ci                     "VK_DIRECT_DRIVER_LOADING_MODE_EXCLUSIVE_LUNARG, skipping system and environment "
9785db71995Sopenharmony_ci                     "variable driver search mechanisms."));
9795db71995Sopenharmony_ci    }
9805db71995Sopenharmony_ci
9815db71995Sopenharmony_ci    // Make sure all drivers we expect to load were found - including checking that the pfn matches exactly.
9825db71995Sopenharmony_ci    for (uint32_t i = 0; i < direct_drivers.size(); i++) {
9835db71995Sopenharmony_ci        if (direct_drivers.at(i).expect_to_find) {
9845db71995Sopenharmony_ci            std::stringstream ss;
9855db71995Sopenharmony_ci            ss << "loader_add_direct_driver: Adding driver found in index " << i
9865db71995Sopenharmony_ci               << " of VkDirectDriverLoadingListLUNARG::pDrivers structure. pfnGetInstanceProcAddr was set to "
9875db71995Sopenharmony_ci               << reinterpret_cast<const void*>(ddl_infos.at(i).pfnGetInstanceProcAddr);
9885db71995Sopenharmony_ci            std::string log_message = ss.str();
9895db71995Sopenharmony_ci            ASSERT_TRUE(log.find(log_message));
9905db71995Sopenharmony_ci        }
9915db71995Sopenharmony_ci    }
9925db71995Sopenharmony_ci
9935db71995Sopenharmony_ci    auto phys_devs = inst.GetPhysDevs();
9945db71995Sopenharmony_ci    ASSERT_EQ(phys_devs.size(), expected_driver_count);
9955db71995Sopenharmony_ci
9965db71995Sopenharmony_ci    // We have to iterate through the driver lists backwards because the loader *prepends* icd's, so the last found ICD is found
9975db71995Sopenharmony_ci    // first in the driver list
9985db71995Sopenharmony_ci    uint32_t driver_index = 0;
9995db71995Sopenharmony_ci    for (size_t i = normal_drivers.size() - 1; i == 0; i--) {
10005db71995Sopenharmony_ci        if (normal_drivers.at(i).expect_to_find) {
10015db71995Sopenharmony_ci            VkPhysicalDeviceProperties props{};
10025db71995Sopenharmony_ci            inst.functions->vkGetPhysicalDeviceProperties(phys_devs.at(driver_index), &props);
10035db71995Sopenharmony_ci            ASSERT_EQ(props.driverVersion, normal_drivers.at(i).driver_version);
10045db71995Sopenharmony_ci            driver_index++;
10055db71995Sopenharmony_ci        }
10065db71995Sopenharmony_ci    }
10075db71995Sopenharmony_ci    for (size_t i = direct_drivers.size() - 1; i == 0; i--) {
10085db71995Sopenharmony_ci        if (direct_drivers.at(i).expect_to_find) {
10095db71995Sopenharmony_ci            VkPhysicalDeviceProperties props{};
10105db71995Sopenharmony_ci            inst.functions->vkGetPhysicalDeviceProperties(phys_devs.at(driver_index), &props);
10115db71995Sopenharmony_ci            ASSERT_EQ(props.driverVersion, direct_drivers.at(i).driver_version);
10125db71995Sopenharmony_ci            driver_index++;
10135db71995Sopenharmony_ci        }
10145db71995Sopenharmony_ci    }
10155db71995Sopenharmony_ci}
10165db71995Sopenharmony_ci
10175db71995Sopenharmony_ci// Only 1 direct driver
10185db71995Sopenharmony_ciTEST(DirectDriverLoading, Individual) {
10195db71995Sopenharmony_ci    FrameworkEnvironment env{};
10205db71995Sopenharmony_ci    std::vector<DriverInfo> normal_drivers;
10215db71995Sopenharmony_ci    std::vector<DriverInfo> direct_drivers;
10225db71995Sopenharmony_ci    direct_drivers.emplace_back(TestICDDetails(TEST_ICD_PATH_VERSION_7).set_discovery_type(ManifestDiscoveryType::none), 10, true);
10235db71995Sopenharmony_ci
10245db71995Sopenharmony_ci    ASSERT_NO_FATAL_FAILURE(CheckDirectDriverLoading(env, normal_drivers, direct_drivers, false));
10255db71995Sopenharmony_ci}
10265db71995Sopenharmony_ci
10275db71995Sopenharmony_ci// 2 direct drivers
10285db71995Sopenharmony_ciTEST(DirectDriverLoading, MultipleDirectDrivers) {
10295db71995Sopenharmony_ci    FrameworkEnvironment env{};
10305db71995Sopenharmony_ci    std::vector<DriverInfo> normal_drivers;
10315db71995Sopenharmony_ci    std::vector<DriverInfo> direct_drivers;
10325db71995Sopenharmony_ci    direct_drivers.emplace_back(TestICDDetails(TEST_ICD_PATH_VERSION_7).set_discovery_type(ManifestDiscoveryType::none), 13, true);
10335db71995Sopenharmony_ci    direct_drivers.emplace_back(TestICDDetails(TEST_ICD_PATH_VERSION_7).set_discovery_type(ManifestDiscoveryType::none), 7, true);
10345db71995Sopenharmony_ci    ASSERT_NO_FATAL_FAILURE(CheckDirectDriverLoading(env, normal_drivers, direct_drivers, false));
10355db71995Sopenharmony_ci}
10365db71995Sopenharmony_ci
10375db71995Sopenharmony_ci// Multiple direct drivers with a normal driver in the middle
10385db71995Sopenharmony_ciTEST(DirectDriverLoading, MultipleDirectDriversAndNormalDrivers) {
10395db71995Sopenharmony_ci    FrameworkEnvironment env{};
10405db71995Sopenharmony_ci    std::vector<DriverInfo> normal_drivers;
10415db71995Sopenharmony_ci    std::vector<DriverInfo> direct_drivers;
10425db71995Sopenharmony_ci    normal_drivers.emplace_back(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA), 90, true);
10435db71995Sopenharmony_ci    direct_drivers.emplace_back(TestICDDetails(TEST_ICD_PATH_VERSION_7).set_discovery_type(ManifestDiscoveryType::none), 80, true);
10445db71995Sopenharmony_ci    direct_drivers.emplace_back(TestICDDetails(TEST_ICD_PATH_VERSION_7).set_discovery_type(ManifestDiscoveryType::none), 70, true);
10455db71995Sopenharmony_ci    ASSERT_NO_FATAL_FAILURE(CheckDirectDriverLoading(env, normal_drivers, direct_drivers, false));
10465db71995Sopenharmony_ci}
10475db71995Sopenharmony_ci
10485db71995Sopenharmony_ci// Normal driver and direct driver with direct driver exclusivity
10495db71995Sopenharmony_ciTEST(DirectDriverLoading, ExclusiveWithNormalDriver) {
10505db71995Sopenharmony_ci    FrameworkEnvironment env{};
10515db71995Sopenharmony_ci    std::vector<DriverInfo> normal_drivers;
10525db71995Sopenharmony_ci    std::vector<DriverInfo> direct_drivers;
10535db71995Sopenharmony_ci    direct_drivers.emplace_back(TestICDDetails(TEST_ICD_PATH_VERSION_7).set_discovery_type(ManifestDiscoveryType::none), 33, true);
10545db71995Sopenharmony_ci    normal_drivers.emplace_back(TestICDDetails(TEST_ICD_PATH_VERSION_2), 44, false);
10555db71995Sopenharmony_ci    ASSERT_NO_FATAL_FAILURE(CheckDirectDriverLoading(env, normal_drivers, direct_drivers, true));
10565db71995Sopenharmony_ci}
10575db71995Sopenharmony_ci
10585db71995Sopenharmony_ciTEST(DirectDriverLoading, ExclusiveWithMultipleNormalDriver) {
10595db71995Sopenharmony_ci    FrameworkEnvironment env{};
10605db71995Sopenharmony_ci    std::vector<DriverInfo> normal_drivers;
10615db71995Sopenharmony_ci    std::vector<DriverInfo> direct_drivers;
10625db71995Sopenharmony_ci    normal_drivers.emplace_back(TestICDDetails(TEST_ICD_PATH_VERSION_2), 55, true);
10635db71995Sopenharmony_ci    normal_drivers.emplace_back(TestICDDetails(TEST_ICD_PATH_VERSION_2), 66, true);
10645db71995Sopenharmony_ci    direct_drivers.emplace_back(TestICDDetails(TEST_ICD_PATH_VERSION_7).set_discovery_type(ManifestDiscoveryType::none), 77, true);
10655db71995Sopenharmony_ci    ASSERT_NO_FATAL_FAILURE(CheckDirectDriverLoading(env, normal_drivers, direct_drivers, true));
10665db71995Sopenharmony_ci}
10675db71995Sopenharmony_ci
10685db71995Sopenharmony_ciTEST(DirectDriverLoading, ExclusiveWithDriverEnvVar) {
10695db71995Sopenharmony_ci    FrameworkEnvironment env{};
10705db71995Sopenharmony_ci    std::vector<DriverInfo> normal_drivers;
10715db71995Sopenharmony_ci    std::vector<DriverInfo> direct_drivers;
10725db71995Sopenharmony_ci    normal_drivers.emplace_back(
10735db71995Sopenharmony_ci        TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA).set_discovery_type(ManifestDiscoveryType::env_var), 4, false);
10745db71995Sopenharmony_ci    direct_drivers.emplace_back(TestICDDetails(TEST_ICD_PATH_VERSION_7).set_discovery_type(ManifestDiscoveryType::none), 5, true);
10755db71995Sopenharmony_ci    ASSERT_NO_FATAL_FAILURE(CheckDirectDriverLoading(env, normal_drivers, direct_drivers, true));
10765db71995Sopenharmony_ci}
10775db71995Sopenharmony_ci
10785db71995Sopenharmony_ciTEST(DirectDriverLoading, ExclusiveWithAddDriverEnvVar) {
10795db71995Sopenharmony_ci    FrameworkEnvironment env{};
10805db71995Sopenharmony_ci    std::vector<DriverInfo> normal_drivers;
10815db71995Sopenharmony_ci    std::vector<DriverInfo> direct_drivers;
10825db71995Sopenharmony_ci
10835db71995Sopenharmony_ci    normal_drivers.emplace_back(
10845db71995Sopenharmony_ci        TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA).set_discovery_type(ManifestDiscoveryType::add_env_var), 6, false);
10855db71995Sopenharmony_ci    direct_drivers.emplace_back(TestICDDetails(TEST_ICD_PATH_VERSION_7).set_discovery_type(ManifestDiscoveryType::none), 7, true);
10865db71995Sopenharmony_ci    ASSERT_NO_FATAL_FAILURE(CheckDirectDriverLoading(env, normal_drivers, direct_drivers, true));
10875db71995Sopenharmony_ci}
10885db71995Sopenharmony_ci
10895db71995Sopenharmony_ciTEST(DirectDriverLoading, InclusiveWithFilterSelect) {
10905db71995Sopenharmony_ci    FrameworkEnvironment env{};
10915db71995Sopenharmony_ci    std::vector<DriverInfo> normal_drivers;
10925db71995Sopenharmony_ci    std::vector<DriverInfo> direct_drivers;
10935db71995Sopenharmony_ci
10945db71995Sopenharmony_ci    EnvVarWrapper driver_filter_select_env_var{"VK_LOADER_DRIVERS_SELECT", "normal_driver.json"};
10955db71995Sopenharmony_ci
10965db71995Sopenharmony_ci    normal_drivers.emplace_back(
10975db71995Sopenharmony_ci        TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA).set_disable_icd_inc(true).set_json_name("normal_driver"), 8, true);
10985db71995Sopenharmony_ci    direct_drivers.emplace_back(TestICDDetails(TEST_ICD_PATH_VERSION_7).set_discovery_type(ManifestDiscoveryType::none), 9, true);
10995db71995Sopenharmony_ci
11005db71995Sopenharmony_ci    ASSERT_NO_FATAL_FAILURE(CheckDirectDriverLoading(env, normal_drivers, direct_drivers, false));
11015db71995Sopenharmony_ci}
11025db71995Sopenharmony_ci
11035db71995Sopenharmony_ciTEST(DirectDriverLoading, ExclusiveWithFilterSelect) {
11045db71995Sopenharmony_ci    FrameworkEnvironment env{};
11055db71995Sopenharmony_ci    std::vector<DriverInfo> normal_drivers;
11065db71995Sopenharmony_ci    std::vector<DriverInfo> direct_drivers;
11075db71995Sopenharmony_ci
11085db71995Sopenharmony_ci    EnvVarWrapper driver_filter_select_env_var{"VK_LOADER_DRIVERS_SELECT", "normal_driver.json"};
11095db71995Sopenharmony_ci
11105db71995Sopenharmony_ci    normal_drivers.emplace_back(
11115db71995Sopenharmony_ci        TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA).set_disable_icd_inc(true).set_json_name("normal_driver"), 10,
11125db71995Sopenharmony_ci        false);
11135db71995Sopenharmony_ci    direct_drivers.emplace_back(TestICDDetails(TEST_ICD_PATH_VERSION_7).set_discovery_type(ManifestDiscoveryType::none), 11, true);
11145db71995Sopenharmony_ci
11155db71995Sopenharmony_ci    ASSERT_NO_FATAL_FAILURE(CheckDirectDriverLoading(env, normal_drivers, direct_drivers, true));
11165db71995Sopenharmony_ci}
11175db71995Sopenharmony_ci
11185db71995Sopenharmony_ciTEST(DirectDriverLoading, InclusiveWithFilterDisable) {
11195db71995Sopenharmony_ci    FrameworkEnvironment env{};
11205db71995Sopenharmony_ci    std::vector<DriverInfo> normal_drivers;
11215db71995Sopenharmony_ci    std::vector<DriverInfo> direct_drivers;
11225db71995Sopenharmony_ci
11235db71995Sopenharmony_ci    EnvVarWrapper driver_filter_disable_env_var{"VK_LOADER_DRIVERS_DISABLE", "normal_driver.json"};
11245db71995Sopenharmony_ci
11255db71995Sopenharmony_ci    normal_drivers.emplace_back(
11265db71995Sopenharmony_ci        TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA).set_disable_icd_inc(true).set_json_name("normal_driver"), 12,
11275db71995Sopenharmony_ci        false);
11285db71995Sopenharmony_ci    direct_drivers.emplace_back(TestICDDetails(TEST_ICD_PATH_VERSION_7).set_discovery_type(ManifestDiscoveryType::none), 13, true);
11295db71995Sopenharmony_ci    ASSERT_NO_FATAL_FAILURE(CheckDirectDriverLoading(env, normal_drivers, direct_drivers, false));
11305db71995Sopenharmony_ci}
11315db71995Sopenharmony_ci
11325db71995Sopenharmony_ciTEST(DirectDriverLoading, ExclusiveWithFilterDisable) {
11335db71995Sopenharmony_ci    FrameworkEnvironment env{};
11345db71995Sopenharmony_ci    std::vector<DriverInfo> normal_drivers;
11355db71995Sopenharmony_ci    std::vector<DriverInfo> direct_drivers;
11365db71995Sopenharmony_ci
11375db71995Sopenharmony_ci    EnvVarWrapper driver_filter_disable_env_var{"VK_LOADER_DRIVERS_DISABLE", "normal_driver.json"};
11385db71995Sopenharmony_ci
11395db71995Sopenharmony_ci    normal_drivers.emplace_back(
11405db71995Sopenharmony_ci        TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA).set_disable_icd_inc(true).set_json_name("normal_driver"), 14,
11415db71995Sopenharmony_ci        false);
11425db71995Sopenharmony_ci    direct_drivers.emplace_back(TestICDDetails(TEST_ICD_PATH_VERSION_7).set_discovery_type(ManifestDiscoveryType::none), 15, true);
11435db71995Sopenharmony_ci    ASSERT_NO_FATAL_FAILURE(CheckDirectDriverLoading(env, normal_drivers, direct_drivers, true));
11445db71995Sopenharmony_ci}
11455db71995Sopenharmony_ci
11465db71995Sopenharmony_ci// The VK_LUNARG_direct_driver_loading extension is not enabled
11475db71995Sopenharmony_ciTEST(DirectDriverLoading, ExtensionNotEnabled) {
11485db71995Sopenharmony_ci    FrameworkEnvironment env{};
11495db71995Sopenharmony_ci
11505db71995Sopenharmony_ci    auto& direct_driver_icd = env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_7).set_discovery_type(ManifestDiscoveryType::none));
11515db71995Sopenharmony_ci    direct_driver_icd.physical_devices.push_back({});
11525db71995Sopenharmony_ci
11535db71995Sopenharmony_ci    VkDirectDriverLoadingInfoLUNARG ddl_info{};
11545db71995Sopenharmony_ci    ddl_info.sType = VK_STRUCTURE_TYPE_DIRECT_DRIVER_LOADING_INFO_LUNARG;
11555db71995Sopenharmony_ci    ddl_info.pfnGetInstanceProcAddr = env.icds.back().icd_library.get_symbol("vk_icdGetInstanceProcAddr");
11565db71995Sopenharmony_ci
11575db71995Sopenharmony_ci    VkDirectDriverLoadingListLUNARG ddl_list{};
11585db71995Sopenharmony_ci    ddl_list.sType = VK_STRUCTURE_TYPE_DIRECT_DRIVER_LOADING_LIST_LUNARG;
11595db71995Sopenharmony_ci    ddl_list.mode = VK_DIRECT_DRIVER_LOADING_MODE_INCLUSIVE_LUNARG;
11605db71995Sopenharmony_ci    ddl_list.driverCount = 1U;
11615db71995Sopenharmony_ci    ddl_list.pDrivers = &ddl_info;
11625db71995Sopenharmony_ci
11635db71995Sopenharmony_ci    DebugUtilsLogger log;
11645db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
11655db71995Sopenharmony_ci    FillDebugUtilsCreateDetails(inst.create_info, log);
11665db71995Sopenharmony_ci    log.get()->pNext = reinterpret_cast<const void*>(&ddl_list);
11675db71995Sopenharmony_ci    inst.create_info.set_api_version(VK_MAKE_API_VERSION(0, 1, 0, 0));
11685db71995Sopenharmony_ci    ASSERT_NO_FATAL_FAILURE(inst.CheckCreate(VK_ERROR_INCOMPATIBLE_DRIVER));
11695db71995Sopenharmony_ci
11705db71995Sopenharmony_ci    ASSERT_TRUE(
11715db71995Sopenharmony_ci        log.find("loader_scan_for_direct_drivers: The pNext chain of VkInstanceCreateInfo contained the "
11725db71995Sopenharmony_ci                 "VkDirectDriverLoadingListLUNARG structure, but the VK_LUNARG_direct_driver_loading extension was "
11735db71995Sopenharmony_ci                 "not enabled."));
11745db71995Sopenharmony_ci}
11755db71995Sopenharmony_ci
11765db71995Sopenharmony_ci// VkDirectDriverLoadingListLUNARG is not in the pNext chain of VkInstanceCreateInfo
11775db71995Sopenharmony_ciTEST(DirectDriverLoading, DriverListNotInPnextChain) {
11785db71995Sopenharmony_ci    FrameworkEnvironment env{};
11795db71995Sopenharmony_ci
11805db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_7).set_discovery_type(ManifestDiscoveryType::none)).add_physical_device({});
11815db71995Sopenharmony_ci
11825db71995Sopenharmony_ci    DebugUtilsLogger log;
11835db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
11845db71995Sopenharmony_ci    FillDebugUtilsCreateDetails(inst.create_info, log);
11855db71995Sopenharmony_ci    inst.create_info.add_extension(VK_LUNARG_DIRECT_DRIVER_LOADING_EXTENSION_NAME);
11865db71995Sopenharmony_ci    inst.create_info.set_api_version(VK_MAKE_API_VERSION(0, 1, 0, 0));
11875db71995Sopenharmony_ci    ASSERT_NO_FATAL_FAILURE(inst.CheckCreate(VK_ERROR_INCOMPATIBLE_DRIVER));
11885db71995Sopenharmony_ci
11895db71995Sopenharmony_ci    ASSERT_TRUE(
11905db71995Sopenharmony_ci        log.find("loader_scan_for_direct_drivers: The VK_LUNARG_direct_driver_loading extension was enabled but the pNext chain of "
11915db71995Sopenharmony_ci                 "VkInstanceCreateInfo did not contain the "
11925db71995Sopenharmony_ci                 "VkDirectDriverLoadingListLUNARG structure."));
11935db71995Sopenharmony_ci}
11945db71995Sopenharmony_ci
11955db71995Sopenharmony_ci// User sets the pDrivers pointer in VkDirectDriverLoadingListLUNARG to nullptr
11965db71995Sopenharmony_ciTEST(DirectDriverLoading, DriverListHasNullDriverPointer) {
11975db71995Sopenharmony_ci    FrameworkEnvironment env{};
11985db71995Sopenharmony_ci
11995db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_7).set_discovery_type(ManifestDiscoveryType::none)).add_physical_device({});
12005db71995Sopenharmony_ci
12015db71995Sopenharmony_ci    VkDirectDriverLoadingListLUNARG ddl_list{};
12025db71995Sopenharmony_ci    ddl_list.sType = VK_STRUCTURE_TYPE_DIRECT_DRIVER_LOADING_LIST_LUNARG;
12035db71995Sopenharmony_ci    ddl_list.mode = VK_DIRECT_DRIVER_LOADING_MODE_INCLUSIVE_LUNARG;
12045db71995Sopenharmony_ci    ddl_list.driverCount = 1U;
12055db71995Sopenharmony_ci    ddl_list.pDrivers = nullptr;  // user forgot to set the pDrivers
12065db71995Sopenharmony_ci
12075db71995Sopenharmony_ci    DebugUtilsLogger log;
12085db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
12095db71995Sopenharmony_ci    FillDebugUtilsCreateDetails(inst.create_info, log);
12105db71995Sopenharmony_ci    log.get()->pNext = reinterpret_cast<const void*>(&ddl_list);
12115db71995Sopenharmony_ci    inst.create_info.add_extension(VK_LUNARG_DIRECT_DRIVER_LOADING_EXTENSION_NAME);
12125db71995Sopenharmony_ci    inst.create_info.set_api_version(VK_MAKE_API_VERSION(0, 1, 0, 0));
12135db71995Sopenharmony_ci    ASSERT_NO_FATAL_FAILURE(inst.CheckCreate(VK_ERROR_INCOMPATIBLE_DRIVER));
12145db71995Sopenharmony_ci
12155db71995Sopenharmony_ci    ASSERT_TRUE(
12165db71995Sopenharmony_ci        log.find("loader_scan_for_direct_drivers: The VkDirectDriverLoadingListLUNARG structure in the pNext chain of "
12175db71995Sopenharmony_ci                 "VkInstanceCreateInfo has a NULL pDrivers member."));
12185db71995Sopenharmony_ci}
12195db71995Sopenharmony_ci
12205db71995Sopenharmony_ci// User sets the driverCount in VkDirectDriverLoadingListLUNARG to zero
12215db71995Sopenharmony_ciTEST(DirectDriverLoading, DriverListHasZeroInfoCount) {
12225db71995Sopenharmony_ci    FrameworkEnvironment env{};
12235db71995Sopenharmony_ci
12245db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_7).set_discovery_type(ManifestDiscoveryType::none)).add_physical_device({});
12255db71995Sopenharmony_ci
12265db71995Sopenharmony_ci    VkDirectDriverLoadingInfoLUNARG ddl_info{};
12275db71995Sopenharmony_ci    ddl_info.sType = VK_STRUCTURE_TYPE_DIRECT_DRIVER_LOADING_INFO_LUNARG;
12285db71995Sopenharmony_ci    ddl_info.pfnGetInstanceProcAddr = env.icds.back().icd_library.get_symbol("vk_icdGetInstanceProcAddr");
12295db71995Sopenharmony_ci
12305db71995Sopenharmony_ci    VkDirectDriverLoadingListLUNARG ddl_list{};
12315db71995Sopenharmony_ci    ddl_list.sType = VK_STRUCTURE_TYPE_DIRECT_DRIVER_LOADING_LIST_LUNARG;
12325db71995Sopenharmony_ci    ddl_list.mode = VK_DIRECT_DRIVER_LOADING_MODE_INCLUSIVE_LUNARG;
12335db71995Sopenharmony_ci    ddl_list.driverCount = 0;  // user set 0 for the info list
12345db71995Sopenharmony_ci    ddl_list.pDrivers = &ddl_info;
12355db71995Sopenharmony_ci
12365db71995Sopenharmony_ci    DebugUtilsLogger log;
12375db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
12385db71995Sopenharmony_ci    FillDebugUtilsCreateDetails(inst.create_info, log);
12395db71995Sopenharmony_ci    log.get()->pNext = reinterpret_cast<const void*>(&ddl_list);
12405db71995Sopenharmony_ci    inst.create_info.add_extension(VK_LUNARG_DIRECT_DRIVER_LOADING_EXTENSION_NAME);
12415db71995Sopenharmony_ci    inst.create_info.set_api_version(VK_MAKE_API_VERSION(0, 1, 0, 0));
12425db71995Sopenharmony_ci    ASSERT_NO_FATAL_FAILURE(inst.CheckCreate(VK_ERROR_INCOMPATIBLE_DRIVER));
12435db71995Sopenharmony_ci
12445db71995Sopenharmony_ci    ASSERT_TRUE(
12455db71995Sopenharmony_ci        log.find("loader_scan_for_direct_drivers: The VkDirectDriverLoadingListLUNARG structure in the pNext chain of "
12465db71995Sopenharmony_ci                 "VkInstanceCreateInfo has a non-null pDrivers member but a driverCount member with a value "
12475db71995Sopenharmony_ci                 "of zero."));
12485db71995Sopenharmony_ci}
12495db71995Sopenharmony_ci
12505db71995Sopenharmony_ci// pfnGetInstanceProcAddr in VkDirectDriverLoadingInfoLUNARG is nullptr
12515db71995Sopenharmony_ciTEST(DirectDriverLoading, DriverInfoMissingGetInstanceProcAddr) {
12525db71995Sopenharmony_ci    FrameworkEnvironment env{};
12535db71995Sopenharmony_ci
12545db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_7).set_discovery_type(ManifestDiscoveryType::none)).add_physical_device({});
12555db71995Sopenharmony_ci
12565db71995Sopenharmony_ci    std::array<VkDirectDriverLoadingInfoLUNARG, 2> ddl_infos{};
12575db71995Sopenharmony_ci    ddl_infos[0].sType = VK_STRUCTURE_TYPE_DIRECT_DRIVER_LOADING_INFO_LUNARG;
12585db71995Sopenharmony_ci    ddl_infos[0].pfnGetInstanceProcAddr = nullptr;  // user didn't set the pfnGetInstanceProcAddr to the driver's handle
12595db71995Sopenharmony_ci
12605db71995Sopenharmony_ci    ddl_infos[1].sType = VK_STRUCTURE_TYPE_DIRECT_DRIVER_LOADING_INFO_LUNARG;
12615db71995Sopenharmony_ci    ddl_infos[1].pfnGetInstanceProcAddr = nullptr;  // user didn't set the pfnGetInstanceProcAddr to the driver's handle
12625db71995Sopenharmony_ci
12635db71995Sopenharmony_ci    VkDirectDriverLoadingListLUNARG ddl_list{};
12645db71995Sopenharmony_ci    ddl_list.sType = VK_STRUCTURE_TYPE_DIRECT_DRIVER_LOADING_LIST_LUNARG;
12655db71995Sopenharmony_ci    ddl_list.mode = VK_DIRECT_DRIVER_LOADING_MODE_INCLUSIVE_LUNARG;
12665db71995Sopenharmony_ci    ddl_list.driverCount = static_cast<uint32_t>(ddl_infos.size());
12675db71995Sopenharmony_ci    ddl_list.pDrivers = ddl_infos.data();
12685db71995Sopenharmony_ci
12695db71995Sopenharmony_ci    DebugUtilsLogger log;
12705db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
12715db71995Sopenharmony_ci    FillDebugUtilsCreateDetails(inst.create_info, log);
12725db71995Sopenharmony_ci    log.get()->pNext = reinterpret_cast<const void*>(&ddl_list);
12735db71995Sopenharmony_ci    inst.create_info.add_extension(VK_LUNARG_DIRECT_DRIVER_LOADING_EXTENSION_NAME);
12745db71995Sopenharmony_ci    inst.create_info.set_api_version(VK_MAKE_API_VERSION(0, 1, 0, 0));
12755db71995Sopenharmony_ci    ASSERT_NO_FATAL_FAILURE(inst.CheckCreate(VK_ERROR_INCOMPATIBLE_DRIVER));
12765db71995Sopenharmony_ci
12775db71995Sopenharmony_ci    ASSERT_TRUE(
12785db71995Sopenharmony_ci        log.find("loader_add_direct_driver: VkDirectDriverLoadingInfoLUNARG structure at index 0 contains a NULL pointer for the "
12795db71995Sopenharmony_ci                 "pfnGetInstanceProcAddr member, skipping."));
12805db71995Sopenharmony_ci    ASSERT_TRUE(
12815db71995Sopenharmony_ci        log.find("loader_add_direct_driver: VkDirectDriverLoadingInfoLUNARG structure at index 1 contains a NULL pointer for the "
12825db71995Sopenharmony_ci                 "pfnGetInstanceProcAddr member, skipping."));
12835db71995Sopenharmony_ci}
12845db71995Sopenharmony_ci
12855db71995Sopenharmony_ci// test the various error paths in loader_add_direct_driver
12865db71995Sopenharmony_ciTEST(DirectDriverLoading, DriverDoesNotExportNegotiateFunction) {
12875db71995Sopenharmony_ci    FrameworkEnvironment env{};
12885db71995Sopenharmony_ci
12895db71995Sopenharmony_ci    auto& direct_driver = env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_7).set_discovery_type(ManifestDiscoveryType::none))
12905db71995Sopenharmony_ci                              .add_physical_device({})
12915db71995Sopenharmony_ci                              .set_exposes_vk_icdNegotiateLoaderICDInterfaceVersion(false)
12925db71995Sopenharmony_ci                              .set_exposes_vkCreateInstance(false)
12935db71995Sopenharmony_ci                              .set_exposes_vkEnumerateInstanceExtensionProperties(false);
12945db71995Sopenharmony_ci
12955db71995Sopenharmony_ci    VkDirectDriverLoadingInfoLUNARG ddl_info{};
12965db71995Sopenharmony_ci    ddl_info.sType = VK_STRUCTURE_TYPE_DIRECT_DRIVER_LOADING_INFO_LUNARG;
12975db71995Sopenharmony_ci    ddl_info.pfnGetInstanceProcAddr = env.icds.back().icd_library.get_symbol("vk_icdGetInstanceProcAddr");
12985db71995Sopenharmony_ci
12995db71995Sopenharmony_ci    VkDirectDriverLoadingListLUNARG ddl_list{};
13005db71995Sopenharmony_ci    ddl_list.sType = VK_STRUCTURE_TYPE_DIRECT_DRIVER_LOADING_LIST_LUNARG;
13015db71995Sopenharmony_ci    ddl_list.mode = VK_DIRECT_DRIVER_LOADING_MODE_INCLUSIVE_LUNARG;
13025db71995Sopenharmony_ci    ddl_list.driverCount = 1;
13035db71995Sopenharmony_ci    ddl_list.pDrivers = &ddl_info;
13045db71995Sopenharmony_ci
13055db71995Sopenharmony_ci    {
13065db71995Sopenharmony_ci        DebugUtilsLogger log;
13075db71995Sopenharmony_ci        InstWrapper inst{env.vulkan_functions};
13085db71995Sopenharmony_ci        FillDebugUtilsCreateDetails(inst.create_info, log);
13095db71995Sopenharmony_ci        log.get()->pNext = reinterpret_cast<const void*>(&ddl_list);
13105db71995Sopenharmony_ci        inst.create_info.add_extension(VK_LUNARG_DIRECT_DRIVER_LOADING_EXTENSION_NAME);
13115db71995Sopenharmony_ci        inst.create_info.set_api_version(VK_MAKE_API_VERSION(0, 1, 0, 0));
13125db71995Sopenharmony_ci        ASSERT_NO_FATAL_FAILURE(inst.CheckCreate(VK_ERROR_INCOMPATIBLE_DRIVER));
13135db71995Sopenharmony_ci
13145db71995Sopenharmony_ci        ASSERT_TRUE(
13155db71995Sopenharmony_ci            log.find("loader_add_direct_driver: Could not get 'vk_icdNegotiateLoaderICDInterfaceVersion' from "
13165db71995Sopenharmony_ci                     "VkDirectDriverLoadingInfoLUNARG structure at "
13175db71995Sopenharmony_ci                     "index 0, skipping."));
13185db71995Sopenharmony_ci    }
13195db71995Sopenharmony_ci
13205db71995Sopenharmony_ci    // Allow the negotiate function to be found, now it should fail to find instance creation function
13215db71995Sopenharmony_ci    direct_driver.set_exposes_vk_icdNegotiateLoaderICDInterfaceVersion(true);
13225db71995Sopenharmony_ci    direct_driver.set_max_icd_interface_version(4);
13235db71995Sopenharmony_ci
13245db71995Sopenharmony_ci    {
13255db71995Sopenharmony_ci        DebugUtilsLogger log;
13265db71995Sopenharmony_ci        InstWrapper inst{env.vulkan_functions};
13275db71995Sopenharmony_ci        FillDebugUtilsCreateDetails(inst.create_info, log);
13285db71995Sopenharmony_ci        log.get()->pNext = reinterpret_cast<const void*>(&ddl_list);
13295db71995Sopenharmony_ci        inst.create_info.add_extension(VK_LUNARG_DIRECT_DRIVER_LOADING_EXTENSION_NAME);
13305db71995Sopenharmony_ci        inst.create_info.set_api_version(VK_MAKE_API_VERSION(0, 1, 0, 0));
13315db71995Sopenharmony_ci        ASSERT_NO_FATAL_FAILURE(inst.CheckCreate(VK_ERROR_INCOMPATIBLE_DRIVER));
13325db71995Sopenharmony_ci
13335db71995Sopenharmony_ci        ASSERT_TRUE(log.find(
13345db71995Sopenharmony_ci            "loader_add_direct_driver: VkDirectDriverLoadingInfoLUNARG structure at index 0 supports interface version 4, "
13355db71995Sopenharmony_ci            "which is incompatible with the Loader Driver Interface version that supports the VK_LUNARG_direct_driver_loading "
13365db71995Sopenharmony_ci            "extension, skipping."));
13375db71995Sopenharmony_ci    }
13385db71995Sopenharmony_ci    direct_driver.set_max_icd_interface_version(7);
13395db71995Sopenharmony_ci
13405db71995Sopenharmony_ci    {
13415db71995Sopenharmony_ci        DebugUtilsLogger log;
13425db71995Sopenharmony_ci        InstWrapper inst{env.vulkan_functions};
13435db71995Sopenharmony_ci        FillDebugUtilsCreateDetails(inst.create_info, log);
13445db71995Sopenharmony_ci        log.get()->pNext = reinterpret_cast<const void*>(&ddl_list);
13455db71995Sopenharmony_ci        inst.create_info.add_extension(VK_LUNARG_DIRECT_DRIVER_LOADING_EXTENSION_NAME);
13465db71995Sopenharmony_ci        inst.create_info.set_api_version(VK_MAKE_API_VERSION(0, 1, 0, 0));
13475db71995Sopenharmony_ci        ASSERT_NO_FATAL_FAILURE(inst.CheckCreate(VK_ERROR_INCOMPATIBLE_DRIVER));
13485db71995Sopenharmony_ci
13495db71995Sopenharmony_ci        ASSERT_TRUE(
13505db71995Sopenharmony_ci            log.find("loader_add_direct_driver: Could not get 'vkEnumerateInstanceExtensionProperties' from "
13515db71995Sopenharmony_ci                     "VkDirectDriverLoadingInfoLUNARG structure at index 0, skipping."));
13525db71995Sopenharmony_ci    }
13535db71995Sopenharmony_ci
13545db71995Sopenharmony_ci    // Allow the instance creation function to be found, now it should fail to find EnumInstExtProps
13555db71995Sopenharmony_ci    direct_driver.set_exposes_vkCreateInstance(true);
13565db71995Sopenharmony_ci
13575db71995Sopenharmony_ci    {
13585db71995Sopenharmony_ci        DebugUtilsLogger log;
13595db71995Sopenharmony_ci        InstWrapper inst{env.vulkan_functions};
13605db71995Sopenharmony_ci        FillDebugUtilsCreateDetails(inst.create_info, log);
13615db71995Sopenharmony_ci        log.get()->pNext = reinterpret_cast<const void*>(&ddl_list);
13625db71995Sopenharmony_ci        inst.create_info.add_extension(VK_LUNARG_DIRECT_DRIVER_LOADING_EXTENSION_NAME);
13635db71995Sopenharmony_ci        inst.create_info.set_api_version(VK_MAKE_API_VERSION(0, 1, 0, 0));
13645db71995Sopenharmony_ci        ASSERT_NO_FATAL_FAILURE(inst.CheckCreate(VK_ERROR_INCOMPATIBLE_DRIVER));
13655db71995Sopenharmony_ci
13665db71995Sopenharmony_ci        ASSERT_TRUE(
13675db71995Sopenharmony_ci            log.find("loader_add_direct_driver: Could not get 'vkEnumerateInstanceExtensionProperties' from "
13685db71995Sopenharmony_ci                     "VkDirectDriverLoadingInfoLUNARG structure at index 0, skipping."));
13695db71995Sopenharmony_ci    }
13705db71995Sopenharmony_ci}
13715db71995Sopenharmony_ci
13725db71995Sopenharmony_ciTEST(DriverManifest, VersionMismatchWithEnumerateInstanceVersion) {
13735db71995Sopenharmony_ci    FrameworkEnvironment env{};
13745db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2, VK_API_VERSION_1_1))
13755db71995Sopenharmony_ci        .set_icd_api_version(VK_API_VERSION_1_0)
13765db71995Sopenharmony_ci        .add_physical_device({});
13775db71995Sopenharmony_ci
13785db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
13795db71995Sopenharmony_ci    inst.create_info.add_extension(VK_EXT_DEBUG_UTILS_EXTENSION_NAME);
13805db71995Sopenharmony_ci    FillDebugUtilsCreateDetails(inst.create_info, env.debug_log);
13815db71995Sopenharmony_ci    inst.CheckCreate();
13825db71995Sopenharmony_ci
13835db71995Sopenharmony_ci    ASSERT_TRUE(env.debug_log.find(std::string("terminator_CreateInstance: Manifest ICD for \"") + env.get_test_icd_path().str() +
13845db71995Sopenharmony_ci                                   "\" contained a 1.1 or greater API version, but "
13855db71995Sopenharmony_ci                                   "vkEnumerateInstanceVersion returned 1.0, treating as a 1.0 ICD"));
13865db71995Sopenharmony_ci}
13875db71995Sopenharmony_ci
13885db71995Sopenharmony_ciTEST(DriverManifest, EnumerateInstanceVersionNotSupported) {
13895db71995Sopenharmony_ci    FrameworkEnvironment env{};
13905db71995Sopenharmony_ci    env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2, VK_API_VERSION_1_1))
13915db71995Sopenharmony_ci        .set_icd_api_version(VK_API_VERSION_1_0)
13925db71995Sopenharmony_ci        .set_can_query_vkEnumerateInstanceVersion(false)
13935db71995Sopenharmony_ci        .add_physical_device({});
13945db71995Sopenharmony_ci
13955db71995Sopenharmony_ci    InstWrapper inst{env.vulkan_functions};
13965db71995Sopenharmony_ci    inst.create_info.add_extension(VK_EXT_DEBUG_UTILS_EXTENSION_NAME);
13975db71995Sopenharmony_ci    FillDebugUtilsCreateDetails(inst.create_info, env.debug_log);
13985db71995Sopenharmony_ci    inst.CheckCreate();
13995db71995Sopenharmony_ci
14005db71995Sopenharmony_ci    ASSERT_TRUE(env.debug_log.find(std::string("terminator_CreateInstance: Manifest ICD for \"") + env.get_test_icd_path().str() +
14015db71995Sopenharmony_ci                                   "\" contained a 1.1 or greater API version, but does "
14025db71995Sopenharmony_ci                                   "not support vkEnumerateInstanceVersion, treating as a 1.0 ICD"));
14035db71995Sopenharmony_ci}
1404