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