[mutter/gnome-3-38] renderer/native: Add udev rule to select primary GPU
- From: Jonas Ådahl <jadahl src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter/gnome-3-38] renderer/native: Add udev rule to select primary GPU
- Date: Tue, 17 Nov 2020 07:36:04 +0000 (UTC)
commit 17e9cbe8cbeeedf4b50fe7a8af4d7adbde03dda0
Author: Jonas Ådahl <jadahl gmail com>
Date: Sat Nov 14 09:41:23 2020 +0000
renderer/native: Add udev rule to select primary GPU
Sometimes the automatically selected primary GPU isn't suitable with no
way to make an well educated guess to do it better. To make it possible
for the user to override the automatically calculated default, make it
possible to override it using a udev rule.
E.g. to select /dev/dri/card1 as the primary GPU, add a file e.g.
/usr/lib/udev/rules.d/61-mutter-primary-gpu.rules (path my vary
depending on distribution) containing the fellowing line:
ENV{DEVNAME}=="/dev/dri/card1", TAG+="mutter-device-preferred-primary"
Reboot or manual triggering of udev rules to make it take effect may be
required.
Related: https://gitlab.gnome.org/GNOME/mutter/merge_requests/1057
https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1562
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1562>
(cherry picked from commit d622960429b2a10bc19d43a8fb56a73f99ecef10)
src/backends/native/meta-backend-native.c | 3 +++
src/backends/native/meta-kms-types.h | 1 +
src/backends/native/meta-renderer-native.c | 34 +++++++++++++++++++++++++++---
src/backends/native/meta-udev.c | 12 +++++++++++
src/backends/native/meta-udev.h | 2 ++
5 files changed, 49 insertions(+), 3 deletions(-)
---
diff --git a/src/backends/native/meta-backend-native.c b/src/backends/native/meta-backend-native.c
index 38ff601ce6..ed795ccb18 100644
--- a/src/backends/native/meta-backend-native.c
+++ b/src/backends/native/meta-backend-native.c
@@ -574,6 +574,9 @@ create_gpu_from_udev_device (MetaBackendNative *native,
if (meta_is_udev_device_requires_modifiers (device))
flags |= META_KMS_DEVICE_FLAG_REQUIRES_MODIFIERS;
+ if (meta_is_udev_device_preferred_primary (device))
+ flags |= META_KMS_DEVICE_FLAG_PREFERRED_PRIMARY;
+
device_path = g_udev_device_get_device_file (device);
kms_device = meta_kms_create_device (native->kms, device_path, flags,
diff --git a/src/backends/native/meta-kms-types.h b/src/backends/native/meta-kms-types.h
index 1fed7e332c..1d59025053 100644
--- a/src/backends/native/meta-kms-types.h
+++ b/src/backends/native/meta-kms-types.h
@@ -57,6 +57,7 @@ typedef enum _MetaKmsDeviceFlag
META_KMS_DEVICE_FLAG_BOOT_VGA = 1 << 0,
META_KMS_DEVICE_FLAG_PLATFORM_DEVICE = 1 << 1,
META_KMS_DEVICE_FLAG_REQUIRES_MODIFIERS = 1 << 2,
+ META_KMS_DEVICE_FLAG_PREFERRED_PRIMARY = 1 << 3,
} MetaKmsDeviceFlag;
typedef enum _MetaKmsPlaneType MetaKmsPlaneType;
diff --git a/src/backends/native/meta-renderer-native.c b/src/backends/native/meta-renderer-native.c
index eb11be9a51..87ca84bc89 100644
--- a/src/backends/native/meta-renderer-native.c
+++ b/src/backends/native/meta-renderer-native.c
@@ -64,6 +64,7 @@
#include "backends/native/meta-drm-buffer-import.h"
#include "backends/native/meta-drm-buffer.h"
#include "backends/native/meta-gpu-kms.h"
+#include "backends/native/meta-kms-device.h"
#include "backends/native/meta-kms-update.h"
#include "backends/native/meta-kms-utils.h"
#include "backends/native/meta-kms.h"
@@ -3725,6 +3726,21 @@ choose_primary_gpu_unchecked (MetaBackend *backend,
*/
for (allow_sw = 0; allow_sw < 2; allow_sw++)
{
+ /* First check if one was explicitly configured. */
+ for (l = gpus; l; l = l->next)
+ {
+ MetaGpuKms *gpu_kms = META_GPU_KMS (l->data);
+ MetaKmsDevice *kms_device = meta_gpu_kms_get_kms_device (gpu_kms);
+
+ if (meta_kms_device_get_flags (kms_device) &
+ META_KMS_DEVICE_FLAG_PREFERRED_PRIMARY)
+ {
+ g_message ("GPU %s selected primary given udev rule",
+ meta_gpu_kms_get_file_path (gpu_kms));
+ return gpu_kms;
+ }
+ }
+
/* Prefer a platform device */
for (l = gpus; l; l = l->next)
{
@@ -3733,7 +3749,11 @@ choose_primary_gpu_unchecked (MetaBackend *backend,
if (meta_gpu_kms_is_platform_device (gpu_kms) &&
(allow_sw == 1 ||
gpu_kms_is_hardware_rendering (renderer_native, gpu_kms)))
- return gpu_kms;
+ {
+ g_message ("Integrated GPU %s selected as primary",
+ meta_gpu_kms_get_file_path (gpu_kms));
+ return gpu_kms;
+ }
}
/* Otherwise a device we booted with */
@@ -3744,7 +3764,11 @@ choose_primary_gpu_unchecked (MetaBackend *backend,
if (meta_gpu_kms_is_boot_vga (gpu_kms) &&
(allow_sw == 1 ||
gpu_kms_is_hardware_rendering (renderer_native, gpu_kms)))
- return gpu_kms;
+ {
+ g_message ("Boot VGA GPU %s selected as primary",
+ meta_gpu_kms_get_file_path (gpu_kms));
+ return gpu_kms;
+ }
}
/* Fall back to any device */
@@ -3754,7 +3778,11 @@ choose_primary_gpu_unchecked (MetaBackend *backend,
if (allow_sw == 1 ||
gpu_kms_is_hardware_rendering (renderer_native, gpu_kms))
- return gpu_kms;
+ {
+ g_message ("GPU %s selected as primary",
+ meta_gpu_kms_get_file_path (gpu_kms));
+ return gpu_kms;
+ }
}
}
diff --git a/src/backends/native/meta-udev.c b/src/backends/native/meta-udev.c
index 41c686c887..9568698595 100644
--- a/src/backends/native/meta-udev.c
+++ b/src/backends/native/meta-udev.c
@@ -95,6 +95,18 @@ meta_is_udev_device_requires_modifiers (GUdevDevice *device)
return g_strv_contains (tags, "mutter-device-requires-kms-modifiers");
}
+gboolean
+meta_is_udev_device_preferred_primary (GUdevDevice *device)
+{
+ const char * const * tags;
+
+ tags = g_udev_device_get_tags (device);
+ if (!tags)
+ return FALSE;
+
+ return g_strv_contains (tags, "mutter-device-preferred-primary");
+}
+
gboolean
meta_udev_is_drm_device (MetaUdev *udev,
GUdevDevice *device)
diff --git a/src/backends/native/meta-udev.h b/src/backends/native/meta-udev.h
index eb90abb093..453cce9a71 100644
--- a/src/backends/native/meta-udev.h
+++ b/src/backends/native/meta-udev.h
@@ -34,6 +34,8 @@ gboolean meta_is_udev_device_boot_vga (GUdevDevice *device);
gboolean meta_is_udev_device_requires_modifiers (GUdevDevice *device);
+gboolean meta_is_udev_device_preferred_primary (GUdevDevice *device);
+
gboolean meta_udev_is_drm_device (MetaUdev *udev,
GUdevDevice *device);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]