From 74a6d0328a5dfd3be453d7192c931a6ea81f7bd6 Mon Sep 17 00:00:00 2001
From: obarun <eric@obarun.org>
Date: Sat, 2 Jun 2018 19:21:06 +1100
Subject: [PATCH] upgrel : 1.20.0-6

---
 PKGBUILD                                      | 10 ++++++-
 ...from-glamor_fds_from_pixmap-on-error.patch | 28 ++++++++++++++++++
 ...ixmap-error-in-glamor_fd_from_pixmap.patch | 29 +++++++++++++++++++
 3 files changed, 66 insertions(+), 1 deletion(-)
 create mode 100644 xserver-1-2-glamor-Always-return-0-from-glamor_fds_from_pixmap-on-error.patch
 create mode 100644 xserver-2-2-glamor-Propagate-glamor_fds_from_pixmap-error-in-glamor_fd_from_pixmap.patch

diff --git a/PKGBUILD b/PKGBUILD
index ad6dd8f..d90328e 100644
--- a/PKGBUILD
+++ b/PKGBUILD
@@ -7,7 +7,7 @@ pkgbase=xorg-server
 pkgname=('xorg-server' 'xorg-server-xephyr' 'xorg-server-xdmx' 'xorg-server-xvfb' 'xorg-server-xnest' 
          'xorg-server-xwayland' 'xorg-server-common' 'xorg-server-devel')
 pkgver=1.20.0
-pkgrel=5
+pkgrel=6
 arch=('x86_64')
 license=('custom')
 groups=('xorg')
@@ -26,6 +26,8 @@ source=(https://xorg.freedesktop.org/releases/individual/xserver/${pkgbase}-${pk
         xserver-autobind-hotplug.patch
         xvfb-run # with updates from FC master
         xvfb-run.1
+        xserver-1-2-glamor-Always-return-0-from-glamor_fds_from_pixmap-on-error.patch
+        xserver-2-2-glamor-Propagate-glamor_fds_from_pixmap-error-in-glamor_fd_from_pixmap.patch
         0001-v2-FS-58644.patch)
 validpgpkeys=('7B27A3F1A6E18CD9588B4AE8310180050905E40C'
               'C383B778255613DFDB409D91DB221A6900000011'
@@ -49,6 +51,12 @@ prepare() {
   
   # https://bugs.freedesktop.org/show_bug.cgi?id=106588
   patch -Np1 -i ../0001-v2-FS-58644.patch
+  
+  # Fix XWayland hangs - FS#58705
+  # https://patchwork.freedesktop.org/series/43618/
+  patch -Np1 -i ../xserver-1-2-glamor-Always-return-0-from-glamor_fds_from_pixmap-on-error.patch
+  patch -Np1 -i ../xserver-2-2-glamor-Propagate-glamor_fds_from_pixmap-error-in-glamor_fd_from_pixmap.patch
+
 }
 
 build() {
diff --git a/xserver-1-2-glamor-Always-return-0-from-glamor_fds_from_pixmap-on-error.patch b/xserver-1-2-glamor-Always-return-0-from-glamor_fds_from_pixmap-on-error.patch
new file mode 100644
index 0000000..604af0f
--- /dev/null
+++ b/xserver-1-2-glamor-Always-return-0-from-glamor_fds_from_pixmap-on-error.patch
@@ -0,0 +1,28 @@
+diff --git a/glamor/glamor.c b/glamor/glamor.c
+index d984d20f3..e2c74d17a 100644
+--- a/glamor/glamor.c
++++ b/glamor/glamor.c
+@@ -836,20 +836,20 @@ glamor_fds_from_pixmap(ScreenPtr screen, PixmapPtr pixmap, int *fds,
+         glamor_get_screen_private(pixmap->drawable.pScreen);
+ 
+     if (!glamor_priv->dri3_enabled)
+-        return -1;
++        return 0;
+     switch (pixmap_priv->type) {
+     case GLAMOR_TEXTURE_DRM:
+     case GLAMOR_TEXTURE_ONLY:
+         if (!glamor_pixmap_ensure_fbo(pixmap, pixmap->drawable.depth == 30 ?
+                                       GL_RGB10_A2 : GL_RGBA, 0))
+-            return -1;
++            return 0;
+         return glamor_egl_fds_from_pixmap(screen, pixmap, fds,
+                                           strides, offsets,
+                                           modifier);
+     default:
+         break;
+     }
+-    return -1;
++    return 0;
+ }
+ 
+ _X_EXPORT int
diff --git a/xserver-2-2-glamor-Propagate-glamor_fds_from_pixmap-error-in-glamor_fd_from_pixmap.patch b/xserver-2-2-glamor-Propagate-glamor_fds_from_pixmap-error-in-glamor_fd_from_pixmap.patch
new file mode 100644
index 0000000..beea2e4
--- /dev/null
+++ b/xserver-2-2-glamor-Propagate-glamor_fds_from_pixmap-error-in-glamor_fd_from_pixmap.patch
@@ -0,0 +1,29 @@
+diff --git a/glamor/glamor.c b/glamor/glamor.c
+index e2c74d17a..63f0947fa 100644
+--- a/glamor/glamor.c
++++ b/glamor/glamor.c
+@@ -865,17 +865,15 @@ glamor_fd_from_pixmap(ScreenPtr screen,
+                                  &modifier);
+ 
+     /* Pixmaps with multi-planes/modifier are not supported in this interface */
+-    if (ret > 1) {
+-        while (ret > 0)
+-            close(fds[--ret]);
+-        return -1;
++    if (ret == 1 && offsets[0] == 0) {
++        *stride = strides[0];
++        *size = pixmap->drawable.height * *stride;
++        return fds[0];
+     }
+ 
+-    ret = fds[0];
+-    *stride = strides[0];
+-    *size = pixmap->drawable.height * *stride;
+-
+-    return ret;
++    while (ret > 0)
++        close(fds[--ret]);
++    return -1;
+ }
+ 
+ _X_EXPORT int
-- 
GitLab