Skip to content

Commit e7f4263

Browse files
abairejyetcv
authored andcommitted
nv2a/vk: Add preferred physical device to config
1 parent 66b5884 commit e7f4263

File tree

2 files changed

+25
-7
lines changed

2 files changed

+25
-7
lines changed

config_spec.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,7 @@ display:
146146
validation_layers: bool
147147
debug_shaders: bool
148148
assert_on_validation_msg: bool
149+
preferred_physical_device: string
149150
quality:
150151
surface_scale:
151152
type: integer

hw/xbox/nv2a/pgraph/vk/instance.c

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)