Merge branch 'master-dev' into 'master'

session: prefer non-USB GPUs when enumerating DRM devices

See merge request wlroots/wlroots!5218
This commit is contained in:
sunzhguy 2026-03-25 08:47:29 +00:00
commit ddd03ab1d0

View file

@ -522,6 +522,7 @@ ssize_t wlr_session_find_gpus(struct wlr_session *session,
struct udev_list_entry *entry; struct udev_list_entry *entry;
size_t i = 0; size_t i = 0;
bool first_is_usb = false;
udev_list_entry_foreach(entry, udev_enumerate_get_list_entry(en)) { udev_list_entry_foreach(entry, udev_enumerate_get_list_entry(en)) {
if (i == ret_len) { if (i == ret_len) {
@ -543,6 +544,7 @@ ssize_t wlr_session_find_gpus(struct wlr_session *session,
continue; continue;
} }
bool is_usb = false;
bool is_primary = false; bool is_primary = false;
const char *boot_display = udev_device_get_sysattr_value(dev, "boot_display"); const char *boot_display = udev_device_get_sysattr_value(dev, "boot_display");
if (boot_display && strcmp(boot_display, "1") == 0) { if (boot_display && strcmp(boot_display, "1") == 0) {
@ -557,6 +559,11 @@ ssize_t wlr_session_find_gpus(struct wlr_session *session,
if (id && strcmp(id, "1") == 0) { if (id && strcmp(id, "1") == 0) {
is_primary = true; is_primary = true;
} }
} else {
// Detect USB-backed DRM devices
struct udev_device *usb_dev =
udev_device_get_parent_with_subsystem_devtype(dev, "usb", NULL);
is_usb = usb_dev != NULL;
} }
} }
@ -566,12 +573,18 @@ ssize_t wlr_session_find_gpus(struct wlr_session *session,
if (!wlr_dev) { if (!wlr_dev) {
continue; continue;
} }
if (i == 0) {
first_is_usb = is_usb;
}
ret[i] = wlr_dev; ret[i] = wlr_dev;
if (is_primary) { // Prefer non-USB GPU if enumeration starts with a USB device
if (is_primary || (first_is_usb && !is_usb)) {
struct wlr_device *tmp = ret[0]; struct wlr_device *tmp = ret[0];
ret[0] = ret[i]; ret[0] = ret[i];
ret[i] = tmp; ret[i] = tmp;
first_is_usb = false;
} }
++i; ++i;