diff options
Diffstat (limited to 'third_party/libwebrtc/moz-patch-stack/0074.patch')
-rw-r--r-- | third_party/libwebrtc/moz-patch-stack/0074.patch | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/third_party/libwebrtc/moz-patch-stack/0074.patch b/third_party/libwebrtc/moz-patch-stack/0074.patch new file mode 100644 index 0000000000..92dd895153 --- /dev/null +++ b/third_party/libwebrtc/moz-patch-stack/0074.patch @@ -0,0 +1,74 @@ +From: Jan Grulich <jgrulich@redhat.com> +Date: Fri, 10 Mar 2023 09:21:00 +0000 +Subject: Bug 1819035 - get EGL display based on the used platform in the + browser r=webrtc-reviewers,ng + +Because of a possible misconfiguration or a possible driver issue it +might happen that the browser will use a different driver on X11 and +end up using yet another one for wayland/gbm, which might lead to not +working screen sharing in the better case, but also to a crash in the +other driver (Nvidia). This adds a check for platform the browser runs +on, if it's XWayland or Wayland and based on that query EGL display for +that specific platform, rather than going for the Wayland one only. + +Differential Revision: https://phabricator.services.mozilla.com/D171858 +Mercurial Revision: https://hg.mozilla.org/mozilla-central/rev/c8606497de1f461a6352456e0e511c2ae498d526 +--- + .../linux/wayland/egl_dmabuf.cc | 30 +++++++++++++++++-- + 1 file changed, 28 insertions(+), 2 deletions(-) + +diff --git a/modules/desktop_capture/linux/wayland/egl_dmabuf.cc b/modules/desktop_capture/linux/wayland/egl_dmabuf.cc +index b529077c6d..6a019c64b4 100644 +--- a/modules/desktop_capture/linux/wayland/egl_dmabuf.cc ++++ b/modules/desktop_capture/linux/wayland/egl_dmabuf.cc +@@ -13,6 +13,7 @@ + #include <asm/ioctl.h> + #include <dlfcn.h> + #include <fcntl.h> ++#include <gdk/gdk.h> + #include <libdrm/drm_fourcc.h> + #include <linux/types.h> + #include <spa/param/video/format-utils.h> +@@ -217,6 +218,26 @@ static void CloseLibrary(void* library) { + } + } + ++static bool IsWaylandDisplay() { ++ static auto sGdkWaylandDisplayGetType = ++ (GType (*)(void))dlsym(RTLD_DEFAULT, "gdk_wayland_display_get_type"); ++ if (!sGdkWaylandDisplayGetType) { ++ return false; ++ } ++ return (G_TYPE_CHECK_INSTANCE_TYPE ((gdk_display_get_default()), ++ sGdkWaylandDisplayGetType())); ++} ++ ++static bool IsX11Display() { ++ static auto sGdkX11DisplayGetType = ++ (GType (*)(void))dlsym(RTLD_DEFAULT, "gdk_x11_display_get_type"); ++ if (!sGdkX11DisplayGetType) { ++ return false; ++ } ++ return (G_TYPE_CHECK_INSTANCE_TYPE ((gdk_display_get_default()), ++ sGdkX11DisplayGetType())); ++} ++ + static void* g_lib_egl = nullptr; + + RTC_NO_SANITIZE("cfi-icall") +@@ -362,8 +383,13 @@ EglDmaBuf::EglDmaBuf() { + return; + } + +- egl_.display = EglGetPlatformDisplay(EGL_PLATFORM_WAYLAND_KHR, +- (void*)EGL_DEFAULT_DISPLAY, nullptr); ++ if (IsWaylandDisplay()) { ++ egl_.display = EglGetPlatformDisplay(EGL_PLATFORM_WAYLAND_KHR, ++ (void*)EGL_DEFAULT_DISPLAY, nullptr); ++ } else if (IsX11Display()) { ++ egl_.display = EglGetPlatformDisplay(EGL_PLATFORM_X11_KHR, ++ (void*)EGL_DEFAULT_DISPLAY, nullptr); ++ } + + if (egl_.display == EGL_NO_DISPLAY) { + RTC_LOG(LS_ERROR) << "Failed to obtain default EGL display: " |