@@ -7986,3 +7986,133 @@ VKAPI_ATTR VkResult VKAPI_CALL terminator_EnumeratePhysicalDeviceGroups(
79867986 }
79877987 return res ;
79887988}
7989+
7990+ VkResult get_device_driver_id (VkPhysicalDevice physicalDevice , VkDriverId * driverId ) {
7991+ VkPhysicalDeviceDriverProperties physical_device_driver_props = {0 };
7992+ physical_device_driver_props .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES ;
7993+
7994+ VkPhysicalDeviceProperties2 props2 = {0 };
7995+ props2 .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2 ;
7996+ props2 .pNext = & physical_device_driver_props ;
7997+
7998+ struct loader_physical_device_term * phys_dev_term = (struct loader_physical_device_term * )physicalDevice ;
7999+ struct loader_icd_term * icd_term = phys_dev_term -> this_icd_term ;
8000+ const struct loader_instance * inst = icd_term -> this_instance ;
8001+
8002+ assert (inst != NULL );
8003+
8004+ // Get the function pointer to use to call into the ICD. This could be the core or KHR version
8005+ PFN_vkGetPhysicalDeviceProperties2 fpGetPhysicalDeviceProperties2 = NULL ;
8006+ if (loader_check_version_meets_required (LOADER_VERSION_1_1_0 , inst -> app_api_version )) {
8007+ fpGetPhysicalDeviceProperties2 = icd_term -> dispatch .GetPhysicalDeviceProperties2 ;
8008+ }
8009+ if (fpGetPhysicalDeviceProperties2 == NULL && inst -> enabled_extensions .khr_get_physical_device_properties2 ) {
8010+ fpGetPhysicalDeviceProperties2 = icd_term -> dispatch .GetPhysicalDeviceProperties2KHR ;
8011+ }
8012+
8013+ if (fpGetPhysicalDeviceProperties2 == NULL ) {
8014+ * driverId = 0 ;
8015+ return VK_ERROR_UNKNOWN ;
8016+ }
8017+
8018+ fpGetPhysicalDeviceProperties2 (phys_dev_term -> phys_dev , & props2 );
8019+
8020+ * driverId = physical_device_driver_props .driverID ;
8021+ return VK_SUCCESS ;
8022+ }
8023+
8024+ VkResult loader_filter_enumerated_physical_device (const struct loader_instance * inst ,
8025+ const struct loader_envvar_id_filter * device_id_filter ,
8026+ const struct loader_envvar_id_filter * vendor_id_filter ,
8027+ const struct loader_envvar_id_filter * driver_id_filter ,
8028+ const uint32_t in_PhysicalDeviceCount ,
8029+ const VkPhysicalDevice * in_pPhysicalDevices , uint32_t * out_pPhysicalDeviceCount ,
8030+ VkPhysicalDevice * out_pPhysicalDevices ) {
8031+ uint32_t filtered_physical_device_count = 0 ;
8032+ for (uint32_t i = 0 ; i < in_PhysicalDeviceCount ; i ++ ) {
8033+ VkPhysicalDeviceProperties dev_props = {0 };
8034+ inst -> disp -> layer_inst_disp .GetPhysicalDeviceProperties (in_pPhysicalDevices [i ], & dev_props );
8035+
8036+ if ((0 != device_id_filter -> count ) && !check_id_matches_filter_environment_var (dev_props .deviceID , device_id_filter )) {
8037+ continue ;
8038+ }
8039+
8040+ if ((0 != vendor_id_filter -> count ) && !check_id_matches_filter_environment_var (dev_props .vendorID , vendor_id_filter )) {
8041+ continue ;
8042+ }
8043+
8044+ if (0 != driver_id_filter -> count ) {
8045+ VkDriverId driver_id ;
8046+ VkResult res = get_device_driver_id (in_pPhysicalDevices [i ], & driver_id );
8047+
8048+ if ((res != VK_SUCCESS ) || !check_id_matches_filter_environment_var (driver_id , driver_id_filter )) {
8049+ continue ;
8050+ }
8051+ }
8052+
8053+ if ((NULL != out_pPhysicalDevices ) && (filtered_physical_device_count < * out_pPhysicalDeviceCount )) {
8054+ out_pPhysicalDevices [filtered_physical_device_count ] = in_pPhysicalDevices [i ];
8055+ }
8056+ filtered_physical_device_count ++ ;
8057+ }
8058+
8059+ if ((NULL == out_pPhysicalDevices ) || (filtered_physical_device_count < * out_pPhysicalDeviceCount )) {
8060+ * out_pPhysicalDeviceCount = filtered_physical_device_count ;
8061+ }
8062+
8063+ return (* out_pPhysicalDeviceCount < filtered_physical_device_count ) ? VK_INCOMPLETE : VK_SUCCESS ;
8064+ }
8065+
8066+ VkResult loader_filter_enumerated_physical_device_groups (
8067+ const struct loader_instance * inst , const struct loader_envvar_id_filter * device_id_filter ,
8068+ const struct loader_envvar_id_filter * vendor_id_filter , const struct loader_envvar_id_filter * driver_id_filter ,
8069+ const uint32_t in_PhysicalDeviceGroupCount , const VkPhysicalDeviceGroupProperties * in_pPhysicalDeviceGroupProperties ,
8070+ uint32_t * out_PhysicalDeviceGroupCount , VkPhysicalDeviceGroupProperties * out_pPhysicalDeviceGroupProperties ) {
8071+ uint32_t filtered_physical_device_group_count = 0 ;
8072+ for (uint32_t i = 0 ; i < in_PhysicalDeviceGroupCount ; i ++ ) {
8073+ const VkPhysicalDeviceGroupProperties * device_group = & in_pPhysicalDeviceGroupProperties [i ];
8074+
8075+ bool skip_group = false;
8076+ for (uint32_t j = 0 ; j < device_group -> physicalDeviceCount ; j ++ ) {
8077+ VkPhysicalDeviceProperties dev_props = {0 };
8078+ inst -> disp -> layer_inst_disp .GetPhysicalDeviceProperties (device_group -> physicalDevices [j ], & dev_props );
8079+
8080+ if ((0 != device_id_filter -> count ) && !check_id_matches_filter_environment_var (dev_props .deviceID , device_id_filter )) {
8081+ skip_group = true;
8082+ break ;
8083+ }
8084+
8085+ if ((0 != vendor_id_filter -> count ) && !check_id_matches_filter_environment_var (dev_props .vendorID , vendor_id_filter )) {
8086+ skip_group = true;
8087+ break ;
8088+ }
8089+
8090+ if (0 != driver_id_filter -> count ) {
8091+ VkDriverId driver_id ;
8092+ VkResult res = get_device_driver_id (device_group -> physicalDevices [j ], & driver_id );
8093+
8094+ if ((res != VK_SUCCESS ) || !check_id_matches_filter_environment_var (driver_id , driver_id_filter )) {
8095+ skip_group = true;
8096+ break ;
8097+ }
8098+ }
8099+ }
8100+
8101+ if (skip_group ) {
8102+ continue ;
8103+ }
8104+
8105+ if ((NULL != out_pPhysicalDeviceGroupProperties ) &&
8106+ (filtered_physical_device_group_count < * out_PhysicalDeviceGroupCount )) {
8107+ out_pPhysicalDeviceGroupProperties [filtered_physical_device_group_count ] = * device_group ;
8108+ }
8109+
8110+ filtered_physical_device_group_count ++ ;
8111+ }
8112+
8113+ if ((NULL == out_pPhysicalDeviceGroupProperties ) || (filtered_physical_device_group_count < * out_PhysicalDeviceGroupCount )) {
8114+ * out_PhysicalDeviceGroupCount = filtered_physical_device_group_count ;
8115+ }
8116+
8117+ return (* out_PhysicalDeviceGroupCount < filtered_physical_device_group_count ) ? VK_INCOMPLETE : VK_SUCCESS ;
8118+ }
0 commit comments