}
}
+ // Remove the portability enumeration flag bit if the ICD doesn't support the extension
+ if ((pCreateInfo->flags & VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR) == 1) {
+ bool supports_portability_enumeration = false;
+ for (uint32_t j = 0; j < icd_create_info.enabledExtensionCount; j++) {
+ if (strcmp(filtered_extension_names[j], VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME) == 0) {
+ supports_portability_enumeration = true;
+ break;
+ }
+ }
+ // If the icd supports the extension, use the flags as given, otherwise remove the portability bit
+ icd_create_info.flags = supports_portability_enumeration
+ ? pCreateInfo->flags
+ : pCreateInfo->flags & (~VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR);
+ }
+
// Create an instance, substituting the version to 1.0 if necessary
VkApplicationInfo icd_app_info;
uint32_t icd_version_nopatch =
// VK_SUCCESS
*pInstance = icd.instance_handle.handle;
+ icd.passed_in_instance_create_flags = pCreateInfo->flags;
+
return VK_SUCCESS;
}
#endif // defined(WIN32)
#endif // TEST_ICD_EXPORT_ICD_ENUMERATE_ADAPTER_PHYSICAL_DEVICES
-} // extern "C"
\ No newline at end of file
+} // extern "C"
std::vector<VkPhysicalDeviceToolPropertiesEXT> tooling_properties;
std::vector<DispatchableHandle<VkCommandBuffer>> allocated_command_buffers;
+ VkInstanceCreateFlags passed_in_instance_create_flags{};
+
PhysicalDevice& GetPhysDevice(VkPhysicalDevice physicalDevice) {
for (auto& phys_dev : physical_devices) {
if (phys_dev.vk_physical_device.handle == physicalDevice) return phys_dev;
#define GET_TEST_ICD_FUNC_STR "get_test_icd_func"
using GetNewTestICDFunc = TestICD* (*)();
-#define RESET_ICD_FUNC_STR "reset_icd_func"
\ No newline at end of file
+#define RESET_ICD_FUNC_STR "reset_icd_func"
}
}
+// Check that the portability enumeration flag bit doesn't get passed down
+TEST(PortabilityICDConfiguration, PortabilityAndRegularICDCheckFlagsPassedIntoICD) {
+ FrameworkEnvironment env{};
+ env.add_icd(TestICDDetails(ManifestICD{}.set_lib_path(TEST_ICD_PATH_VERSION_2)));
+ env.add_icd(TestICDDetails(ManifestICD{}.set_lib_path(TEST_ICD_PATH_VERSION_2).set_is_portability_driver(true)));
+
+ auto& driver0 = env.get_test_icd(0);
+ auto& driver1 = env.get_test_icd(1);
+
+ driver0.physical_devices.emplace_back("physical_device_0");
+ driver0.max_icd_interface_version = 1;
+
+ driver1.physical_devices.emplace_back("portability_physical_device_1");
+ driver1.add_instance_extension("VK_KHR_portability_enumeration");
+ driver1.max_icd_interface_version = 1;
+
+ InstWrapper inst{env.vulkan_functions};
+ inst.create_info.add_extension(VK_EXT_DEBUG_UTILS_EXTENSION_NAME);
+ inst.create_info.add_extension("VK_KHR_portability_enumeration");
+ inst.create_info.flags = VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR | 4;
+
+ FillDebugUtilsCreateDetails(inst.create_info, env.debug_log);
+ inst.CheckCreate();
+ ASSERT_FALSE(env.debug_log.find(portability_driver_warning));
+
+ ASSERT_EQ(static_cast<VkInstanceCreateFlags>(4), driver0.passed_in_instance_create_flags);
+ ASSERT_EQ(VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR | static_cast<VkInstanceCreateFlags>(4),
+ driver1.passed_in_instance_create_flags);
+}
+
TEST(PortabilityICDConfiguration, PortabilityAndRegularICDPreInstanceFunctions) {
FrameworkEnvironment env{};
env.add_icd(TestICDDetails(ManifestICD{}.set_lib_path(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA)));