Blob Blame History Raw
From 16b16d2a616ab097e30f95b162c5026be036331c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
Date: Thu, 12 Sep 2019 11:50:34 +0200
Subject: [PATCH 1/8] renderer/native: Add API to get primary GPU

Will be used when acquiring scanouts from Wayland buffers.

https://gitlab.gnome.org/GNOME/mutter/merge_requests/798
---
 src/backends/native/meta-renderer-native.c | 6 ++++++
 src/backends/native/meta-renderer-native.h | 2 ++
 2 files changed, 8 insertions(+)

diff --git a/src/backends/native/meta-renderer-native.c b/src/backends/native/meta-renderer-native.c
index e94562b28..2b7b40b08 100644
--- a/src/backends/native/meta-renderer-native.c
+++ b/src/backends/native/meta-renderer-native.c
@@ -313,6 +313,12 @@ meta_gbm_device_from_gpu (MetaGpuKms *gpu_kms)
   return renderer_gpu_data->gbm.device;
 }
 
+MetaGpuKms *
+meta_renderer_native_get_primary_gpu (MetaRendererNative *renderer_native)
+{
+  return renderer_native->primary_gpu_kms;
+}
+
 static MetaRendererNativeGpuData *
 meta_create_renderer_native_gpu_data (MetaGpuKms *gpu_kms)
 {
diff --git a/src/backends/native/meta-renderer-native.h b/src/backends/native/meta-renderer-native.h
index 7abe7c152..840ae1a40 100644
--- a/src/backends/native/meta-renderer-native.h
+++ b/src/backends/native/meta-renderer-native.h
@@ -51,6 +51,8 @@ MetaRendererNative * meta_renderer_native_new (MetaBackendNative  *backend_nativ
 
 struct gbm_device * meta_gbm_device_from_gpu (MetaGpuKms *gpu_kms);
 
+MetaGpuKms * meta_renderer_native_get_primary_gpu (MetaRendererNative *renderer_native);
+
 void meta_renderer_native_finish_frame (MetaRendererNative *renderer_native);
 
 int64_t meta_renderer_native_get_frame_counter (MetaRendererNative *renderer_native);
-- 
2.28.0


From b1bd8f98e242dcee2a412c88e6b8d0025c24e6bb Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
Date: Wed, 17 Jun 2020 17:46:25 +0200
Subject: [PATCH 2/8] backend: Add getter for MetaScreenCast

https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1318
(cherry picked from commit 60c8d227eaefc42b5fbfe12e71187ce899ba2ede)
---
 src/backends/meta-backend-private.h |  2 ++
 src/backends/meta-backend.c         | 11 +++++++++++
 2 files changed, 13 insertions(+)

diff --git a/src/backends/meta-backend-private.h b/src/backends/meta-backend-private.h
index 5b0c849ec..289817784 100644
--- a/src/backends/meta-backend-private.h
+++ b/src/backends/meta-backend-private.h
@@ -135,6 +135,8 @@ MetaEgl * meta_backend_get_egl (MetaBackend *backend);
 
 #ifdef HAVE_REMOTE_DESKTOP
 MetaRemoteDesktop * meta_backend_get_remote_desktop (MetaBackend *backend);
+
+MetaScreenCast * meta_backend_get_screen_cast (MetaBackend *backend);
 #endif
 
 gboolean meta_backend_grab_device (MetaBackend *backend,
diff --git a/src/backends/meta-backend.c b/src/backends/meta-backend.c
index b1c6aa86c..39aa63940 100644
--- a/src/backends/meta-backend.c
+++ b/src/backends/meta-backend.c
@@ -1151,6 +1151,17 @@ meta_backend_get_remote_desktop (MetaBackend *backend)
 
   return priv->remote_desktop;
 }
+
+/**
+ * meta_backend_get_screen_cast: (skip)
+ */
+MetaScreenCast *
+meta_backend_get_screen_cast (MetaBackend *backend)
+{
+  MetaBackendPrivate *priv = meta_backend_get_instance_private (backend);
+
+  return priv->screen_cast;
+}
 #endif /* HAVE_REMOTE_DESKTOP */
 
 /**
-- 
2.28.0


From b6cad30b596423def2f20251f7f8c9e5e76901cd Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
Date: Wed, 17 Jun 2020 17:48:05 +0200
Subject: [PATCH 3/8] screen-cast: Move DMA buffer allocation to MetaScreenCast

The aim with centralizing it is to be able to apply global policy to DMA
buffer allocations, e.g. disabling due to various hueristics.

https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1318
(cherry picked from commit d725acb267600f97f9926c4110b23c88399c090d)
---
 src/backends/meta-screen-cast-stream-src.c | 18 ++++++--------
 src/backends/meta-screen-cast.c            | 28 ++++++++++++++++++++++
 src/backends/meta-screen-cast.h            |  4 ++++
 3 files changed, 39 insertions(+), 11 deletions(-)

diff --git a/src/backends/meta-screen-cast-stream-src.c b/src/backends/meta-screen-cast-stream-src.c
index 7eb99f70d..8ae2b6bba 100644
--- a/src/backends/meta-screen-cast-stream-src.c
+++ b/src/backends/meta-screen-cast-stream-src.c
@@ -726,10 +726,10 @@ on_stream_add_buffer (void             *data,
   MetaScreenCastStreamSrc *src = data;
   MetaScreenCastStreamSrcPrivate *priv =
     meta_screen_cast_stream_src_get_instance_private (src);
-  CoglContext *context =
-    clutter_backend_get_cogl_context (clutter_get_default_backend ());
-  CoglRenderer *renderer = cogl_context_get_renderer (context);
-  g_autoptr (GError) error = NULL;
+  MetaScreenCastStream *stream = meta_screen_cast_stream_src_get_stream (src);
+  MetaScreenCastSession *session = meta_screen_cast_stream_get_session (stream);
+  MetaScreenCast *screen_cast =
+    meta_screen_cast_session_get_screen_cast (session);
   CoglDmaBufHandle *dmabuf_handle;
   struct spa_buffer *spa_buffer = buffer->buffer;
   struct spa_data *spa_data = spa_buffer->datas;
@@ -741,13 +741,9 @@ on_stream_add_buffer (void             *data,
   spa_data[0].mapoffset = 0;
   spa_data[0].maxsize = stride * priv->video_format.size.height;
 
-  dmabuf_handle = cogl_renderer_create_dma_buf (renderer,
-                                                priv->stream_width,
-                                                priv->stream_height,
-                                                &error);
-
-  if (error)
-    g_debug ("Error exporting DMA buffer handle: %s", error->message);
+  dmabuf_handle = meta_screen_cast_create_dma_buf_handle (screen_cast,
+                                                          priv->stream_width,
+                                                          priv->stream_height);
 
   if (dmabuf_handle)
     {
diff --git a/src/backends/meta-screen-cast.c b/src/backends/meta-screen-cast.c
index b473aa8eb..0cf3f90ec 100644
--- a/src/backends/meta-screen-cast.c
+++ b/src/backends/meta-screen-cast.c
@@ -69,6 +69,34 @@ meta_screen_cast_get_backend (MetaScreenCast *screen_cast)
   return screen_cast->backend;
 }
 
+CoglDmaBufHandle *
+meta_screen_cast_create_dma_buf_handle (MetaScreenCast *screen_cast,
+                                        int             width,
+                                        int             height)
+{
+  ClutterBackend *clutter_backend =
+    meta_backend_get_clutter_backend (screen_cast->backend);
+  CoglContext *cogl_context =
+    clutter_backend_get_cogl_context (clutter_backend);
+  CoglRenderer *cogl_renderer = cogl_context_get_renderer (cogl_context);
+  g_autoptr (GError) error = NULL;
+  CoglDmaBufHandle *dmabuf_handle;
+
+  dmabuf_handle = cogl_renderer_create_dma_buf (cogl_renderer,
+                                                width, height,
+                                                &error);
+  if (!dmabuf_handle)
+    {
+      g_warning ("Failed to allocate DMA buffer, "
+                 "disabling DMA buffer based screen casting: %s",
+                 error->message);
+      screen_cast->disable_dma_bufs = TRUE;
+      return NULL;
+    }
+
+  return dmabuf_handle;
+}
+
 static gboolean
 register_remote_desktop_screen_cast_session (MetaScreenCastSession  *session,
                                              const char             *remote_desktop_session_id,
diff --git a/src/backends/meta-screen-cast.h b/src/backends/meta-screen-cast.h
index 994c40c53..780a7932c 100644
--- a/src/backends/meta-screen-cast.h
+++ b/src/backends/meta-screen-cast.h
@@ -46,6 +46,10 @@ GDBusConnection * meta_screen_cast_get_connection (MetaScreenCast *screen_cast);
 
 MetaBackend * meta_screen_cast_get_backend (MetaScreenCast *screen_cast);
 
+CoglDmaBufHandle * meta_screen_cast_create_dma_buf_handle (MetaScreenCast *screen_cast,
+                                                           int             width,
+                                                           int             height);
+
 MetaScreenCast * meta_screen_cast_new (MetaBackend            *backend,
                                        MetaDbusSessionWatcher *session_watcher);
 
-- 
2.28.0


From 08821fae3645d957ef18ab4096a4a934f132ff0b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
Date: Wed, 17 Jun 2020 17:49:12 +0200
Subject: [PATCH 4/8] kms/device: Provide driver name and description

Retrieved from drmGetVersion(), to be used to identify what driver a DRM
device is driven by.

https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1318
(cherry picked from commit d73a858dc2878a69ea69a863a6d668037c5fc7c1)
---
 src/backends/native/meta-kms-device.c      | 22 ++++++++++++++
 src/backends/native/meta-kms-device.h      |  4 +++
 src/backends/native/meta-kms-impl-device.c | 34 ++++++++++++++++++++++
 src/backends/native/meta-kms-impl-device.h |  4 +++
 4 files changed, 64 insertions(+)

diff --git a/src/backends/native/meta-kms-device.c b/src/backends/native/meta-kms-device.c
index a31dce8bd..635bc9638 100644
--- a/src/backends/native/meta-kms-device.c
+++ b/src/backends/native/meta-kms-device.c
@@ -39,6 +39,8 @@ struct _MetaKmsDevice
 
   MetaKmsDeviceFlag flags;
   char *path;
+  char *driver_name;
+  char *driver_description;
 
   GList *crtcs;
   GList *connectors;
@@ -67,6 +69,18 @@ meta_kms_device_get_path (MetaKmsDevice *device)
   return device->path;
 }
 
+const char *
+meta_kms_device_get_driver_name (MetaKmsDevice *device)
+{
+  return device->driver_name;
+}
+
+const char *
+meta_kms_device_get_driver_description (MetaKmsDevice *device)
+{
+  return device->driver_description;
+}
+
 MetaKmsDeviceFlag
 meta_kms_device_get_flags (MetaKmsDevice *device)
 {
@@ -247,6 +261,8 @@ typedef struct _CreateImplDeviceData
   GList *out_connectors;
   GList *out_planes;
   MetaKmsDeviceCaps out_caps;
+  char *out_driver_name;
+  char *out_driver_description;
 } CreateImplDeviceData;
 
 static gpointer
@@ -266,6 +282,10 @@ create_impl_device_in_impl (MetaKmsImpl  *impl,
   data->out_connectors = meta_kms_impl_device_copy_connectors (impl_device);
   data->out_planes = meta_kms_impl_device_copy_planes (impl_device);
   data->out_caps = *meta_kms_impl_device_get_caps (impl_device);
+  data->out_driver_name =
+    g_strdup (meta_kms_impl_device_get_driver_name (impl_device));
+  data->out_driver_description =
+    g_strdup (meta_kms_impl_device_get_driver_description (impl_device));
 
   return GINT_TO_POINTER (TRUE);
 }
@@ -309,6 +329,8 @@ meta_kms_device_new (MetaKms            *kms,
   device->connectors = data.out_connectors;
   device->planes = data.out_planes;
   device->caps = data.out_caps;
+  device->driver_name = data.out_driver_name;
+  device->driver_description = data.out_driver_description;
 
   return device;
 }
diff --git a/src/backends/native/meta-kms-device.h b/src/backends/native/meta-kms-device.h
index 9f83d3855..95c16ddfd 100644
--- a/src/backends/native/meta-kms-device.h
+++ b/src/backends/native/meta-kms-device.h
@@ -33,6 +33,10 @@ int meta_kms_device_leak_fd (MetaKmsDevice *device);
 
 const char * meta_kms_device_get_path (MetaKmsDevice *device);
 
+const char * meta_kms_device_get_driver_name (MetaKmsDevice *device);
+
+const char * meta_kms_device_get_driver_description (MetaKmsDevice *device);
+
 MetaKmsDeviceFlag meta_kms_device_get_flags (MetaKmsDevice *device);
 
 gboolean meta_kms_device_get_cursor_size (MetaKmsDevice *device,
diff --git a/src/backends/native/meta-kms-impl-device.c b/src/backends/native/meta-kms-impl-device.c
index 80d7a8b01..6beef4f52 100644
--- a/src/backends/native/meta-kms-impl-device.c
+++ b/src/backends/native/meta-kms-impl-device.c
@@ -45,6 +45,9 @@ struct _MetaKmsImplDevice
   int fd;
   GSource *fd_source;
 
+  char *driver_name;
+  char *driver_description;
+
   GList *crtcs;
   GList *connectors;
   GList *planes;
@@ -84,6 +87,18 @@ meta_kms_impl_device_get_caps (MetaKmsImplDevice *impl_device)
   return &impl_device->caps;
 }
 
+const char *
+meta_kms_impl_device_get_driver_name (MetaKmsImplDevice *impl_device)
+{
+  return impl_device->driver_name;
+}
+
+const char *
+meta_kms_impl_device_get_driver_description (MetaKmsImplDevice *impl_device)
+{
+  return impl_device->driver_description;
+}
+
 static void
 page_flip_handler (int           fd,
                    unsigned int  sequence,
@@ -357,6 +372,22 @@ init_planes (MetaKmsImplDevice *impl_device)
   impl_device->planes = g_list_reverse (impl_device->planes);
 }
 
+static void
+init_info (MetaKmsImplDevice *impl_device)
+{
+  drmVersion *drm_version;
+
+  drm_version = drmGetVersion (impl_device->fd);
+  if (!drm_version)
+    return;
+
+  impl_device->driver_name = g_strndup (drm_version->name,
+                                        drm_version->name_len);
+  impl_device->driver_description = g_strndup (drm_version->desc,
+                                               drm_version->desc_len);
+  drmFreeVersion (drm_version);
+}
+
 void
 meta_kms_impl_device_update_states (MetaKmsImplDevice *impl_device)
 {
@@ -435,6 +466,7 @@ meta_kms_impl_device_new (MetaKmsDevice  *device,
 
   init_crtcs (impl_device, drm_resources);
   init_planes (impl_device);
+  init_info (impl_device);
 
   update_connectors (impl_device, drm_resources);
 
@@ -484,6 +516,8 @@ meta_kms_impl_device_finalize (GObject *object)
   g_list_free_full (impl_device->planes, g_object_unref);
   g_list_free_full (impl_device->crtcs, g_object_unref);
   g_list_free_full (impl_device->connectors, g_object_unref);
+  g_free (impl_device->driver_name);
+  g_free (impl_device->driver_description);
 
   G_OBJECT_CLASS (meta_kms_impl_device_parent_class)->finalize (object);
 }
diff --git a/src/backends/native/meta-kms-impl-device.h b/src/backends/native/meta-kms-impl-device.h
index e8c08f19f..e55a95b58 100644
--- a/src/backends/native/meta-kms-impl-device.h
+++ b/src/backends/native/meta-kms-impl-device.h
@@ -50,6 +50,10 @@ GList * meta_kms_impl_device_copy_planes (MetaKmsImplDevice *impl_device);
 
 const MetaKmsDeviceCaps * meta_kms_impl_device_get_caps (MetaKmsImplDevice *impl_device);
 
+const char * meta_kms_impl_device_get_driver_name (MetaKmsImplDevice *impl_device);
+
+const char * meta_kms_impl_device_get_driver_description (MetaKmsImplDevice *impl_device);
+
 gboolean meta_kms_impl_device_dispatch (MetaKmsImplDevice  *impl_device,
                                         GError            **error);
 
-- 
2.28.0


From be0ab2366568c64b2a8abbcd5f15e0f1adcea6e0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
Date: Wed, 17 Jun 2020 17:50:17 +0200
Subject: [PATCH 5/8] screen-cast: Disable DMA buffer based screen casting for
 QXL

QXL doesn't support mmap():ing a DMA buffer allocated in mutter inside
the PipeWire stream consumer process. To make screen casting work again
on QXL, disable DMA buffer based screen casting for QXL.

Eventually, it should be the client that renegotiates the supported
buffer types, but until then we need this list.

https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1318
(cherry picked from commit 986066ed407213f3c2ad79d8ddad3cd5bc1548e4)
---
 src/backends/meta-screen-cast.c           | 11 +++++++
 src/backends/meta-screen-cast.h           |  2 ++
 src/backends/native/meta-backend-native.c | 40 +++++++++++++++++++++++
 3 files changed, 53 insertions(+)

diff --git a/src/backends/meta-screen-cast.c b/src/backends/meta-screen-cast.c
index 0cf3f90ec..19163918d 100644
--- a/src/backends/meta-screen-cast.c
+++ b/src/backends/meta-screen-cast.c
@@ -44,6 +44,8 @@ struct _MetaScreenCast
 
   MetaDbusSessionWatcher *session_watcher;
   MetaBackend *backend;
+
+  gboolean disable_dma_bufs;
 };
 
 static void
@@ -69,6 +71,12 @@ meta_screen_cast_get_backend (MetaScreenCast *screen_cast)
   return screen_cast->backend;
 }
 
+void
+meta_screen_cast_disable_dma_bufs (MetaScreenCast *screen_cast)
+{
+  screen_cast->disable_dma_bufs = TRUE;
+}
+
 CoglDmaBufHandle *
 meta_screen_cast_create_dma_buf_handle (MetaScreenCast *screen_cast,
                                         int             width,
@@ -82,6 +90,9 @@ meta_screen_cast_create_dma_buf_handle (MetaScreenCast *screen_cast,
   g_autoptr (GError) error = NULL;
   CoglDmaBufHandle *dmabuf_handle;
 
+  if (screen_cast->disable_dma_bufs)
+    return NULL;
+
   dmabuf_handle = cogl_renderer_create_dma_buf (cogl_renderer,
                                                 width, height,
                                                 &error);
diff --git a/src/backends/meta-screen-cast.h b/src/backends/meta-screen-cast.h
index 780a7932c..796f7d61a 100644
--- a/src/backends/meta-screen-cast.h
+++ b/src/backends/meta-screen-cast.h
@@ -46,6 +46,8 @@ GDBusConnection * meta_screen_cast_get_connection (MetaScreenCast *screen_cast);
 
 MetaBackend * meta_screen_cast_get_backend (MetaScreenCast *screen_cast);
 
+void meta_screen_cast_disable_dma_bufs (MetaScreenCast *screen_cast);
+
 CoglDmaBufHandle * meta_screen_cast_create_dma_buf_handle (MetaScreenCast *screen_cast,
                                                            int             width,
                                                            int             height);
diff --git a/src/backends/native/meta-backend-native.c b/src/backends/native/meta-backend-native.c
index e5a16f337..607dc7c82 100644
--- a/src/backends/native/meta-backend-native.c
+++ b/src/backends/native/meta-backend-native.c
@@ -63,6 +63,10 @@
 #include "core/meta-border.h"
 #include "meta/main.h"
 
+#ifdef HAVE_REMOTE_DESKTOP
+#include "backends/meta-screen-cast.h"
+#endif
+
 struct _MetaBackendNative
 {
   MetaBackend parent;
@@ -337,6 +341,38 @@ meta_backend_native_create_clutter_backend (MetaBackend *backend)
   return g_object_new (META_TYPE_CLUTTER_BACKEND_NATIVE, NULL);
 }
 
+#ifdef HAVE_REMOTE_DESKTOP
+static void
+maybe_disable_screen_cast_dma_bufs (MetaBackendNative *native)
+{
+  MetaBackend *backend = META_BACKEND (native);
+  MetaRenderer *renderer = meta_backend_get_renderer (backend);
+  MetaRendererNative *renderer_native = META_RENDERER_NATIVE (renderer);
+  MetaGpuKms *primary_gpu;
+  MetaKmsDevice *kms_device;
+  const char *driver_name;
+  static const char *disable_dma_buf_drivers[] = {
+    "qxl",
+    NULL,
+  };
+
+  primary_gpu = meta_renderer_native_get_primary_gpu (renderer_native);
+  kms_device = meta_gpu_kms_get_kms_device (primary_gpu);
+  driver_name = meta_kms_device_get_driver_name (kms_device);
+
+  if (g_strv_contains (disable_dma_buf_drivers, driver_name))
+    {
+      MetaScreenCast *screen_cast = meta_backend_get_screen_cast (backend);
+
+      g_message ("The '%s' driver doesn't support DMA buffer screen sharing, disabling.",
+                 driver_name);
+
+      meta_screen_cast_disable_dma_bufs (screen_cast);
+      return;
+    }
+}
+#endif /* HAVE_REMOTE_DESKTOP */
+
 static void
 meta_backend_native_post_init (MetaBackend *backend)
 {
@@ -367,6 +403,10 @@ meta_backend_native_post_init (MetaBackend *backend)
         g_warning ("Failed to set RT scheduler: %m");
     }
 
+#ifdef HAVE_REMOTE_DESKTOP
+  maybe_disable_screen_cast_dma_bufs (META_BACKEND_NATIVE (backend));
+#endif
+
 #ifdef HAVE_WAYLAND
   meta_backend_init_wayland (backend);
 #endif
-- 
2.28.0


From eb27a2f0cc4c0b8a4a0c3aad00167110ca57b523 Mon Sep 17 00:00:00 2001
From: Grey Christoforo <grey@christoforo.net>
Date: Wed, 29 Jul 2020 20:02:27 +0000
Subject: [PATCH 6/8] screen-cast: Add vmwgfx to the DMA buffer deny list

VMWare has the same issues with mmap():ing DMA buffers cross process
boundaries so fall back to regular shared memory for 'vmwgfx' as well.

https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1318
(cherry picked from commit aaf70b28d198811e4fa838f0eeb4e41c8aacc889)
---
 src/backends/native/meta-backend-native.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/backends/native/meta-backend-native.c b/src/backends/native/meta-backend-native.c
index 607dc7c82..47ce77c45 100644
--- a/src/backends/native/meta-backend-native.c
+++ b/src/backends/native/meta-backend-native.c
@@ -353,6 +353,7 @@ maybe_disable_screen_cast_dma_bufs (MetaBackendNative *native)
   const char *driver_name;
   static const char *disable_dma_buf_drivers[] = {
     "qxl",
+    "vmwgfx",
     NULL,
   };
 
-- 
2.28.0


From bce1dd982dbf1d32f628cf13641d819f980cb70e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
Date: Mon, 14 Sep 2020 11:36:25 +0200
Subject: [PATCH 7/8] screen-cast: Enable DMA buffers only for i915

Seems DMA buffer based interprocess buffer sharing is more broken than
not, so for now only enable it when using the i915 driver.

For example vmwgfx, qxl and radeon, it results in mmap() failing to mmap the
memory region. Other drivers, e.g. amdgpu will function, but may hit
very slow memory download paths, resulting in worse performance.

https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1442
(cherry picked from commit 358d3633bfd581d11b1fc71bb1881ec56a7ae031)
---
 src/backends/native/meta-backend-native.c | 20 +++++++++-----------
 1 file changed, 9 insertions(+), 11 deletions(-)

diff --git a/src/backends/native/meta-backend-native.c b/src/backends/native/meta-backend-native.c
index 47ce77c45..6961793cf 100644
--- a/src/backends/native/meta-backend-native.c
+++ b/src/backends/native/meta-backend-native.c
@@ -348,29 +348,27 @@ maybe_disable_screen_cast_dma_bufs (MetaBackendNative *native)
   MetaBackend *backend = META_BACKEND (native);
   MetaRenderer *renderer = meta_backend_get_renderer (backend);
   MetaRendererNative *renderer_native = META_RENDERER_NATIVE (renderer);
+  MetaScreenCast *screen_cast = meta_backend_get_screen_cast (backend);
   MetaGpuKms *primary_gpu;
   MetaKmsDevice *kms_device;
   const char *driver_name;
-  static const char *disable_dma_buf_drivers[] = {
-    "qxl",
-    "vmwgfx",
+  static const char *enable_dma_buf_drivers[] = {
+    "i915",
     NULL,
   };
 
   primary_gpu = meta_renderer_native_get_primary_gpu (renderer_native);
   kms_device = meta_gpu_kms_get_kms_device (primary_gpu);
   driver_name = meta_kms_device_get_driver_name (kms_device);
+  fprintf(stderr, ":::: %s:%d %s() - driver name '%s'\n", __FILE__, __LINE__, __func__, driver_name);
 
-  if (g_strv_contains (disable_dma_buf_drivers, driver_name))
-    {
-      MetaScreenCast *screen_cast = meta_backend_get_screen_cast (backend);
+  if (g_strv_contains (enable_dma_buf_drivers, driver_name))
+    return;
 
-      g_message ("The '%s' driver doesn't support DMA buffer screen sharing, disabling.",
-                 driver_name);
+  g_message ("Disabling DMA buffer screen sharing for driver '%s'.",
+             driver_name);
 
-      meta_screen_cast_disable_dma_bufs (screen_cast);
-      return;
-    }
+  meta_screen_cast_disable_dma_bufs (screen_cast);
 }
 #endif /* HAVE_REMOTE_DESKTOP */
 
-- 
2.28.0


From 9ae0cb93ebb454ad96b98cfe7369adf5730c1612 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
Date: Mon, 14 Sep 2020 18:23:10 +0200
Subject: [PATCH 8/8] screen-cast: Add 'dma-buf-screen-sharing' experimental
 feature

It's enabled by default when using the i915 driver, but disabled
everywhere else until it can be made reliably an improvement. Until
then, for anyone want to force-enable it, add the string
'dma-buf-screen-sharing' to the experimental features list in GSettings.

https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1442
(cherry picked from commit af9df1e5b62b253e5f1d5f6eff89e45e3bed81b3)
---
 src/backends/meta-settings-private.h      | 1 +
 src/backends/meta-settings.c              | 2 ++
 src/backends/native/meta-backend-native.c | 5 +++++
 3 files changed, 8 insertions(+)

diff --git a/src/backends/meta-settings-private.h b/src/backends/meta-settings-private.h
index 7d610d5b4..4bd0962d4 100644
--- a/src/backends/meta-settings-private.h
+++ b/src/backends/meta-settings-private.h
@@ -35,6 +35,7 @@ typedef enum _MetaExperimentalFeature
   META_EXPERIMENTAL_FEATURE_KMS_MODIFIERS  = (1 << 1),
   META_EXPERIMENTAL_FEATURE_RT_SCHEDULER = (1 << 2),
   META_EXPERIMENTAL_FEATURE_AUTOSTART_XWAYLAND  = (1 << 3),
+  META_EXPERIMENTAL_FEATURE_DMA_BUF_SCREEN_SHARING = (1 << 4),
 } MetaExperimentalFeature;
 
 #define META_TYPE_SETTINGS (meta_settings_get_type ())
diff --git a/src/backends/meta-settings.c b/src/backends/meta-settings.c
index 1cc000e61..30d334f91 100644
--- a/src/backends/meta-settings.c
+++ b/src/backends/meta-settings.c
@@ -270,6 +270,8 @@ experimental_features_handler (GVariant *features_variant,
         feature = META_EXPERIMENTAL_FEATURE_RT_SCHEDULER;
       else if (g_str_equal (feature_str, "autostart-xwayland"))
         feature = META_EXPERIMENTAL_FEATURE_AUTOSTART_XWAYLAND;
+      else if (g_str_equal (feature_str, "dma-buf-screen-sharing"))
+        feature = META_EXPERIMENTAL_FEATURE_DMA_BUF_SCREEN_SHARING;
 
       if (feature)
         g_message ("Enabling experimental feature '%s'", feature_str);
diff --git a/src/backends/native/meta-backend-native.c b/src/backends/native/meta-backend-native.c
index 6961793cf..a534517ad 100644
--- a/src/backends/native/meta-backend-native.c
+++ b/src/backends/native/meta-backend-native.c
@@ -346,6 +346,7 @@ static void
 maybe_disable_screen_cast_dma_bufs (MetaBackendNative *native)
 {
   MetaBackend *backend = META_BACKEND (native);
+  MetaSettings *settings = meta_backend_get_settings (backend);
   MetaRenderer *renderer = meta_backend_get_renderer (backend);
   MetaRendererNative *renderer_native = META_RENDERER_NATIVE (renderer);
   MetaScreenCast *screen_cast = meta_backend_get_screen_cast (backend);
@@ -365,6 +366,10 @@ maybe_disable_screen_cast_dma_bufs (MetaBackendNative *native)
   if (g_strv_contains (enable_dma_buf_drivers, driver_name))
     return;
 
+  if (meta_settings_is_experimental_feature_enabled (settings,
+        META_EXPERIMENTAL_FEATURE_DMA_BUF_SCREEN_SHARING))
+    return;
+
   g_message ("Disabling DMA buffer screen sharing for driver '%s'.",
              driver_name);
 
-- 
2.28.0