GBM support with NVIDIA driver

Resolves: #2015891
This commit is contained in:
Olivier Fourdan 2022-01-12 16:24:02 +01:00
parent c884df9cdc
commit f58e7ec96c
6 changed files with 382 additions and 1 deletions

View File

@ -0,0 +1,63 @@
From fa70ee1cd78e2b161545bc47a1c1083063030f77 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
Date: Mon, 11 Oct 2021 10:52:43 +0200
Subject: [PATCH 1/5] renderer/native: Log render mode per device
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2051>
(cherry picked from commit e8249a572d669c4c0a8464d6bce556b2cbaca4ef)
(cherry picked from commit fe0ea79b83256d80f1dee1e4a49c94a5d6fd18a6)
---
src/backends/native/meta-renderer-native.c | 30 ++++++++++++++++++++++
1 file changed, 30 insertions(+)
diff --git a/src/backends/native/meta-renderer-native.c b/src/backends/native/meta-renderer-native.c
index 735c37202..f92f648e5 100644
--- a/src/backends/native/meta-renderer-native.c
+++ b/src/backends/native/meta-renderer-native.c
@@ -1808,6 +1808,24 @@ meta_renderer_native_create_renderer_gpu_data (MetaRendererNative *renderer_nat
return NULL;
}
+static const char *
+renderer_data_mode_to_string (MetaRendererNativeMode mode)
+{
+ switch (mode)
+ {
+ case META_RENDERER_NATIVE_MODE_GBM:
+ return "gbm";
+ case META_RENDERER_NATIVE_MODE_SURFACELESS:
+ return "surfaceless";
+#ifdef HAVE_EGL_DEVICE
+ case META_RENDERER_NATIVE_MODE_EGL_DEVICE:
+ return "egldevice";
+#endif
+ }
+
+ g_assert_not_reached ();
+}
+
static gboolean
create_renderer_gpu_data (MetaRendererNative *renderer_native,
MetaGpuKms *gpu_kms,
@@ -1822,6 +1840,18 @@ create_renderer_gpu_data (MetaRendererNative *renderer_native,
if (!renderer_gpu_data)
return FALSE;
+ if (gpu_kms)
+ {
+ g_message ("Created %s renderer for '%s'",
+ renderer_data_mode_to_string (renderer_gpu_data->mode),
+ meta_gpu_kms_get_file_path (gpu_kms));
+ }
+ else
+ {
+ g_message ("Created %s renderer without GPU",
+ renderer_data_mode_to_string (renderer_gpu_data->mode));
+ }
+
g_hash_table_insert (renderer_native->gpu_datas,
gpu_kms,
renderer_gpu_data);
--
2.35.1

View File

@ -0,0 +1,94 @@
From 425710866438a62843b96272a6cbc6c22174f10c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
Date: Mon, 11 Oct 2021 10:39:43 +0200
Subject: [PATCH 2/5] renderer/native: Try the gbm renderer before the
EGLDevice renderer
This switches the order of what renderer mode is tried first, so that
the gbm renderer mode is preferred on an NVIDIA driver where it is
supported.
We fall back to still try the EGLDevice renderer mode if the created gbm
renderer is not hardware accelerated.
The last fallback is still to use the gbm renderer, even if it is not
hardware accelerated, as this is needed when hardware acceleration isn't
available at all. The original reason for the old order was due to the
fact that a gbm renderer without hardware acceleration would succeed
even on NVIDIA driver that didn't support gbm.
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2051>
(cherry picked from commit 8fc1325e8e713dfa05a12c47e6e981e50d3cda61)
---
src/backends/native/meta-renderer-native.c | 44 +++++++++++-----------
1 file changed, 23 insertions(+), 21 deletions(-)
diff --git a/src/backends/native/meta-renderer-native.c b/src/backends/native/meta-renderer-native.c
index f92f648e5..c851619a1 100644
--- a/src/backends/native/meta-renderer-native.c
+++ b/src/backends/native/meta-renderer-native.c
@@ -1754,38 +1754,40 @@ meta_renderer_native_create_renderer_gpu_data (MetaRendererNative *renderer_nat
MetaGpuKms *gpu_kms,
GError **error)
{
- MetaRendererNativeGpuData *renderer_gpu_data;
+ MetaRendererNativeGpuData *gbm_renderer_gpu_data;
GError *gbm_error = NULL;
#ifdef HAVE_EGL_DEVICE
+ MetaRendererNativeGpuData *egl_stream_renderer_gpu_data;
GError *egl_device_error = NULL;
#endif
if (!gpu_kms)
return create_renderer_gpu_data_surfaceless (renderer_native, error);
-#ifdef HAVE_EGL_DEVICE
- /* Try to initialize the EGLDevice backend first. Whenever we use a
- * non-NVIDIA GPU, the EGLDevice enumeration function won't find a match, and
- * we'll fall back to GBM (which will always succeed as it has a software
- * rendering fallback)
- */
- renderer_gpu_data = create_renderer_gpu_data_egl_device (renderer_native,
- gpu_kms,
- &egl_device_error);
- if (renderer_gpu_data)
- return renderer_gpu_data;
-#endif
-
- renderer_gpu_data = create_renderer_gpu_data_gbm (renderer_native,
- gpu_kms,
- &gbm_error);
- if (renderer_gpu_data)
+ gbm_renderer_gpu_data = create_renderer_gpu_data_gbm (renderer_native,
+ gpu_kms,
+ &gbm_error);
+ if (gbm_renderer_gpu_data)
{
+ if (gbm_renderer_gpu_data->secondary.is_hardware_rendering)
+ return gbm_renderer_gpu_data;
+ }
+
#ifdef HAVE_EGL_DEVICE
- g_error_free (egl_device_error);
-#endif
- return renderer_gpu_data;
+ egl_stream_renderer_gpu_data =
+ create_renderer_gpu_data_egl_device (renderer_native,
+ gpu_kms,
+ &egl_device_error);
+ if (egl_stream_renderer_gpu_data)
+ {
+ g_clear_pointer (&gbm_renderer_gpu_data,
+ meta_renderer_native_gpu_data_free);
+ return egl_stream_renderer_gpu_data;
}
+#endif
+
+ if (gbm_renderer_gpu_data)
+ return gbm_renderer_gpu_data;
g_set_error (error, G_IO_ERROR,
G_IO_ERROR_FAILED,
--
2.35.1

View File

@ -0,0 +1,100 @@
From 07f63ad466b66cc02b49a326789686bce9325201 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
Date: Thu, 14 Oct 2021 18:36:43 +0200
Subject: [PATCH 3/5] wayland: Only init EGLStream controller if we didn't end
up with gbm
When we use gbm together with the NVIDIA driver, we want the EGL/Vulkan
clients to do the same, instead of using the EGLStream paths. To achieve
that, make sure to only initialize the EGLStream controller when we
didn't end up using gbm as the renderer backend.
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2052>
(cherry picked from commit ac907119ae0f415c099976635c3b1dff4d2d7201)
(cherry picked from commit e3931f7b8cbd44072137c5dc9de9041486daeade)
---
src/backends/native/meta-renderer-native.c | 11 +++++++++
src/backends/native/meta-renderer-native.h | 2 ++
src/wayland/meta-wayland.c | 26 ++++++++++++++++++++--
3 files changed, 37 insertions(+), 2 deletions(-)
diff --git a/src/backends/native/meta-renderer-native.c b/src/backends/native/meta-renderer-native.c
index c851619a1..e7460fbf1 100644
--- a/src/backends/native/meta-renderer-native.c
+++ b/src/backends/native/meta-renderer-native.c
@@ -201,6 +201,17 @@ meta_renderer_native_has_pending_mode_set (MetaRendererNative *renderer_native)
return renderer_native->pending_mode_set;
}
+MetaRendererNativeMode
+meta_renderer_native_get_mode (MetaRendererNative *renderer_native)
+{
+ MetaGpuKms *primary_gpu = renderer_native->primary_gpu_kms;
+ MetaRendererNativeGpuData *primary_gpu_data;
+
+ primary_gpu_data = meta_renderer_native_get_gpu_data (renderer_native,
+ primary_gpu);
+ return primary_gpu_data->mode;
+}
+
static void
meta_renderer_native_disconnect (CoglRenderer *cogl_renderer)
{
diff --git a/src/backends/native/meta-renderer-native.h b/src/backends/native/meta-renderer-native.h
index 9475e1857..8c06c2473 100644
--- a/src/backends/native/meta-renderer-native.h
+++ b/src/backends/native/meta-renderer-native.h
@@ -66,4 +66,6 @@ void meta_renderer_native_reset_modes (MetaRendererNative *renderer_native);
gboolean meta_renderer_native_use_modifiers (MetaRendererNative *renderer_native);
+MetaRendererNativeMode meta_renderer_native_get_mode (MetaRendererNative *renderer_native);
+
#endif /* META_RENDERER_NATIVE_H */
diff --git a/src/wayland/meta-wayland.c b/src/wayland/meta-wayland.c
index 8f16aa429..a3f098410 100644
--- a/src/wayland/meta-wayland.c
+++ b/src/wayland/meta-wayland.c
@@ -50,6 +50,10 @@
#include "wayland/meta-xwayland-private.h"
#include "wayland/meta-xwayland.h"
+#ifdef HAVE_NATIVE_BACKEND
+#include "backends/native/meta-renderer-native.h"
+#endif
+
static char *_display_name_override;
G_DEFINE_TYPE (MetaWaylandCompositor, meta_wayland_compositor, G_TYPE_OBJECT)
@@ -521,8 +525,26 @@ meta_wayland_compositor_setup (MetaWaylandCompositor *compositor)
compositor);
#ifdef HAVE_WAYLAND_EGLSTREAM
- meta_wayland_eglstream_controller_init (compositor);
-#endif
+ {
+ gboolean should_enable_eglstream_controller = TRUE;
+#if defined(HAVE_EGL_DEVICE) && defined(HAVE_NATIVE_BACKEND)
+ MetaBackend *backend = meta_get_backend ();
+ MetaRenderer *renderer = meta_backend_get_renderer (backend);
+
+ if (META_IS_RENDERER_NATIVE (renderer))
+ {
+ MetaRendererNative *renderer_native = META_RENDERER_NATIVE (renderer);
+
+ if (meta_renderer_native_get_mode (renderer_native) ==
+ META_RENDERER_NATIVE_MODE_GBM)
+ should_enable_eglstream_controller = FALSE;
+ }
+#endif /* defined(HAVE_EGL_DEVICE) && defined(HAVE_NATIVE_BACKEND) */
+
+ if (should_enable_eglstream_controller)
+ meta_wayland_eglstream_controller_init (compositor);
+ }
+#endif /* HAVE_WAYLAND_EGLSTREAM */
if (meta_get_x11_display_policy () != META_DISPLAY_POLICY_DISABLED)
{
--
2.35.1

View File

@ -0,0 +1,70 @@
From 4c23158f81c3c4b91353150fd4c28246ce1e692f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
Date: Fri, 3 Dec 2021 11:07:00 +0100
Subject: [PATCH 4/5] renderer/native: Allow forcing EGLStream backend
The GBM support in the NVIDIA driver is fairly new, and to make it
easier to identify whether a problem encountered is related to using GBM
instead of EGLStreams, add a debug environment variable to force using
EGLStream instead of GBM.
To force using EGLStream instead of GBM, use
MUTTER_DEBUG_FORCE_EGL_STREAM=1
Related: https://gitlab.gnome.org/GNOME/mutter/-/issues/2045
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2132>
(cherry picked from commit d43cc776ef733251fc02e8e62669ea4ba7e68e2c)
---
src/backends/native/meta-renderer-native.c | 26 ++++++++++++++++------
1 file changed, 19 insertions(+), 7 deletions(-)
diff --git a/src/backends/native/meta-renderer-native.c b/src/backends/native/meta-renderer-native.c
index e7460fbf1..0cd7a27d6 100644
--- a/src/backends/native/meta-renderer-native.c
+++ b/src/backends/native/meta-renderer-native.c
@@ -1765,7 +1765,7 @@ meta_renderer_native_create_renderer_gpu_data (MetaRendererNative *renderer_nat
MetaGpuKms *gpu_kms,
GError **error)
{
- MetaRendererNativeGpuData *gbm_renderer_gpu_data;
+ MetaRendererNativeGpuData *gbm_renderer_gpu_data = NULL;
GError *gbm_error = NULL;
#ifdef HAVE_EGL_DEVICE
MetaRendererNativeGpuData *egl_stream_renderer_gpu_data;
@@ -1775,14 +1775,26 @@ meta_renderer_native_create_renderer_gpu_data (MetaRendererNative *renderer_nat
if (!gpu_kms)
return create_renderer_gpu_data_surfaceless (renderer_native, error);
- gbm_renderer_gpu_data = create_renderer_gpu_data_gbm (renderer_native,
- gpu_kms,
- &gbm_error);
- if (gbm_renderer_gpu_data)
+#ifdef HAVE_EGL_DEVICE
+ if (g_strcmp0 (getenv ("MUTTER_DEBUG_FORCE_EGL_STREAM"), "1") != 0)
+#endif
+ {
+ gbm_renderer_gpu_data = create_renderer_gpu_data_gbm (renderer_native,
+ gpu_kms,
+ &gbm_error);
+ if (gbm_renderer_gpu_data)
+ {
+ if (gbm_renderer_gpu_data->secondary.is_hardware_rendering)
+ return gbm_renderer_gpu_data;
+ }
+ }
+#ifdef HAVE_EGL_DEVICE
+ else
{
- if (gbm_renderer_gpu_data->secondary.is_hardware_rendering)
- return gbm_renderer_gpu_data;
+ g_set_error (&gbm_error, G_IO_ERROR, G_IO_ERROR_FAILED,
+ "GBM backend was disabled using env var");
}
+#endif
#ifdef HAVE_EGL_DEVICE
egl_stream_renderer_gpu_data =
--
2.35.1

View File

@ -0,0 +1,37 @@
From f5ae26bb44c42369cbcf0a9b7da049222b5ecbf8 Mon Sep 17 00:00:00 2001
From: Olivier Fourdan <ofourdan@redhat.com>
Date: Fri, 10 Dec 2021 10:57:29 +0100
Subject: [PATCH 5/5] cursor-renderer/native: Add a means to disable HW cursors
When dealing with a faulty hardware or bugs in the driver, it might be
interesting to force the use of software cursors for debugging purposes.
Add a debug environment variable MUTTER_DEBUG_DISABLE_HW_CURSORS to
disable hardware cursors and force using software cursors.
Closes: https://gitlab.gnome.org/GNOME/mutter/-/issues/2046
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2150>
(cherry picked from commit 56939abd2f1691eea9edf85cb715ebf275944e7e)
---
src/backends/native/meta-cursor-renderer-native.c | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/src/backends/native/meta-cursor-renderer-native.c b/src/backends/native/meta-cursor-renderer-native.c
index fcfe8eb98..237f9a3d5 100644
--- a/src/backends/native/meta-cursor-renderer-native.c
+++ b/src/backends/native/meta-cursor-renderer-native.c
@@ -1828,7 +1828,10 @@ meta_cursor_renderer_native_new (MetaBackend *backend,
priv->backend = backend;
- init_hw_cursor_support (cursor_renderer_native);
+ if (g_strcmp0 (getenv ("MUTTER_DEBUG_DISABLE_HW_CURSORS"), "1"))
+ init_hw_cursor_support (cursor_renderer_native);
+ else
+ g_message ("Disabling hardware cursors because MUTTER_DEBUG_DISABLE_HW_CURSORS is set");
return cursor_renderer_native;
}
--
2.35.1

View File

@ -10,7 +10,7 @@
Name: mutter
Version: 40.9
Release: 6%{?dist}
Release: 7%{?dist}
Summary: Window and compositing manager based on Clutter
License: GPLv2+
@ -82,6 +82,19 @@ Patch22: 0002-onscreen-native-Pass-damage-rectangles-when-page-fli.patch
Patch23: 0001-backends-Move-MetaKeyboardA11yFlags-to-a-public-head.patch
# GBM support with NVIDIA driver
# https://bugzilla.redhat.com/2015891
# Backports:
# https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2051
# https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2052
# https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2132
# https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2150
Patch24: 0001-renderer-native-Log-render-mode-per-device.patch
Patch25: 0002-renderer-native-Try-the-gbm-renderer-before-the-EGLD.patch
Patch26: 0003-wayland-Only-init-EGLStream-controller-if-we-didn-t-.patch
Patch27: 0004-renderer-native-Allow-forcing-EGLStream-backend.patch
Patch28: 0005-cursor-renderer-native-Add-a-means-to-disable-HW-cur.patch
BuildRequires: chrpath
BuildRequires: pango-devel
BuildRequires: startup-notification-devel
@ -228,6 +241,10 @@ desktop-file-validate %{buildroot}/%{_datadir}/applications/%{name}.desktop
%{_datadir}/mutter-%{mutter_api_version}/tests
%changelog
* Mon Jun 20 2022 Olivier Fourdan <ofourdan@redhat.com> - 40.9-7
- GBM support with NVIDIA driver
Resolves: #2015891
* Mon Jun 20 2022 Florian Müllner <fmuellner@redhat.com> - 40.9-6
- Make moved KeyboardA11yFlags enum public
Related: #2047644