diff --git a/0001-core-Remove-startup-sequences-after-timeout.patch b/0001-core-Remove-startup-sequences-after-timeout.patch new file mode 100644 index 0000000..3bd7580 --- /dev/null +++ b/0001-core-Remove-startup-sequences-after-timeout.patch @@ -0,0 +1,28 @@ +From 639be849cd80b38567f6abb0279bef59f17ac5ca Mon Sep 17 00:00:00 2001 +From: Carlos Garnacho +Date: Mon, 18 Mar 2019 11:59:26 +0100 +Subject: [PATCH 1/3] core: Remove startup sequences after timeout + +The complete/remove semantics were split to cater for presenting windows, +so we must now separately do both here. + +Related: https://gitlab.gnome.org/GNOME/mutter/issues/501 +--- + src/core/startup-notification.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/src/core/startup-notification.c b/src/core/startup-notification.c +index 8bcb0f385..d2d0d1362 100644 +--- a/src/core/startup-notification.c ++++ b/src/core/startup-notification.c +@@ -454,6 +454,7 @@ startup_sequence_timeout (void *data) + meta_startup_sequence_get_id (sequence)); + + meta_startup_sequence_complete (sequence); ++ meta_startup_notification_remove_sequence (sn, sequence); + } + + g_slist_free (ctod.list); +-- +2.21.0 + diff --git a/0002-renderer-native-Make-EGL-initialization-failure-not-.patch b/0002-renderer-native-Make-EGL-initialization-failure-not-.patch new file mode 100644 index 0000000..38c6a59 --- /dev/null +++ b/0002-renderer-native-Make-EGL-initialization-failure-not-.patch @@ -0,0 +1,130 @@ +From 1074040be3b89ffa7d6fb15a3c1ef35e141e15d1 Mon Sep 17 00:00:00 2001 +From: Pekka Paalanen +Date: Wed, 3 Apr 2019 13:11:45 +0300 +Subject: [PATCH 2/3] renderer/native: Make EGL initialization failure not + fatal + +The failure to initialize EGL does not necessarily mean the KMS device cannot +be used. The device could still be used as a "secondary GPU" with the CPU copy +mode. + +If meta_renderer_native_create_renderer_gpu_data () fails, +meta_renderer_native_get_gpu_data () will return NULL, which may cause crashes. +This patch removes most of the failures, but does not fix the NULL dereferences +that will still happen if creating gpu data fails. + +This patch reorders create_renderer_gpu_data_gbm () so that it fails hard only +if GBM device cannot be created, and otherwise always returns an initialized +gpu data structure. Users of the gpu data structure are responsible for +checking egl_display validity. + +The GBM device creation failure is a hard failure because presumably GBM is +necessary for cursors. + +Fixes: https://gitlab.gnome.org/GNOME/mutter/issues/542 +https://gitlab.gnome.org/GNOME/mutter/merge_requests/521 +--- + src/backends/native/meta-renderer-native.c | 62 ++++++++++++++-------- + 1 file changed, 40 insertions(+), 22 deletions(-) + +diff --git a/src/backends/native/meta-renderer-native.c b/src/backends/native/meta-renderer-native.c +index 771ca0872..c7483f3cd 100644 +--- a/src/backends/native/meta-renderer-native.c ++++ b/src/backends/native/meta-renderer-native.c +@@ -3698,16 +3698,13 @@ gpu_kms_is_hardware_rendering (MetaRendererNative *renderer_native, + return data->secondary.is_hardware_rendering; + } + +-static MetaRendererNativeGpuData * +-create_renderer_gpu_data_gbm (MetaRendererNative *renderer_native, +- MetaGpuKms *gpu_kms, +- GError **error) ++static EGLDisplay ++init_gbm_egl_display (MetaRendererNative *renderer_native, ++ struct gbm_device *gbm_device, ++ GError **error) + { + MetaEgl *egl = meta_renderer_native_get_egl (renderer_native); +- struct gbm_device *gbm_device; + EGLDisplay egl_display; +- int kms_fd; +- MetaRendererNativeGpuData *renderer_gpu_data; + + if (!meta_egl_has_extensions (egl, EGL_NO_DISPLAY, NULL, + "EGL_MESA_platform_gbm", +@@ -3719,9 +3716,31 @@ create_renderer_gpu_data_gbm (MetaRendererNative *renderer_native, + g_set_error (error, G_IO_ERROR, + G_IO_ERROR_FAILED, + "Missing extension for GBM renderer: EGL_KHR_platform_gbm"); +- return NULL; ++ return EGL_NO_DISPLAY; + } + ++ egl_display = meta_egl_get_platform_display (egl, ++ EGL_PLATFORM_GBM_KHR, ++ gbm_device, NULL, error); ++ if (egl_display == EGL_NO_DISPLAY) ++ return EGL_NO_DISPLAY; ++ ++ if (!meta_egl_initialize (egl, egl_display, error)) ++ return EGL_NO_DISPLAY; ++ ++ return egl_display; ++} ++ ++static MetaRendererNativeGpuData * ++create_renderer_gpu_data_gbm (MetaRendererNative *renderer_native, ++ MetaGpuKms *gpu_kms, ++ GError **error) ++{ ++ struct gbm_device *gbm_device; ++ int kms_fd; ++ MetaRendererNativeGpuData *renderer_gpu_data; ++ g_autoptr (GError) local_error = NULL; ++ + kms_fd = meta_gpu_kms_get_fd (gpu_kms); + + gbm_device = gbm_create_device (kms_fd); +@@ -3733,26 +3752,25 @@ create_renderer_gpu_data_gbm (MetaRendererNative *renderer_native, + return NULL; + } + +- egl_display = meta_egl_get_platform_display (egl, +- EGL_PLATFORM_GBM_KHR, +- gbm_device, NULL, error); +- if (egl_display == EGL_NO_DISPLAY) +- { +- gbm_device_destroy (gbm_device); +- return NULL; +- } +- +- if (!meta_egl_initialize (egl, egl_display, error)) +- return NULL; +- + renderer_gpu_data = meta_create_renderer_native_gpu_data (gpu_kms); + renderer_gpu_data->renderer_native = renderer_native; + renderer_gpu_data->gbm.device = gbm_device; + renderer_gpu_data->mode = META_RENDERER_NATIVE_MODE_GBM; +- renderer_gpu_data->egl_display = egl_display; + +- init_secondary_gpu_data (renderer_gpu_data); ++ renderer_gpu_data->egl_display = init_gbm_egl_display (renderer_native, ++ gbm_device, ++ &local_error); ++ if (renderer_gpu_data->egl_display == EGL_NO_DISPLAY) ++ { ++ g_debug ("GBM EGL init for %s failed: %s", ++ meta_gpu_kms_get_file_path (gpu_kms), ++ local_error->message); + ++ init_secondary_gpu_data_cpu (renderer_gpu_data); ++ return renderer_gpu_data; ++ } ++ ++ init_secondary_gpu_data (renderer_gpu_data); + return renderer_gpu_data; + } + +-- +2.21.0 + diff --git a/0003-wayland-output-Set-user-data-of-xdg_output-resource.patch b/0003-wayland-output-Set-user-data-of-xdg_output-resource.patch new file mode 100644 index 0000000..5c35304 --- /dev/null +++ b/0003-wayland-output-Set-user-data-of-xdg_output-resource.patch @@ -0,0 +1,59 @@ +From b09318fd75e1d4644381e7080105da18726bbdb9 Mon Sep 17 00:00:00 2001 +From: Olivier Fourdan +Date: Mon, 15 Apr 2019 14:55:45 +0200 +Subject: [PATCH 3/3] wayland/output: Set user data of xdg_output resource + +mutter would randomly crash in `send_xdg_output_events()` when changing +the fractional scaling: + + wl_resource_post_event () + zxdg_output_v1_send_logical_size () + send_xdg_output_events () + wayland_output_update_for_output () + meta_wayland_compositor_update_outputs () + on_monitors_changed () + g_closure_invoke () + signal_emit_unlocked_R () + g_signal_emit_valist () + _signal_emit () + meta_monitor_manager_notify_monitors_changed () + meta_monitor_manager_rebuild () + +This is because the xdg-output resource got freed but wasn't removed +from the list of resources. + +Fix this by setting the user data of the xdg-output resource to the +corresponding `MetaWaylandOutput` so that the xdg-output resource +destructor can remove it from the list of resources. + +https://gitlab.gnome.org/GNOME/mutter/merge_requests/538 +--- + src/wayland/meta-wayland-outputs.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +diff --git a/src/wayland/meta-wayland-outputs.c b/src/wayland/meta-wayland-outputs.c +index 7695d86af..099e87ab9 100644 +--- a/src/wayland/meta-wayland-outputs.c ++++ b/src/wayland/meta-wayland-outputs.c +@@ -624,14 +624,14 @@ meta_xdg_output_manager_get_xdg_output (struct wl_client *client, + wl_resource_get_version (resource), + id); + +- wl_resource_set_implementation (xdg_output_resource, +- &meta_xdg_output_interface, +- NULL, meta_xdg_output_destructor); +- + wayland_output = wl_resource_get_user_data (output); + if (!wayland_output) + return; + ++ wl_resource_set_implementation (xdg_output_resource, ++ &meta_xdg_output_interface, ++ wayland_output, meta_xdg_output_destructor); ++ + wayland_output->xdg_output_resources = + g_list_prepend (wayland_output->xdg_output_resources, xdg_output_resource); + +-- +2.21.0 + diff --git a/mutter.spec b/mutter.spec index 1818d0e..12b7210 100644 --- a/mutter.spec +++ b/mutter.spec @@ -25,6 +25,18 @@ Patch1: 0001-build-Don-t-use-absolute-paths-with-subdir-keyword.patch # Backport work-around for hangul text input bug (rhbz#1632981) Patch2: 0001-wayland-Defer-text_input.done-on-an-idle.patch +# https://gitlab.gnome.org/GNOME/mutter/merge_requests/498 fixes +# https://gitlab.gnome.org/GNOME/mutter/issues/501 / +# https://bugzilla.redhat.com/show_bug.cgi?id=1692135 +Patch3: 0001-core-Remove-startup-sequences-after-timeout.patch + +# https://gitlab.gnome.org/GNOME/mutter/merge_requests/521 fixes +# https://gitlab.gnome.org/GNOME/mutter/issues/542 (crasher) +Patch4: 0002-renderer-native-Make-EGL-initialization-failure-not-.patch + +# https://gitlab.gnome.org/GNOME/mutter/merge_requests/538 (crash fix) +Patch5: 0003-wayland-output-Set-user-data-of-xdg_output-resource.patch + BuildRequires: chrpath BuildRequires: pango-devel BuildRequires: startup-notification-devel @@ -166,6 +178,10 @@ desktop-file-validate %{buildroot}/%{_datadir}/applications/%{name}.desktop %{_datadir}/mutter-%{mutter_api_version}/tests %changelog +* Wed Apr 17 2019 Adam Williamson - 3.32.0-4 +- Backport MR #498 for spinner bug, plus two crasher fixes + Resolves: #1692135 + * Tue Apr 16 2019 Adam Williamson - 3.32.0-3 - Rebuild with Meson fix for #1699099