From eb8e4519edcc150e8bc6cbe1d2186f852e9c919a Mon Sep 17 00:00:00 2001 From: Erik Abair Date: Sat, 29 Nov 2025 12:56:36 -0800 Subject: [PATCH] nv2a/vk: Add preferred physical device to config --- config_spec.yml | 1 + hw/xbox/nv2a/pgraph/vk/instance.c | 31 ++++++++++++++++++++++++------- 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/config_spec.yml b/config_spec.yml index a18db65031..1e044dfe19 100644 --- a/config_spec.yml +++ b/config_spec.yml @@ -146,6 +146,7 @@ display: validation_layers: bool debug_shaders: bool assert_on_validation_msg: bool + preferred_physical_device: string quality: surface_scale: type: integer diff --git a/hw/xbox/nv2a/pgraph/vk/instance.c b/hw/xbox/nv2a/pgraph/vk/instance.c index c428ce1ce7..30b8e78f5d 100644 --- a/hw/xbox/nv2a/pgraph/vk/instance.c +++ b/hw/xbox/nv2a/pgraph/vk/instance.c @@ -451,19 +451,33 @@ static bool select_physical_device(PGRAPHState *pg, Error **errp) g_malloc_n(num_physical_devices, sizeof(VkPhysicalDevice)); vkEnumeratePhysicalDevices(r->instance, &num_physical_devices, devices); + const char *preferred_device = g_config.display.vulkan.preferred_physical_device; + int preferred_device_index = -1; + fprintf(stderr, "Available physical devices:\n"); for (int i = 0; i < num_physical_devices; i++) { vkGetPhysicalDeviceProperties(devices[i], &r->device_props); - fprintf(stderr, "- %s\n", r->device_props.deviceName); + bool is_preferred = + preferred_device && + !strcmp(r->device_props.deviceName, preferred_device); + if (is_preferred) { + preferred_device_index = i; + } + fprintf(stderr, "- %s%s\n", r->device_props.deviceName, + is_preferred ? " *" : ""); } - // FIXME: Store preferred device - r->physical_device = VK_NULL_HANDLE; - for (int i = 0; i < num_physical_devices; i++) { - if (is_device_compatible(devices[i])) { - r->physical_device = devices[i]; - break; + + if (preferred_device_index >= 0 && + is_device_compatible(devices[preferred_device_index])) { + r->physical_device = devices[preferred_device_index]; + } else { + for (int i = 0; i < num_physical_devices; i++) { + if (is_device_compatible(devices[i])) { + r->physical_device = devices[i]; + break; + } } } if (r->physical_device == VK_NULL_HANDLE) { @@ -472,6 +486,9 @@ static bool select_physical_device(PGRAPHState *pg, Error **errp) } vkGetPhysicalDeviceProperties(r->physical_device, &r->device_props); + xemu_settings_set_string(&g_config.display.vulkan.preferred_physical_device, + r->device_props.deviceName); + fprintf(stderr, "Selected physical device: %s\n" "- Vendor: %x, Device: %x\n"