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, ©_info); 6785db71995Sopenharmony_ci 6795db71995Sopenharmony_ci PFN_vkCmdCopyBufferToImage2 CmdCopyBufferToImage2 = device.load("vkCmdCopyBufferToImage2"); 6805db71995Sopenharmony_ci VkCopyBufferToImageInfo2 copy_buf_image{}; 6815db71995Sopenharmony_ci CmdCopyBufferToImage2(command_buffer, ©_buf_image); 6825db71995Sopenharmony_ci 6835db71995Sopenharmony_ci PFN_vkCmdCopyImage2 CmdCopyImage2 = device.load("vkCmdCopyImage2"); 6845db71995Sopenharmony_ci VkCopyImageInfo2 copy_image_info{}; 6855db71995Sopenharmony_ci CmdCopyImage2(command_buffer, ©_image_info); 6865db71995Sopenharmony_ci 6875db71995Sopenharmony_ci PFN_vkCmdCopyImageToBuffer2 CmdCopyImageToBuffer2 = device.load("vkCmdCopyImageToBuffer2"); 6885db71995Sopenharmony_ci VkCopyImageToBufferInfo2 copy_image_buf; 6895db71995Sopenharmony_ci CmdCopyImageToBuffer2(command_buffer, ©_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