mirror of
https://gitlab.freedesktop.org/wlroots/wlroots.git
synced 2026-03-22 05:34:24 -04:00
session: prefer non-USB GPUs when enumerating DRM devices
USB DRM devices may appear first during enumeration. Prefer the first non-USB GPU without changing primary detection. Signed-off-by: sunzhguy <sunzhigang1@kylinos.cn>
This commit is contained in:
parent
9119b8aa85
commit
e51888a821
1 changed files with 14 additions and 1 deletions
|
|
@ -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;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue