@@ -451,19 +451,33 @@ static bool select_physical_device(PGRAPHState *pg, Error **errp)
451451 g_malloc_n (num_physical_devices , sizeof (VkPhysicalDevice ));
452452 vkEnumeratePhysicalDevices (r -> instance , & num_physical_devices , devices );
453453
454+ const char * preferred_device = g_config .display .vulkan .preferred_physical_device ;
455+ int preferred_device_index = -1 ;
456+
454457 fprintf (stderr , "Available physical devices:\n" );
455458 for (int i = 0 ; i < num_physical_devices ; i ++ ) {
456459 vkGetPhysicalDeviceProperties (devices [i ], & r -> device_props );
457- fprintf (stderr , "- %s\n" , r -> device_props .deviceName );
460+ bool is_preferred =
461+ preferred_device &&
462+ !strcmp (r -> device_props .deviceName , preferred_device );
463+ if (is_preferred ) {
464+ preferred_device_index = i ;
465+ }
466+ fprintf (stderr , "- %s%s\n" , r -> device_props .deviceName ,
467+ is_preferred ? " *" : "" );
458468 }
459469
460- // FIXME: Store preferred device
461-
462470 r -> physical_device = VK_NULL_HANDLE ;
463- for (int i = 0 ; i < num_physical_devices ; i ++ ) {
464- if (is_device_compatible (devices [i ])) {
465- r -> physical_device = devices [i ];
466- break ;
471+
472+ if (preferred_device_index >= 0 &&
473+ is_device_compatible (devices [preferred_device_index ])) {
474+ r -> physical_device = devices [preferred_device_index ];
475+ } else {
476+ for (int i = 0 ; i < num_physical_devices ; i ++ ) {
477+ if (is_device_compatible (devices [i ])) {
478+ r -> physical_device = devices [i ];
479+ break ;
480+ }
467481 }
468482 }
469483 if (r -> physical_device == VK_NULL_HANDLE ) {
@@ -472,6 +486,9 @@ static bool select_physical_device(PGRAPHState *pg, Error **errp)
472486 }
473487
474488 vkGetPhysicalDeviceProperties (r -> physical_device , & r -> device_props );
489+ xemu_settings_set_string (& g_config .display .vulkan .preferred_physical_device ,
490+ r -> device_props .deviceName );
491+
475492 fprintf (stderr ,
476493 "Selected physical device: %s\n"
477494 "- Vendor: %x, Device: %x\n"
0 commit comments