diff --git a/0001-Revert-linux-Fix-platform-device-probe-for-DT-based-.patch b/0001-Revert-linux-Fix-platform-device-probe-for-DT-based-.patch new file mode 100644 index 0000000..adeb9bd --- /dev/null +++ b/0001-Revert-linux-Fix-platform-device-probe-for-DT-based-.patch @@ -0,0 +1,61 @@ +From 4b6fce5975c2f931a0478cf4deeec97529b05eb6 Mon Sep 17 00:00:00 2001 +From: Olivier Fourdan +Date: Tue, 8 Sep 2020 10:01:55 +0200 +Subject: [PATCH xserver 01/16] Revert "linux: Fix platform device probe for + DT-based PCI" + +This reverts commit 249a12c54a9316b089bd22683c011519348496df. + +https://gitlab.freedesktop.org/xorg/xserver/-/issues/1068 +--- + config/udev.c | 27 +-------------------------- + 1 file changed, 1 insertion(+), 26 deletions(-) + +diff --git a/config/udev.c b/config/udev.c +index b00d90237..14409549b 100644 +--- a/config/udev.c ++++ b/config/udev.c +@@ -464,31 +464,6 @@ config_udev_fini(void) + + #ifdef CONFIG_UDEV_KMS + +-/* Find the last occurrence of the needle in haystack */ +-static char *strrstr(const char *haystack, const char *needle) +-{ +- char *prev, *last, *tmp; +- +- prev = strstr(haystack, needle); +- if (!prev) +- return NULL; +- +- last = prev; +- tmp = prev + 1; +- +- while (tmp) { +- last = strstr(tmp, needle); +- if (!last) +- return prev; +- else { +- prev = last; +- tmp = prev + 1; +- } +- } +- +- return last; +-} +- + static void + config_udev_odev_setup_attribs(struct udev_device *udev_device, const char *path, const char *syspath, + int major, int minor, +@@ -503,7 +478,7 @@ config_udev_odev_setup_attribs(struct udev_device *udev_device, const char *path + attribs->minor = minor; + + value = udev_device_get_property_value(udev_device, "ID_PATH"); +- if (value && (str = strrstr(value, "pci-"))) { ++ if (value && (str = strstr(value, "pci-"))) { + attribs->busid = XNFstrdup(str); + attribs->busid[3] = ':'; + } +-- +2.28.0 + diff --git a/0001-dix-Add-GetCurrentClient-helper.patch b/0001-dix-Add-GetCurrentClient-helper.patch index d241c0e..95f4e4d 100644 --- a/0001-dix-Add-GetCurrentClient-helper.patch +++ b/0001-dix-Add-GetCurrentClient-helper.patch @@ -1,4 +1,4 @@ -From e78e96157efb523272404a85a9433c7b9803c1db Mon Sep 17 00:00:00 2001 +From 3d78af269556f554c517801d0de481ba56d4e603 Mon Sep 17 00:00:00 2001 From: Hans de Goede Date: Thu, 29 Aug 2019 14:18:28 +0200 Subject: [PATCH xserver 01/24] dix: Add GetCurrentClient helper @@ -112,5 +112,5 @@ index b6e2bcfde..d65060cb6 100644 extern _X_EXPORT void SetInputCheck(HWEventQueuePtr /*c0 */ , HWEventQueuePtr /*c1 */ ); -- -2.25.2 +2.26.2 diff --git a/0001-fix-for-ZDI-11426.patch b/0001-fix-for-ZDI-11426.patch deleted file mode 100644 index 9857e0d..0000000 --- a/0001-fix-for-ZDI-11426.patch +++ /dev/null @@ -1,33 +0,0 @@ -From aac28e162e5108510065ad4c323affd6deffd816 Mon Sep 17 00:00:00 2001 -From: Matthieu Herrb -Date: Sat, 25 Jul 2020 19:33:50 +0200 -Subject: [PATCH xserver] fix for ZDI-11426 - -Avoid leaking un-initalized memory to clients by zeroing the -whole pixmap on initial allocation. - -This vulnerability was discovered by: -Jan-Niklas Sohn working with Trend Micro Zero Day Initiative - -Signed-off-by: Matthieu Herrb -Reviewed-by: Alan Coopersmith ---- - dix/pixmap.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/dix/pixmap.c b/dix/pixmap.c -index 1186d7dbbf..5a0146bbb6 100644 ---- a/dix/pixmap.c -+++ b/dix/pixmap.c -@@ -116,7 +116,7 @@ AllocatePixmap(ScreenPtr pScreen, int pixDataSize) - if (pScreen->totalPixmapSize > ((size_t) - 1) - pixDataSize) - return NullPixmap; - -- pPixmap = malloc(pScreen->totalPixmapSize + pixDataSize); -+ pPixmap = calloc(1, pScreen->totalPixmapSize + pixDataSize); - if (!pPixmap) - return NullPixmap; - --- -2.23.0 - diff --git a/0002-Revert-linux-Fix-platform-device-PCI-detection-for-c.patch b/0002-Revert-linux-Fix-platform-device-PCI-detection-for-c.patch new file mode 100644 index 0000000..79a5fff --- /dev/null +++ b/0002-Revert-linux-Fix-platform-device-PCI-detection-for-c.patch @@ -0,0 +1,40 @@ +From 39cb95e959fab97a7e255dda1a1599b096fb0f7e Mon Sep 17 00:00:00 2001 +From: Olivier Fourdan +Date: Tue, 8 Sep 2020 10:03:11 +0200 +Subject: [PATCH xserver 02/16] Revert "linux: Fix platform device PCI + detection for complex bus topologies" + +This reverts commit 5c96eb5f44e62a4cfe835023cde304eb5795b8fd. + +https://gitlab.freedesktop.org/xorg/xserver/-/issues/1068 +--- + config/udev.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/config/udev.c b/config/udev.c +index 14409549b..8c6c4b666 100644 +--- a/config/udev.c ++++ b/config/udev.c +@@ -470,7 +470,7 @@ config_udev_odev_setup_attribs(struct udev_device *udev_device, const char *path + config_odev_probe_proc_ptr probe_callback) + { + struct OdevAttributes *attribs = config_odev_allocate_attributes(); +- const char *value, *str; ++ const char *value; + + attribs->path = XNFstrdup(path); + attribs->syspath = XNFstrdup(syspath); +@@ -478,8 +478,8 @@ config_udev_odev_setup_attribs(struct udev_device *udev_device, const char *path + attribs->minor = minor; + + value = udev_device_get_property_value(udev_device, "ID_PATH"); +- if (value && (str = strstr(value, "pci-"))) { +- attribs->busid = XNFstrdup(str); ++ if (value && !strncmp(value, "pci-", 4)) { ++ attribs->busid = XNFstrdup(value); + attribs->busid[3] = ':'; + } + +-- +2.28.0 + diff --git a/0002-xwayland-Add-wp_viewport-wayland-extension-support.patch b/0002-xwayland-Add-wp_viewport-wayland-extension-support.patch index 441bf4c..894f273 100644 --- a/0002-xwayland-Add-wp_viewport-wayland-extension-support.patch +++ b/0002-xwayland-Add-wp_viewport-wayland-extension-support.patch @@ -1,4 +1,4 @@ -From c0981af6a683266e3f2adfdd7d6539104f502233 Mon Sep 17 00:00:00 2001 +From 14e9b030449611a7a80f640129138c49ab46774e Mon Sep 17 00:00:00 2001 From: Robert Mader Date: Mon, 22 Jan 2018 22:02:32 +0100 Subject: [PATCH xserver 02/24] xwayland: Add wp_viewport wayland extension @@ -81,10 +81,10 @@ index 36bf2133a..4a8d171bb 100644 xwayland_glamor = [] eglstream_srcs = [] diff --git a/hw/xwayland/xwayland.c b/hw/xwayland/xwayland.c -index ed9f2e3c2..2084f2afb 100644 +index d02934cd5..98592025a 100644 --- a/hw/xwayland/xwayland.c +++ b/hw/xwayland/xwayland.c -@@ -923,6 +923,9 @@ registry_global(void *data, struct wl_registry *registry, uint32_t id, +@@ -925,6 +925,9 @@ registry_global(void *data, struct wl_registry *registry, uint32_t id, wl_registry_bind(registry, id, &zxdg_output_manager_v1_interface, 1); xwl_screen_init_xdg_output(xwl_screen); } @@ -95,7 +95,7 @@ index ed9f2e3c2..2084f2afb 100644 else if (xwl_screen->glamor) { xwl_glamor_init_wl_registry(xwl_screen, registry, id, interface, diff --git a/hw/xwayland/xwayland.h b/hw/xwayland/xwayland.h -index daa719209..f949ea157 100644 +index b9495b313..91ae21eeb 100644 --- a/hw/xwayland/xwayland.h +++ b/hw/xwayland/xwayland.h @@ -48,6 +48,7 @@ @@ -115,5 +115,5 @@ index daa719209..f949ea157 100644 #define XWL_FORMAT_ARGB8888 (1 << 0) -- -2.25.2 +2.26.2 diff --git a/0003-Revert-linux-Make-platform-device-probe-less-fragile.patch b/0003-Revert-linux-Make-platform-device-probe-less-fragile.patch new file mode 100644 index 0000000..e3d2d8d --- /dev/null +++ b/0003-Revert-linux-Make-platform-device-probe-less-fragile.patch @@ -0,0 +1,133 @@ +From af4c84ce8855e84c0ad89b929bc972e884f0b8e3 Mon Sep 17 00:00:00 2001 +From: Olivier Fourdan +Date: Tue, 8 Sep 2020 10:03:33 +0200 +Subject: [PATCH xserver 03/16] Revert "linux: Make platform device probe less + fragile" + +This reverts commit 74b7427c41b4e4104af7abf70a996c086d3d7628. + +https://gitlab.freedesktop.org/xorg/xserver/-/issues/1068 +--- + config/udev.c | 17 +++++------------ + hw/xfree86/os-support/linux/lnx_platform.c | 20 ++++++++++++++++++-- + 2 files changed, 23 insertions(+), 14 deletions(-) + +diff --git a/config/udev.c b/config/udev.c +index 8c6c4b666..3a73189e2 100644 +--- a/config/udev.c ++++ b/config/udev.c +@@ -56,7 +56,7 @@ static struct udev_monitor *udev_monitor; + + #ifdef CONFIG_UDEV_KMS + static void +-config_udev_odev_setup_attribs(struct udev_device *udev_device, const char *path, const char *syspath, ++config_udev_odev_setup_attribs(const char *path, const char *syspath, + int major, int minor, + config_odev_probe_proc_ptr probe_callback); + #endif +@@ -128,7 +128,7 @@ device_added(struct udev_device *udev_device) + + LogMessage(X_INFO, "config/udev: Adding drm device (%s)\n", path); + +- config_udev_odev_setup_attribs(udev_device, path, syspath, major(devnum), ++ config_udev_odev_setup_attribs(path, syspath, major(devnum), + minor(devnum), NewGPUDeviceRequest); + return; + } +@@ -322,7 +322,7 @@ device_removed(struct udev_device *device) + + LogMessage(X_INFO, "config/udev: removing GPU device %s %s\n", + syspath, path); +- config_udev_odev_setup_attribs(device, path, syspath, major(devnum), ++ config_udev_odev_setup_attribs(path, syspath, major(devnum), + minor(devnum), DeleteGPUDeviceRequest); + /* Retry vtenter after a drm node removal */ + systemd_logind_vtenter(); +@@ -465,24 +465,17 @@ config_udev_fini(void) + #ifdef CONFIG_UDEV_KMS + + static void +-config_udev_odev_setup_attribs(struct udev_device *udev_device, const char *path, const char *syspath, ++config_udev_odev_setup_attribs(const char *path, const char *syspath, + int major, int minor, + config_odev_probe_proc_ptr probe_callback) + { + struct OdevAttributes *attribs = config_odev_allocate_attributes(); +- const char *value; + + attribs->path = XNFstrdup(path); + attribs->syspath = XNFstrdup(syspath); + attribs->major = major; + attribs->minor = minor; + +- value = udev_device_get_property_value(udev_device, "ID_PATH"); +- if (value && !strncmp(value, "pci-", 4)) { +- attribs->busid = XNFstrdup(value); +- attribs->busid[3] = ':'; +- } +- + /* ownership of attribs is passed to probe layer */ + probe_callback(attribs); + } +@@ -523,7 +516,7 @@ config_udev_odev_probe(config_odev_probe_proc_ptr probe_callback) + else if (!check_seat(udev_device)) + goto no_probe; + +- config_udev_odev_setup_attribs(udev_device, path, syspath, major(devnum), ++ config_udev_odev_setup_attribs(path, syspath, major(devnum), + minor(devnum), probe_callback); + no_probe: + udev_device_unref(udev_device); +diff --git a/hw/xfree86/os-support/linux/lnx_platform.c b/hw/xfree86/os-support/linux/lnx_platform.c +index e62306219..70374ace8 100644 +--- a/hw/xfree86/os-support/linux/lnx_platform.c ++++ b/hw/xfree86/os-support/linux/lnx_platform.c +@@ -23,13 +23,13 @@ + static Bool + get_drm_info(struct OdevAttributes *attribs, char *path, int delayed_index) + { ++ drmSetVersion sv; + drmVersionPtr v; ++ char *buf; + int fd; + int err = 0; + Bool paused, server_fd = FALSE; + +- LogMessage(X_INFO, "Platform probe for %s\n", attribs->syspath); +- + fd = systemd_logind_take_fd(attribs->major, attribs->minor, path, &paused); + if (fd != -1) { + if (paused) { +@@ -48,6 +48,18 @@ get_drm_info(struct OdevAttributes *attribs, char *path, int delayed_index) + if (fd == -1) + return FALSE; + ++ sv.drm_di_major = 1; ++ sv.drm_di_minor = 4; ++ sv.drm_dd_major = -1; /* Don't care */ ++ sv.drm_dd_minor = -1; /* Don't care */ ++ ++ err = drmSetInterfaceVersion(fd, &sv); ++ if (err) { ++ xf86Msg(X_ERROR, "%s: failed to set DRM interface version 1.4: %s\n", ++ path, strerror(-err)); ++ goto out; ++ } ++ + /* for a delayed probe we've already added the device */ + if (delayed_index == -1) { + xf86_add_platform_device(attribs, FALSE); +@@ -57,6 +69,10 @@ get_drm_info(struct OdevAttributes *attribs, char *path, int delayed_index) + if (server_fd) + xf86_platform_devices[delayed_index].flags |= XF86_PDEV_SERVER_FD; + ++ buf = drmGetBusid(fd); ++ xf86_platform_odev_attributes(delayed_index)->busid = XNFstrdup(buf); ++ drmFreeBusid(buf); ++ + v = drmGetVersion(fd); + if (!v) { + xf86Msg(X_ERROR, "%s: failed to query DRM version\n", path); +-- +2.28.0 + diff --git a/0003-xwayland-Use-buffer_damage-instead-of-surface-damage.patch b/0003-xwayland-Use-buffer_damage-instead-of-surface-damage.patch index acd1a06..8d925c2 100644 --- a/0003-xwayland-Use-buffer_damage-instead-of-surface-damage.patch +++ b/0003-xwayland-Use-buffer_damage-instead-of-surface-damage.patch @@ -1,4 +1,4 @@ -From ce5eef7d33d7ba37cabee6b2bb020ed62abe6208 Mon Sep 17 00:00:00 2001 +From a86c70ed7e9c2b4e8e2f93beddbc51c0cdad57f2 Mon Sep 17 00:00:00 2001 From: Robert Mader Date: Tue, 2 Jul 2019 12:03:12 +0200 Subject: [PATCH xserver 03/24] xwayland: Use buffer_damage instead of surface @@ -28,10 +28,10 @@ Signed-off-by: Hans de Goede (cherry picked from commit 7c6f17790d3aedb164481264b0f05a8a14103731) --- hw/xwayland/xwayland-cursor.c | 12 ++++++------ - hw/xwayland/xwayland-present.c | 6 +++--- + hw/xwayland/xwayland-present.c | 10 +++++----- hw/xwayland/xwayland.c | 29 +++++++++++++++++++++++------ hw/xwayland/xwayland.h | 3 +++ - 4 files changed, 35 insertions(+), 15 deletions(-) + 4 files changed, 37 insertions(+), 17 deletions(-) diff --git a/hw/xwayland/xwayland-cursor.c b/hw/xwayland/xwayland-cursor.c index 66720bcc0..cbc715061 100644 @@ -64,27 +64,31 @@ index 66720bcc0..cbc715061 100644 xwl_cursor->frame_cb = wl_surface_frame(xwl_cursor->surface); wl_callback_add_listener(xwl_cursor->frame_cb, &frame_listener, xwl_cursor); diff --git a/hw/xwayland/xwayland-present.c b/hw/xwayland/xwayland-present.c -index 5ba7dce08..58c32941d 100644 +index 6076f6498..ef75ad2ef 100644 --- a/hw/xwayland/xwayland-present.c +++ b/hw/xwayland/xwayland-present.c -@@ -495,9 +495,9 @@ xwl_present_flip(WindowPtr present_window, +@@ -497,11 +497,11 @@ xwl_present_flip(WindowPtr present_window, /* Realign timer */ xwl_present_reset_timer(xwl_present_window); -- wl_surface_damage(xwl_window->surface, 0, 0, +- wl_surface_damage(xwl_window->surface, +- damage_box->x1 - present_window->drawable.x, +- damage_box->y1 - present_window->drawable.y, - damage_box->x2 - damage_box->x1, - damage_box->y2 - damage_box->y1); -+ xwl_surface_damage(xwl_window->xwl_screen, xwl_window->surface, 0, 0, ++ xwl_surface_damage(xwl_window->xwl_screen, xwl_window->surface, ++ damage_box->x1 - present_window->drawable.x, ++ damage_box->y1 - present_window->drawable.y, + damage_box->x2 - damage_box->x1, + damage_box->y2 - damage_box->y1); wl_surface_commit(xwl_window->surface); diff --git a/hw/xwayland/xwayland.c b/hw/xwayland/xwayland.c -index 2084f2afb..942981834 100644 +index 98592025a..f7fcd1e32 100644 --- a/hw/xwayland/xwayland.c +++ b/hw/xwayland/xwayland.c -@@ -803,6 +803,16 @@ xwl_destroy_window(WindowPtr window) +@@ -805,6 +805,16 @@ xwl_destroy_window(WindowPtr window) return ret; } @@ -101,7 +105,7 @@ index 2084f2afb..942981834 100644 static void xwl_window_post_damage(struct xwl_window *xwl_window) { -@@ -839,13 +849,15 @@ xwl_window_post_damage(struct xwl_window *xwl_window) +@@ -841,13 +851,15 @@ xwl_window_post_damage(struct xwl_window *xwl_window) */ if (RegionNumRects(region) > 256) { box = RegionExtents(region); @@ -122,7 +126,7 @@ index 2084f2afb..942981834 100644 } xwl_window_create_frame_callback(xwl_window); -@@ -904,8 +916,13 @@ registry_global(void *data, struct wl_registry *registry, uint32_t id, +@@ -906,8 +918,13 @@ registry_global(void *data, struct wl_registry *registry, uint32_t id, struct xwl_screen *xwl_screen = data; if (strcmp(interface, "wl_compositor") == 0) { @@ -138,7 +142,7 @@ index 2084f2afb..942981834 100644 else if (strcmp(interface, "wl_shm") == 0) { xwl_screen->shm = wl_registry_bind(registry, id, &wl_shm_interface, 1); diff --git a/hw/xwayland/xwayland.h b/hw/xwayland/xwayland.h -index f949ea157..fa78b5ab9 100644 +index 91ae21eeb..1244d2e91 100644 --- a/hw/xwayland/xwayland.h +++ b/hw/xwayland/xwayland.h @@ -382,6 +382,9 @@ struct xwl_output { @@ -149,8 +153,8 @@ index f949ea157..fa78b5ab9 100644 + struct wl_surface *surface, + int32_t x, int32_t y, int32_t width, int32_t height); - Bool xwl_screen_init_cursor(struct xwl_screen *xwl_screen); + void xwl_screen_roundtrip (struct xwl_screen *xwl_screen); -- -2.25.2 +2.26.2 diff --git a/0004-include-Increase-the-number-of-max.-input-devices-to.patch b/0004-include-Increase-the-number-of-max.-input-devices-to.patch new file mode 100644 index 0000000..579afbf --- /dev/null +++ b/0004-include-Increase-the-number-of-max.-input-devices-to.patch @@ -0,0 +1,35 @@ +From b28c882889cbea9be3748d3dee1b21ba6eb90b66 Mon Sep 17 00:00:00 2001 +From: Arthur Williams +Date: Fri, 25 Sep 2020 04:52:57 +0000 +Subject: [PATCH xserver 04/16] include: Increase the number of max. input + devices to 256. + +Extending the decade old f0124ed93, to increase the number of input +devices from 40 to 256. 40 translates at most 9 MD, while 256 will allow +63 MD. It is an arbitrary number, but people are hitting the current +limit under reasonable conditions. + +Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=64793 +Signed-off-by: Arthur Williams + +(cherry picked from commit fe439596b99db65bbae35eff1ea0b79db167f8d6) +--- + include/misc.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/include/misc.h b/include/misc.h +index 14920c3c3..9b422e53b 100644 +--- a/include/misc.h ++++ b/include/misc.h +@@ -91,7 +91,7 @@ OF THIS SOFTWARE. + #define LIMITCLIENTS 256 /* Must be a power of 2 and <= MAXCLIENTS */ + #define MAXEXTENSIONS 128 + #define MAXFORMATS 8 +-#define MAXDEVICES 40 /* input devices */ ++#define MAXDEVICES 256 /* input devices */ + #define GPU_SCREEN_OFFSET 256 + + /* 128 event opcodes for core + extension events, excluding GE */ +-- +2.28.0 + diff --git a/0004-xwayland-Add-fake-output-modes-to-xrandr-output-mode.patch b/0004-xwayland-Add-fake-output-modes-to-xrandr-output-mode.patch index 4e05547..86dde42 100644 --- a/0004-xwayland-Add-fake-output-modes-to-xrandr-output-mode.patch +++ b/0004-xwayland-Add-fake-output-modes-to-xrandr-output-mode.patch @@ -1,4 +1,4 @@ -From 6ff9bf9f005ce81b587d3b4345232c73fc12da53 Mon Sep 17 00:00:00 2001 +From c0595515c65571d6304530c51331013381eea1dd Mon Sep 17 00:00:00 2001 From: Hans de Goede Date: Wed, 26 Jun 2019 16:46:54 +0200 Subject: [PATCH xserver 04/24] xwayland: Add fake output modes to xrandr @@ -25,10 +25,10 @@ Signed-off-by: Hans de Goede 3 files changed, 124 insertions(+), 6 deletions(-) diff --git a/hw/xwayland/xwayland-output.c b/hw/xwayland/xwayland-output.c -index aa6f37864..2ccc3ca60 100644 +index ae646c663..4036ba681 100644 --- a/hw/xwayland/xwayland-output.c +++ b/hw/xwayland/xwayland-output.c -@@ -245,14 +245,110 @@ update_screen_size(struct xwl_output *xwl_output, int width, int height) +@@ -208,14 +208,110 @@ update_screen_size(struct xwl_output *xwl_output, int width, int height) update_desktop_dimensions(); } @@ -141,7 +141,7 @@ index aa6f37864..2ccc3ca60 100644 Bool need_rotate; /* Clear out the "done" received flags */ -@@ -271,12 +367,16 @@ apply_output_change(struct xwl_output *xwl_output) +@@ -234,12 +330,16 @@ apply_output_change(struct xwl_output *xwl_output) mode_height = xwl_output->width; } @@ -163,10 +163,10 @@ index aa6f37864..2ccc3ca60 100644 xorg_list_for_each_entry(it, &xwl_screen->output_list, link) { /* output done event is sent even when some property diff --git a/hw/xwayland/xwayland.c b/hw/xwayland/xwayland.c -index 942981834..3c50396f1 100644 +index f7fcd1e32..ffd4809df 100644 --- a/hw/xwayland/xwayland.c +++ b/hw/xwayland/xwayland.c -@@ -152,6 +152,23 @@ xwl_screen_get(ScreenPtr screen) +@@ -154,6 +154,23 @@ xwl_screen_get(ScreenPtr screen) return dixLookupPrivate(&screen->devPrivates, &xwl_screen_private_key); } @@ -191,10 +191,10 @@ index 942981834..3c50396f1 100644 xwl_window_set_allow_commits(struct xwl_window *xwl_window, Bool allow, const char *debug_msg) diff --git a/hw/xwayland/xwayland.h b/hw/xwayland/xwayland.h -index fa78b5ab9..c66997f00 100644 +index 1244d2e91..200e18a8d 100644 --- a/hw/xwayland/xwayland.h +++ b/hw/xwayland/xwayland.h -@@ -389,6 +389,7 @@ void xwl_surface_damage(struct xwl_screen *xwl_screen, +@@ -391,6 +391,7 @@ void xwl_screen_roundtrip (struct xwl_screen *xwl_screen); Bool xwl_screen_init_cursor(struct xwl_screen *xwl_screen); struct xwl_screen *xwl_screen_get(ScreenPtr screen); @@ -203,5 +203,5 @@ index fa78b5ab9..c66997f00 100644 void xwl_tablet_tool_set_cursor(struct xwl_tablet_tool *tool); void xwl_seat_set_cursor(struct xwl_seat *xwl_seat); -- -2.25.2 +2.26.2 diff --git a/0005-glamor-Fix-glamor_poly_fill_rect_gl-xRectangle-width.patch b/0005-glamor-Fix-glamor_poly_fill_rect_gl-xRectangle-width.patch new file mode 100644 index 0000000..50d22e5 --- /dev/null +++ b/0005-glamor-Fix-glamor_poly_fill_rect_gl-xRectangle-width.patch @@ -0,0 +1,71 @@ +From 8c3c8bda2c44fb3d62b954b02b08e3b1771ef5bc Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Michel=20D=C3=A4nzer?= +Date: Tue, 25 Aug 2020 17:26:56 +0200 +Subject: [PATCH xserver 05/16] glamor: Fix glamor_poly_fill_rect_gl + xRectangle::width/height handling + +(Using GLSL 1.30 or newer) + +The width/height members of xRectangle are unsigned, but they were +being interpreted as signed when converting to floating point for the +vertex shader, producing incorrect drawing for values > 32767. + +v2: +* Use separate GL_UNSIGNED_SHORT vertex attribute for width/height. + (Eric Anholt) + +Reviewed-by: Eric Anholt +(cherry picked from commit 032af35657aa95c6bbdb74ff8c72e535b9b56cfa) +--- + glamor/glamor_rects.c | 18 ++++++++++++++---- + 1 file changed, 14 insertions(+), 4 deletions(-) + +diff --git a/glamor/glamor_rects.c b/glamor/glamor_rects.c +index 6cbb040c1..ae4fe8bcc 100644 +--- a/glamor/glamor_rects.c ++++ b/glamor/glamor_rects.c +@@ -27,8 +27,10 @@ + static const glamor_facet glamor_facet_polyfillrect_130 = { + .name = "poly_fill_rect", + .version = 130, +- .vs_vars = "attribute vec4 primitive;\n", +- .vs_exec = (" vec2 pos = primitive.zw * vec2(gl_VertexID&1, (gl_VertexID&2)>>1);\n" ++ .source_name = "size", ++ .vs_vars = "attribute vec2 primitive;\n" ++ "attribute vec2 size;\n", ++ .vs_exec = (" vec2 pos = size * vec2(gl_VertexID&1, (gl_VertexID&2)>>1);\n" + GLAMOR_POS(gl_Position, (primitive.xy + pos))), + }; + +@@ -81,9 +83,14 @@ glamor_poly_fill_rect_gl(DrawablePtr drawable, + + glEnableVertexAttribArray(GLAMOR_VERTEX_POS); + glVertexAttribDivisor(GLAMOR_VERTEX_POS, 1); +- glVertexAttribPointer(GLAMOR_VERTEX_POS, 4, GL_SHORT, GL_FALSE, ++ glVertexAttribPointer(GLAMOR_VERTEX_POS, 2, GL_SHORT, GL_FALSE, + 4 * sizeof (short), vbo_offset); + ++ glEnableVertexAttribArray(GLAMOR_VERTEX_SOURCE); ++ glVertexAttribDivisor(GLAMOR_VERTEX_SOURCE, 1); ++ glVertexAttribPointer(GLAMOR_VERTEX_SOURCE, 2, GL_UNSIGNED_SHORT, GL_FALSE, ++ 4 * sizeof (short), vbo_offset + 2 * sizeof (short)); ++ + memcpy(v, prect, nrect * sizeof (xRectangle)); + + glamor_put_vbo_space(screen); +@@ -156,8 +163,11 @@ glamor_poly_fill_rect_gl(DrawablePtr drawable, + + bail: + glDisable(GL_SCISSOR_TEST); +- if (glamor_priv->glsl_version >= 130) ++ if (glamor_priv->glsl_version >= 130) { ++ glVertexAttribDivisor(GLAMOR_VERTEX_SOURCE, 0); ++ glDisableVertexAttribArray(GLAMOR_VERTEX_SOURCE); + glVertexAttribDivisor(GLAMOR_VERTEX_POS, 0); ++ } + glDisableVertexAttribArray(GLAMOR_VERTEX_POS); + + return ret; +-- +2.28.0 + diff --git a/0005-xwayland-Use-RandR-1.2-interface-rev-2.patch b/0005-xwayland-Use-RandR-1.2-interface-rev-2.patch index 8585f82..ab50605 100644 --- a/0005-xwayland-Use-RandR-1.2-interface-rev-2.patch +++ b/0005-xwayland-Use-RandR-1.2-interface-rev-2.patch @@ -1,4 +1,4 @@ -From d837f7003d22c5e0d5bd05d41e872e7ee331dfa4 Mon Sep 17 00:00:00 2001 +From 19e725dd368e25c057770530cdd622234303003e Mon Sep 17 00:00:00 2001 From: Robert Mader Date: Mon, 22 Jan 2018 17:57:38 +0100 Subject: [PATCH xserver 05/24] xwayland: Use RandR 1.2 interface (rev 2) @@ -29,10 +29,10 @@ Signed-off-by: Hans de Goede 1 file changed, 81 insertions(+) diff --git a/hw/xwayland/xwayland-output.c b/hw/xwayland/xwayland-output.c -index 2ccc3ca60..67e99bdab 100644 +index 4036ba681..633ebb89e 100644 --- a/hw/xwayland/xwayland-output.c +++ b/hw/xwayland/xwayland-output.c -@@ -561,12 +561,80 @@ xwl_randr_get_info(ScreenPtr pScreen, Rotation * rotations) +@@ -524,12 +524,80 @@ xwl_randr_get_info(ScreenPtr pScreen, Rotation * rotations) return TRUE; } @@ -113,7 +113,7 @@ index 2ccc3ca60..67e99bdab 100644 Bool xwl_screen_init_output(struct xwl_screen *xwl_screen) -@@ -580,7 +648,20 @@ xwl_screen_init_output(struct xwl_screen *xwl_screen) +@@ -543,7 +611,20 @@ xwl_screen_init_output(struct xwl_screen *xwl_screen) rp = rrGetScrPriv(xwl_screen->screen); rp->rrGetInfo = xwl_randr_get_info; @@ -135,5 +135,5 @@ index 2ccc3ca60..67e99bdab 100644 return TRUE; } -- -2.25.2 +2.26.2 diff --git a/0006-xfree86-Take-second-reference-for-SavedCursor-in-xf8.patch b/0006-xfree86-Take-second-reference-for-SavedCursor-in-xf8.patch new file mode 100644 index 0000000..f083339 --- /dev/null +++ b/0006-xfree86-Take-second-reference-for-SavedCursor-in-xf8.patch @@ -0,0 +1,34 @@ +From 1e84fda2020b12a83c6b9c6d31ab84f993c6176c Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Michel=20D=C3=A4nzer?= +Date: Tue, 1 Sep 2020 11:24:57 +0200 +Subject: [PATCH xserver 06/16] xfree86: Take second reference for SavedCursor + in xf86CursorSetCursor + +The same pointer is kept in CurrentCursor as well, therefore two +RefCursor calls are needed. + +Fixes use-after-free after switching VTs. + +Closes: https://gitlab.freedesktop.org/xorg/xserver/-/issues/1067 +(cherry picked from commit 919f1f46fc67dae93b2b3f278fcbfc77af34ec58) +--- + hw/xfree86/ramdac/xf86CursorRD.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/hw/xfree86/ramdac/xf86CursorRD.c b/hw/xfree86/ramdac/xf86CursorRD.c +index ee1d98916..02dab36fe 100644 +--- a/hw/xfree86/ramdac/xf86CursorRD.c ++++ b/hw/xfree86/ramdac/xf86CursorRD.c +@@ -334,6 +334,9 @@ xf86CursorSetCursor(DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCurs, + ScreenPriv->HotY = cursor->bits->yhot; + + if (!infoPtr->pScrn->vtSema) { ++ cursor = RefCursor(cursor); ++ if (ScreenPriv->SavedCursor) ++ FreeCursor(ScreenPriv->SavedCursor, None); + ScreenPriv->SavedCursor = cursor; + return; + } +-- +2.28.0 + diff --git a/0006-xwayland-Add-per-client-private-data.patch b/0006-xwayland-Add-per-client-private-data.patch index fc4b473..3109b46 100644 --- a/0006-xwayland-Add-per-client-private-data.patch +++ b/0006-xwayland-Add-per-client-private-data.patch @@ -1,4 +1,4 @@ -From 80ca38c4428a499a795084dc696c390b707749b9 Mon Sep 17 00:00:00 2001 +From e6ba28eb96b227e47c371a7063f778fb2ab82a0b Mon Sep 17 00:00:00 2001 From: Hans de Goede Date: Thu, 29 Aug 2019 22:45:12 +0200 Subject: [PATCH xserver 06/24] xwayland: Add per client private data @@ -21,10 +21,10 @@ Signed-off-by: Hans de Goede 2 files changed, 19 insertions(+) diff --git a/hw/xwayland/xwayland.c b/hw/xwayland/xwayland.c -index 3c50396f1..b0e37ceb9 100644 +index ffd4809df..e00dba334 100644 --- a/hw/xwayland/xwayland.c +++ b/hw/xwayland/xwayland.c -@@ -135,11 +135,18 @@ ddxProcessArgument(int argc, char *argv[], int i) +@@ -137,11 +137,18 @@ ddxProcessArgument(int argc, char *argv[], int i) return 0; } @@ -43,7 +43,7 @@ index 3c50396f1..b0e37ceb9 100644 static struct xwl_window * xwl_window_get(WindowPtr window) { -@@ -1143,6 +1150,13 @@ xwl_screen_init(ScreenPtr pScreen, int argc, char **argv) +@@ -1158,6 +1165,13 @@ xwl_screen_init(ScreenPtr pScreen, int argc, char **argv) return FALSE; if (!dixRegisterPrivateKey(&xwl_damage_private_key, PRIVATE_WINDOW, 0)) return FALSE; @@ -58,7 +58,7 @@ index 3c50396f1..b0e37ceb9 100644 dixSetPrivate(&pScreen->devPrivates, &xwl_screen_private_key, xwl_screen); xwl_screen->screen = pScreen; diff --git a/hw/xwayland/xwayland.h b/hw/xwayland/xwayland.h -index c66997f00..593e92b64 100644 +index 200e18a8d..19626d394 100644 --- a/hw/xwayland/xwayland.h +++ b/hw/xwayland/xwayland.h @@ -379,8 +379,13 @@ struct xwl_output { @@ -76,5 +76,5 @@ index c66997f00..593e92b64 100644 void xwl_surface_damage(struct xwl_screen *xwl_screen, struct wl_surface *surface, -- -2.25.2 +2.26.2 diff --git a/0007-present-wnmd-Can-t-use-page-flipping-for-windows-cli.patch b/0007-present-wnmd-Can-t-use-page-flipping-for-windows-cli.patch new file mode 100644 index 0000000..947dd57 --- /dev/null +++ b/0007-present-wnmd-Can-t-use-page-flipping-for-windows-cli.patch @@ -0,0 +1,37 @@ +From f4006d795cb199bf7deeb00f542c592db6a5becb Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Michel=20D=C3=A4nzer?= +Date: Mon, 7 Sep 2020 18:35:10 +0200 +Subject: [PATCH xserver 07/16] present/wnmd: Can't use page flipping for + windows clipped by children + +Noticed this was missing while working on the following fix. + +v2: +* Dropped present_wnmd_can_window_flip hunk (that function is never + called, will be cleaned up in a follow-up MR). + +Reviewed-by: Olivier Fourdan # v1 +Reviewed-by: Roman Gilg +(cherry picked from commit 7ac303c7b1e3b1be79ba3648e217798683e65a99) +--- + present/present_wnmd.c | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/present/present_wnmd.c b/present/present_wnmd.c +index 32c4d55f1..6a3d1035b 100644 +--- a/present/present_wnmd.c ++++ b/present/present_wnmd.c +@@ -291,6 +291,10 @@ present_wnmd_check_flip(RRCrtcPtr crtc, + if ( !RegionEqual(&window->winSize, &toplvl_window->winSize) ) + return FALSE; + ++ /* Can't flip if window clipped by children */ ++ if (!RegionEqual(&window->clipList, &window->winSize)) ++ return FALSE; ++ + /* Ask the driver for permission */ + if (screen_priv->wnmd_info->check_flip2) { + if (!(*screen_priv->wnmd_info->check_flip2) (crtc, window, pixmap, sync_flip, reason)) { +-- +2.28.0 + diff --git a/0007-xwayland-Add-support-for-storing-per-client-per-outp.patch b/0007-xwayland-Add-support-for-storing-per-client-per-outp.patch index 4d9b532..4c7c0e5 100644 --- a/0007-xwayland-Add-support-for-storing-per-client-per-outp.patch +++ b/0007-xwayland-Add-support-for-storing-per-client-per-outp.patch @@ -1,4 +1,4 @@ -From 879fed575deea57462217fc31eb331db8d23637c Mon Sep 17 00:00:00 2001 +From 575c8b49a715d45115625643b8495ad786961e38 Mon Sep 17 00:00:00 2001 From: Hans de Goede Date: Thu, 29 Aug 2019 23:04:36 +0200 Subject: [PATCH xserver 07/24] xwayland: Add support for storing per client @@ -31,10 +31,10 @@ Signed-off-by: Hans de Goede 2 files changed, 84 insertions(+) diff --git a/hw/xwayland/xwayland-output.c b/hw/xwayland/xwayland-output.c -index 67e99bdab..82ff5db70 100644 +index 633ebb89e..64794dee7 100644 --- a/hw/xwayland/xwayland-output.c +++ b/hw/xwayland/xwayland-output.c -@@ -245,6 +245,73 @@ update_screen_size(struct xwl_output *xwl_output, int width, int height) +@@ -208,6 +208,73 @@ update_screen_size(struct xwl_output *xwl_output, int width, int height) update_desktop_dimensions(); } @@ -109,7 +109,7 @@ index 67e99bdab..82ff5db70 100644 const int32_t xwl_output_fake_modes[][2] = { /* 4:3 (1.33) */ diff --git a/hw/xwayland/xwayland.h b/hw/xwayland/xwayland.h -index 593e92b64..0e6f92e63 100644 +index 19626d394..c886d77e9 100644 --- a/hw/xwayland/xwayland.h +++ b/hw/xwayland/xwayland.h @@ -379,7 +379,21 @@ struct xwl_output { @@ -134,7 +134,7 @@ index 593e92b64..0e6f92e63 100644 }; void xwl_window_create_frame_callback(struct xwl_window *xwl_window); -@@ -425,6 +439,9 @@ void xwl_output_destroy(struct xwl_output *xwl_output); +@@ -427,6 +441,9 @@ void xwl_output_destroy(struct xwl_output *xwl_output); void xwl_output_remove(struct xwl_output *xwl_output); @@ -145,5 +145,5 @@ index 593e92b64..0e6f92e63 100644 float VRefresh, Bool Reduced, Bool Interlaced); -- -2.25.2 +2.26.2 diff --git a/0008-xwayland-Add-support-for-randr-resolution-change-emu.patch b/0008-xwayland-Add-support-for-randr-resolution-change-emu.patch index 3038555..e3c5b5a 100644 --- a/0008-xwayland-Add-support-for-randr-resolution-change-emu.patch +++ b/0008-xwayland-Add-support-for-randr-resolution-change-emu.patch @@ -1,4 +1,4 @@ -From a640802d33e0daccf2d4045ecb3e70cbf56bf0ac Mon Sep 17 00:00:00 2001 +From 1317f1f02fd0037e2bf7a678f2c3a9a4170161e9 Mon Sep 17 00:00:00 2001 From: Hans de Goede Date: Tue, 2 Jul 2019 11:55:26 +0200 Subject: [PATCH xserver 08/24] xwayland: Add support for randr-resolution @@ -37,10 +37,10 @@ Signed-off-by: Hans de Goede 4 files changed, 276 insertions(+), 6 deletions(-) diff --git a/hw/xwayland/xwayland-input.c b/hw/xwayland/xwayland-input.c -index fa46ac3e7..97b8cd132 100644 +index a05d178ff..7d75a8f54 100644 --- a/hw/xwayland/xwayland-input.c +++ b/hw/xwayland/xwayland-input.c -@@ -486,6 +486,11 @@ dispatch_pointer_motion_event(struct xwl_seat *xwl_seat) +@@ -488,6 +488,11 @@ dispatch_pointer_motion_event(struct xwl_seat *xwl_seat) int dx = xwl_seat->focus_window->window->drawable.x; int dy = xwl_seat->focus_window->window->drawable.y; @@ -53,10 +53,10 @@ index fa46ac3e7..97b8cd132 100644 y = dy + sy; } else { diff --git a/hw/xwayland/xwayland-output.c b/hw/xwayland/xwayland-output.c -index 82ff5db70..99ab1b288 100644 +index 64794dee7..e09d00108 100644 --- a/hw/xwayland/xwayland-output.c +++ b/hw/xwayland/xwayland-output.c -@@ -408,6 +408,42 @@ err: +@@ -371,6 +371,42 @@ err: FatalError("Failed to allocate memory for list of RR modes"); } @@ -99,7 +99,7 @@ index 82ff5db70..99ab1b288 100644 static void apply_output_change(struct xwl_output *xwl_output) { -@@ -650,21 +686,36 @@ xwl_randr_screen_set_size(ScreenPtr pScreen, +@@ -613,21 +649,36 @@ xwl_randr_screen_set_size(ScreenPtr pScreen, static Bool xwl_randr_crtc_set(ScreenPtr pScreen, RRCrtcPtr crtc, @@ -143,10 +143,10 @@ index 82ff5db70..99ab1b288 100644 static Bool diff --git a/hw/xwayland/xwayland.c b/hw/xwayland/xwayland.c -index b0e37ceb9..1ab5b3a28 100644 +index e00dba334..9c6cf7cf5 100644 --- a/hw/xwayland/xwayland.c +++ b/hw/xwayland/xwayland.c -@@ -176,6 +176,23 @@ xwl_screen_has_resolution_change_emulation(struct xwl_screen *xwl_screen) +@@ -178,6 +178,23 @@ xwl_screen_has_resolution_change_emulation(struct xwl_screen *xwl_screen) return xwl_screen->rootless && xwl_screen_has_viewport_support(xwl_screen); } @@ -170,7 +170,7 @@ index b0e37ceb9..1ab5b3a28 100644 static void xwl_window_set_allow_commits(struct xwl_window *xwl_window, Bool allow, const char *debug_msg) -@@ -512,6 +529,150 @@ xwl_pixmap_get(PixmapPtr pixmap) +@@ -514,6 +531,150 @@ xwl_pixmap_get(PixmapPtr pixmap) return dixLookupPrivate(&pixmap->devPrivates, &xwl_pixmap_private_key); } @@ -321,7 +321,7 @@ index b0e37ceb9..1ab5b3a28 100644 static void xwl_window_init_allow_commits(struct xwl_window *xwl_window) { -@@ -582,6 +743,8 @@ ensure_surface_for_window(WindowPtr window) +@@ -584,6 +745,8 @@ ensure_surface_for_window(WindowPtr window) xwl_window->xwl_screen = xwl_screen; xwl_window->window = window; @@ -330,7 +330,7 @@ index b0e37ceb9..1ab5b3a28 100644 xwl_window->surface = wl_compositor_create_surface(xwl_screen->compositor); if (xwl_window->surface == NULL) { ErrorF("wl_display_create_surface failed\n"); -@@ -623,6 +786,7 @@ ensure_surface_for_window(WindowPtr window) +@@ -625,6 +788,7 @@ ensure_surface_for_window(WindowPtr window) dixSetPrivate(&window->devPrivates, &xwl_window_private_key, xwl_window); xorg_list_init(&xwl_window->link_damage); @@ -338,7 +338,7 @@ index b0e37ceb9..1ab5b3a28 100644 #ifdef GLAMOR_HAS_GBM xorg_list_init(&xwl_window->frame_callback_list); -@@ -716,8 +880,12 @@ xwl_unrealize_window(WindowPtr window) +@@ -718,8 +882,12 @@ xwl_unrealize_window(WindowPtr window) if (!xwl_window) return ret; @@ -351,7 +351,7 @@ index b0e37ceb9..1ab5b3a28 100644 unregister_damage(window); if (xwl_window->frame_callback) -@@ -767,6 +935,33 @@ xwl_set_window_pixmap(WindowPtr window, +@@ -769,6 +937,33 @@ xwl_set_window_pixmap(WindowPtr window, ensure_surface_for_window(window); } @@ -385,15 +385,15 @@ index b0e37ceb9..1ab5b3a28 100644 static void frame_callback(void *data, struct wl_callback *callback, -@@ -1218,6 +1413,7 @@ xwl_screen_init(ScreenPtr pScreen, int argc, char **argv) +@@ -1246,6 +1441,7 @@ xwl_screen_init(ScreenPtr pScreen, int argc, char **argv) xorg_list_init(&xwl_screen->output_list); xorg_list_init(&xwl_screen->seat_list); xorg_list_init(&xwl_screen->damage_window_list); + xorg_list_init(&xwl_screen->window_list); xwl_screen->depth = 24; - xwl_screen->display = wl_display_connect(NULL); -@@ -1316,6 +1512,9 @@ xwl_screen_init(ScreenPtr pScreen, int argc, char **argv) + if (!monitorResolution) +@@ -1340,6 +1536,9 @@ xwl_screen_init(ScreenPtr pScreen, int argc, char **argv) xwl_screen->CloseScreen = pScreen->CloseScreen; pScreen->CloseScreen = xwl_close_screen; @@ -404,7 +404,7 @@ index b0e37ceb9..1ab5b3a28 100644 xwl_screen->SetWindowPixmap = pScreen->SetWindowPixmap; pScreen->SetWindowPixmap = xwl_set_window_pixmap; diff --git a/hw/xwayland/xwayland.h b/hw/xwayland/xwayland.h -index 0e6f92e63..9adf3af76 100644 +index c886d77e9..36c4c4c8b 100644 --- a/hw/xwayland/xwayland.h +++ b/hw/xwayland/xwayland.h @@ -135,10 +135,12 @@ struct xwl_screen { @@ -434,7 +434,7 @@ index 0e6f92e63..9adf3af76 100644 struct wl_callback *frame_callback; Bool allow_commits; #ifdef GLAMOR_HAS_GBM -@@ -409,6 +415,9 @@ Bool xwl_screen_init_cursor(struct xwl_screen *xwl_screen); +@@ -411,6 +417,9 @@ Bool xwl_screen_init_cursor(struct xwl_screen *xwl_screen); struct xwl_screen *xwl_screen_get(ScreenPtr screen); Bool xwl_screen_has_resolution_change_emulation(struct xwl_screen *xwl_screen); @@ -444,7 +444,7 @@ index 0e6f92e63..9adf3af76 100644 void xwl_tablet_tool_set_cursor(struct xwl_tablet_tool *tool); void xwl_seat_set_cursor(struct xwl_seat *xwl_seat); -@@ -442,6 +451,12 @@ void xwl_output_remove(struct xwl_output *xwl_output); +@@ -444,6 +453,12 @@ void xwl_output_remove(struct xwl_output *xwl_output); struct xwl_emulated_mode *xwl_output_get_emulated_mode_for_client( struct xwl_output *xwl_output, ClientPtr client); @@ -458,5 +458,5 @@ index 0e6f92e63..9adf3af76 100644 float VRefresh, Bool Reduced, Bool Interlaced); -- -2.25.2 +2.26.2 diff --git a/0008-xwayland-Check-window-pixmap-in-xwl_present_check_fl.patch b/0008-xwayland-Check-window-pixmap-in-xwl_present_check_fl.patch new file mode 100644 index 0000000..6e846d2 --- /dev/null +++ b/0008-xwayland-Check-window-pixmap-in-xwl_present_check_fl.patch @@ -0,0 +1,45 @@ +From 51ee6e5ceb0cacc8e2fa225ad5391ffb159e36a0 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Michel=20D=C3=A4nzer?= +Date: Mon, 7 Sep 2020 18:39:17 +0200 +Subject: [PATCH xserver 08/16] xwayland: Check window pixmap in + xwl_present_check_flip2 + +We can only flip if the window pixmap matches that of the toplevel +window. Doing so regardless could cause the toplevel window pixmap to +get destroyed while it was still referenced by the window, resulting in +use-after-free and likely a crash. + +Closes: https://gitlab.freedesktop.org/xorg/xserver/-/issues/1033 +Reviewed-by: Olivier Fourdan +Reviewed-by: Roman Gilg +(cherry picked from commit 4c25356d6cd908c5030c70e712076dff318ac00d) +--- + hw/xwayland/xwayland-present.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +diff --git a/hw/xwayland/xwayland-present.c b/hw/xwayland/xwayland-present.c +index 6076f6498..d177abdd8 100644 +--- a/hw/xwayland/xwayland-present.c ++++ b/hw/xwayland/xwayland-present.c +@@ -421,10 +421,18 @@ xwl_present_check_flip2(RRCrtcPtr crtc, + PresentFlipReason *reason) + { + struct xwl_window *xwl_window = xwl_window_from_window(present_window); ++ ScreenPtr screen = pixmap->drawable.pScreen; + + if (!xwl_window) + return FALSE; + ++ /* Can't flip if the window pixmap doesn't match the xwl_window parent ++ * window's, e.g. because a client redirected this window or one of its ++ * parents. ++ */ ++ if (screen->GetWindowPixmap(xwl_window->window) != screen->GetWindowPixmap(present_window)) ++ return FALSE; ++ + /* + * We currently only allow flips of windows, that have the same + * dimensions as their xwl_window parent window. For the case of +-- +2.28.0 + diff --git a/0009-present-wnmd-Remove-dead-check-from-present_wnmd_che.patch b/0009-present-wnmd-Remove-dead-check-from-present_wnmd_che.patch new file mode 100644 index 0000000..2bad794 --- /dev/null +++ b/0009-present-wnmd-Remove-dead-check-from-present_wnmd_che.patch @@ -0,0 +1,33 @@ +From 174cb91d82d643f78d8ba2b9999312b9d7dea98c Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Michel=20D=C3=A4nzer?= +Date: Mon, 7 Sep 2020 18:40:34 +0200 +Subject: [PATCH xserver 09/16] present/wnmd: Remove dead check from + present_wnmd_check_flip + +present_wnmd_toplvl_pixmap_window returns a window with the same window +pixmap, so the check could never fail. + +Reviewed-by: Roman Gilg +(cherry picked from commit b6b1161fd7ac409156fb69439897bcabdeacf393) +--- + present/present_wnmd.c | 4 ---- + 1 file changed, 4 deletions(-) + +diff --git a/present/present_wnmd.c b/present/present_wnmd.c +index 6a3d1035b..35ea12968 100644 +--- a/present/present_wnmd.c ++++ b/present/present_wnmd.c +@@ -270,10 +270,6 @@ present_wnmd_check_flip(RRCrtcPtr crtc, + if (!screen_priv->wnmd_info->flip) + return FALSE; + +- /* Can't flip redirected child windows */ +- if (screen->GetWindowPixmap(window) != screen->GetWindowPixmap(toplvl_window)) +- return FALSE; +- + /* Source pixmap must align with window exactly */ + if (x_off || y_off) + return FALSE; +-- +2.28.0 + diff --git a/0009-xwayland-Add-xwlRRModeToDisplayMode-helper-function.patch b/0009-xwayland-Add-xwlRRModeToDisplayMode-helper-function.patch index 403f950..7126893 100644 --- a/0009-xwayland-Add-xwlRRModeToDisplayMode-helper-function.patch +++ b/0009-xwayland-Add-xwlRRModeToDisplayMode-helper-function.patch @@ -1,4 +1,4 @@ -From 62e8b2ff7471f1a48b8bac9f41cceecea4931c03 Mon Sep 17 00:00:00 2001 +From 0efb1df3a2ef4bc2dd329af63e1bd3dbda3445e4 Mon Sep 17 00:00:00 2001 From: Hans de Goede Date: Mon, 8 Jul 2019 14:00:27 +0200 Subject: [PATCH xserver 09/24] xwayland: Add xwlRRModeToDisplayMode() helper @@ -20,7 +20,7 @@ Signed-off-by: Hans de Goede 1 file changed, 28 insertions(+), 23 deletions(-) diff --git a/hw/xwayland/xwayland-vidmode.c b/hw/xwayland/xwayland-vidmode.c -index 0bcd11401..a59c9f6a9 100644 +index d25d1aca1..428af716d 100644 --- a/hw/xwayland/xwayland-vidmode.c +++ b/hw/xwayland/xwayland-vidmode.c @@ -78,13 +78,37 @@ mode_refresh(const xRRModeInfo *mode_info) @@ -97,5 +97,5 @@ index 0bcd11401..a59c9f6a9 100644 return TRUE; } -- -2.25.2 +2.26.2 diff --git a/0010-xwayland-Add-xwlVidModeGetCurrentRRMode-helper-to-th.patch b/0010-xwayland-Add-xwlVidModeGetCurrentRRMode-helper-to-th.patch index 7fa5a19..ee65f4d 100644 --- a/0010-xwayland-Add-xwlVidModeGetCurrentRRMode-helper-to-th.patch +++ b/0010-xwayland-Add-xwlVidModeGetCurrentRRMode-helper-to-th.patch @@ -1,4 +1,4 @@ -From 3ecabb250841ff0423744cd2291aaebf87b4239a Mon Sep 17 00:00:00 2001 +From fdbc9904d5af48db56877369f8b4671985ffc363 Mon Sep 17 00:00:00 2001 From: Hans de Goede Date: Mon, 8 Jul 2019 18:35:27 +0200 Subject: [PATCH xserver 10/24] xwayland: Add xwlVidModeGetCurrentRRMode helper @@ -30,7 +30,7 @@ Signed-off-by: Hans de Goede 1 file changed, 56 insertions(+), 34 deletions(-) diff --git a/hw/xwayland/xwayland-vidmode.c b/hw/xwayland/xwayland-vidmode.c -index a59c9f6a9..e9aea7269 100644 +index 428af716d..7cf982fcc 100644 --- a/hw/xwayland/xwayland-vidmode.c +++ b/hw/xwayland/xwayland-vidmode.c @@ -103,26 +103,56 @@ xwlRRModeToDisplayMode(RRModePtr rrmode, DisplayModePtr mode) @@ -189,5 +189,5 @@ index a59c9f6a9..e9aea7269 100644 static void -- -2.25.2 +2.26.2 diff --git a/0010-xwayland-Do-not-discard-frame-callbacks-on-allow-com.patch b/0010-xwayland-Do-not-discard-frame-callbacks-on-allow-com.patch new file mode 100644 index 0000000..ea78fb5 --- /dev/null +++ b/0010-xwayland-Do-not-discard-frame-callbacks-on-allow-com.patch @@ -0,0 +1,73 @@ +From d108c2c82cba242ea5998d7c91254d90d3a5db71 Mon Sep 17 00:00:00 2001 +From: Olivier Fourdan +Date: Fri, 11 Sep 2020 11:30:18 +0200 +Subject: [PATCH xserver 10/16] xwayland: Do not discard frame callbacks on + allow commits +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Currently, when a X11 client (usually the X11 window manager from a +Wayland compositor) changes the value of the X11 property +`_XWAYLAND_ALLOW_COMMITS` from `false` to `true`, all pending frame +callbacks on the window are discarded so that the commit occurs +immediately. + +Weston uses that mechanism to prevent the content of the window from +showing before it's ready when mapping the window initially, but +discarding the pending frame callbacks has no effect on the initial +mapping of the X11 window since at that point there cannot be any frame +callback on a surface which hasn't been committed yet anyway. + +However, discarding pending frame callbacks can be problematic if we +were to use the same `_XWAYLAND_ALLOW_COMMITS` mechanism to prevent +damages to be posted before the X11 toplevel is updated completely +(including the window decorations from the X11 window manager). + +Remove the portion of code discarding the pending frame callback, +Xwayland should always wait for a pending frame callback if there's one +before posting new damages. + +Signed-off-by: Olivier Fourdan +Reviewed-by: Pekka Paalanen +Reviewed-by: Michel Dänzer +https://gitlab.freedesktop.org/xorg/xserver/merge_requests/333 +(cherry picked from commit 66da95a172c4941b75ffedcdaa0138c0a48f11fb) +--- + hw/xwayland/xwayland.c | 13 ------------- + 1 file changed, 13 deletions(-) + +diff --git a/hw/xwayland/xwayland.c b/hw/xwayland/xwayland.c +index d02934cd5..a69188c0f 100644 +--- a/hw/xwayland/xwayland.c ++++ b/hw/xwayland/xwayland.c +@@ -193,8 +193,6 @@ static void + xwl_window_property_allow_commits(struct xwl_window *xwl_window, + PropertyStateRec *propstate) + { +- Bool old_allow_commits = xwl_window->allow_commits; +- + switch (propstate->state) { + case PropertyNewValue: + xwl_window_set_allow_commits_from_property(xwl_window, propstate->prop); +@@ -207,17 +205,6 @@ xwl_window_property_allow_commits(struct xwl_window *xwl_window, + default: + break; + } +- +- /* If allow_commits turned from off to on, discard any frame +- * callback we might be waiting for so that a new buffer is posted +- * immediately through block_handler() if there is damage to post. +- */ +- if (!old_allow_commits && xwl_window->allow_commits) { +- if (xwl_window->frame_callback) { +- wl_callback_destroy(xwl_window->frame_callback); +- xwl_window->frame_callback = NULL; +- } +- } + } + + static void +-- +2.28.0 + diff --git a/0011-xwayland-Add-vidmode-mode-changing-emulation-support.patch b/0011-xwayland-Add-vidmode-mode-changing-emulation-support.patch index cf706e3..3e8e038 100644 --- a/0011-xwayland-Add-vidmode-mode-changing-emulation-support.patch +++ b/0011-xwayland-Add-vidmode-mode-changing-emulation-support.patch @@ -1,4 +1,4 @@ -From 86e32a877ded8d67ec26ed2bcc06bd80ec2a5915 Mon Sep 17 00:00:00 2001 +From aa5920519dff3dc3dfb33af342e454627fa5402c Mon Sep 17 00:00:00 2001 From: Hans de Goede Date: Tue, 9 Jul 2019 09:31:13 +0200 Subject: [PATCH xserver 11/24] xwayland: Add vidmode mode changing emulation @@ -19,7 +19,7 @@ Signed-off-by: Hans de Goede 1 file changed, 86 insertions(+), 44 deletions(-) diff --git a/hw/xwayland/xwayland-vidmode.c b/hw/xwayland/xwayland-vidmode.c -index e9aea7269..56aac693a 100644 +index 7cf982fcc..99a4d2c92 100644 --- a/hw/xwayland/xwayland-vidmode.c +++ b/hw/xwayland/xwayland-vidmode.c @@ -106,26 +106,25 @@ xwlRRModeToDisplayMode(RRModePtr rrmode, DisplayModePtr mode) @@ -232,5 +232,5 @@ index e9aea7269..56aac693a 100644 static Bool -- -2.25.2 +2.26.2 diff --git a/0011-xwayland-use-drmGetNodeTypeFromFd-for-checking-if-a-.patch b/0011-xwayland-use-drmGetNodeTypeFromFd-for-checking-if-a-.patch new file mode 100644 index 0000000..f8b1463 --- /dev/null +++ b/0011-xwayland-use-drmGetNodeTypeFromFd-for-checking-if-a-.patch @@ -0,0 +1,68 @@ +From 1ac389dda89b2882c80767c91bbe88e01818491c Mon Sep 17 00:00:00 2001 +From: Greg V +Date: Tue, 15 Sep 2020 17:41:04 +0300 +Subject: [PATCH xserver 11/16] xwayland: use drmGetNodeTypeFromFd for checking + if a node is a render one + +Major/minor numbers are a.. major (ha) source of pain in FreeBSD porting. +In this case, Xwayland was thinking that /dev/dri/card0 is already a render node, +because the st_rdev on FreeBSD was passing the Linux-style check, +and because of the assumption, acceleration would fail because +various ioctls like AMDGPU_INFO would be denied on the non-render node. + +Switch to libdrm's function that already works correctly on all platforms. + +Signed-off-by: Greg V +Reviewed-by: Emmanuel Vadot +(cherry picked from commit 239ebdc9e447d4f836d0c2aa6068c6064fffb46c) +--- + hw/xwayland/xwayland-glamor-gbm.c | 19 ++----------------- + 1 file changed, 2 insertions(+), 17 deletions(-) + +diff --git a/hw/xwayland/xwayland-glamor-gbm.c b/hw/xwayland/xwayland-glamor-gbm.c +index ebff70a00..b519492cc 100644 +--- a/hw/xwayland/xwayland-glamor-gbm.c ++++ b/hw/xwayland/xwayland-glamor-gbm.c +@@ -110,21 +110,6 @@ wl_drm_format_for_depth(int depth) + } + } + +-static char +-is_fd_render_node(int fd) +-{ +- struct stat render; +- +- if (fstat(fd, &render)) +- return 0; +- if (!S_ISCHR(render.st_mode)) +- return 0; +- if (render.st_rdev & 0x80) +- return 1; +- +- return 0; +-} +- + static char + is_device_path_render_node (const char *device_path) + { +@@ -135,7 +120,7 @@ is_device_path_render_node (const char *device_path) + if (fd < 0) + return 0; + +- is_render_node = is_fd_render_node(fd); ++ is_render_node = (drmGetNodeTypeFromFd(fd) == DRM_NODE_RENDER); + close(fd); + + return is_render_node; +@@ -767,7 +752,7 @@ xwl_drm_handle_device(void *data, struct wl_drm *drm, const char *device) + return; + } + +- if (is_fd_render_node(xwl_gbm->drm_fd)) { ++ if (drmGetNodeTypeFromFd(xwl_gbm->drm_fd) == DRM_NODE_RENDER) { + xwl_gbm->fd_render_node = 1; + xwl_screen->expecting_event--; + } else { +-- +2.28.0 + diff --git a/0012-xwayland-Remove-pending-stream-reference-when-freein.patch b/0012-xwayland-Remove-pending-stream-reference-when-freein.patch new file mode 100644 index 0000000..e3565dc --- /dev/null +++ b/0012-xwayland-Remove-pending-stream-reference-when-freein.patch @@ -0,0 +1,43 @@ +From 1930ed233fdec5d22e4fc192769a0126faabb3ea Mon Sep 17 00:00:00 2001 +From: Olivier Fourdan +Date: Mon, 14 Sep 2020 15:39:10 +0200 +Subject: [PATCH xserver 12/16] xwayland: Remove pending stream reference when + freeing + +The EGLStream backend keeps a queue of pending streams for each Xwayland +window. + +However, when this pending queue is freed, the corresponding private +data may not be cleared (typically if the pixmap for this window has +changed before the compositor finished attaching the consumer for the +window's pixmap's original eglstream), leading to a use-after-free and a +crash when trying to use that data as the window pixmap. + +Make sure to clear the private data when the pending stream is freed. + +Closes: https://gitlab.freedesktop.org/xorg/xserver/-/issues/1055 +Signed-off-by: Olivier Fourdan +Tested-by: Karol Szuster +Reviewed-by: Adam Jackson +(cherry picked from commit a5f439dcd21b4fda093cb382bb1a758b434a1444) +--- + hw/xwayland/xwayland-glamor-eglstream.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/hw/xwayland/xwayland-glamor-eglstream.c b/hw/xwayland/xwayland-glamor-eglstream.c +index 36b749aaf..0c32fff4d 100644 +--- a/hw/xwayland/xwayland-glamor-eglstream.c ++++ b/hw/xwayland/xwayland-glamor-eglstream.c +@@ -431,8 +431,8 @@ xwl_eglstream_consumer_ready_callback(void *data, + DebugF("eglstream: win %d completes eglstream for pixmap %p, congrats!\n", + pending->window->drawable.id, pending->pixmap); + +- xwl_eglstream_window_set_pending(pending->window, NULL); + out: ++ xwl_eglstream_window_set_pending(pending->window, NULL); + xorg_list_del(&pending->link); + free(pending); + } +-- +2.28.0 + diff --git a/0012-xwayland-xwl_window_should_enable_viewport-Add-extra.patch b/0012-xwayland-xwl_window_should_enable_viewport-Add-extra.patch index 573ab8e..3086baa 100644 --- a/0012-xwayland-xwl_window_should_enable_viewport-Add-extra.patch +++ b/0012-xwayland-xwl_window_should_enable_viewport-Add-extra.patch @@ -1,4 +1,4 @@ -From fd95c9a52e35e994e140a925cfc01587257d4511 Mon Sep 17 00:00:00 2001 +From a090b038c45732676d9b7e367848d5bee7ab0ea5 Mon Sep 17 00:00:00 2001 From: Hans de Goede Date: Mon, 26 Aug 2019 12:26:34 +0200 Subject: [PATCH xserver 12/24] xwayland: xwl_window_should_enable_viewport: @@ -25,10 +25,10 @@ Signed-off-by: Hans de Goede 1 file changed, 17 insertions(+) diff --git a/hw/xwayland/xwayland.c b/hw/xwayland/xwayland.c -index 1ab5b3a28..85036adfe 100644 +index 9c6cf7cf5..2e01822fd 100644 --- a/hw/xwayland/xwayland.c +++ b/hw/xwayland/xwayland.c -@@ -649,6 +649,23 @@ xwl_window_should_enable_viewport(struct xwl_window *xwl_window, +@@ -651,6 +651,23 @@ xwl_window_should_enable_viewport(struct xwl_window *xwl_window, } } @@ -53,5 +53,5 @@ index 1ab5b3a28..85036adfe 100644 } -- -2.25.2 +2.26.2 diff --git a/0013-present-Move-flip-target_msc-adjustment-out-of-prese.patch b/0013-present-Move-flip-target_msc-adjustment-out-of-prese.patch new file mode 100644 index 0000000..eedcbaf --- /dev/null +++ b/0013-present-Move-flip-target_msc-adjustment-out-of-prese.patch @@ -0,0 +1,121 @@ +From dae234efdb7bba75744aa1697386df3c0db5348a Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Michel=20D=C3=A4nzer?= +Date: Fri, 11 Sep 2020 17:00:18 +0200 +Subject: [PATCH xserver 13/16] present: Move flip target_msc adjustment out of + present_vblank_create + +Preparation for different handling between SCMD & WNMD. No functional +change intended. + +Reviewed-by: Roman Gilg +Tested-by: Roman Gilg +(cherry picked from commit 4c92dea952f7fed19857904f0f552900257ef4b9) +--- + present/present_priv.h | 2 +- + present/present_scmd.c | 5 ++++- + present/present_vblank.c | 9 ++++----- + present/present_wnmd.c | 5 ++++- + 4 files changed, 13 insertions(+), 8 deletions(-) + +diff --git a/present/present_priv.h b/present/present_priv.h +index 5849b9e0b..90c3f4e79 100644 +--- a/present/present_priv.h ++++ b/present/present_priv.h +@@ -469,7 +469,7 @@ present_vblank_create(WindowPtr window, + const uint32_t *capabilities, + present_notify_ptr notifies, + int num_notifies, +- uint64_t *target_msc, ++ uint64_t target_msc, + uint64_t crtc_msc); + + void +diff --git a/present/present_scmd.c b/present/present_scmd.c +index 6a580cb7a..a4d046ca8 100644 +--- a/present/present_scmd.c ++++ b/present/present_scmd.c +@@ -745,12 +745,15 @@ present_scmd_pixmap(WindowPtr window, + screen_priv->info ? &screen_priv->info->capabilities : NULL, + notifies, + num_notifies, +- &target_msc, ++ target_msc, + crtc_msc); + + if (!vblank) + return BadAlloc; + ++ if (vblank->flip && vblank->sync_flip) ++ target_msc--; ++ + xorg_list_append(&vblank->event_queue, &present_exec_queue); + vblank->queued = TRUE; + if (msc_is_after(target_msc, crtc_msc)) { +diff --git a/present/present_vblank.c b/present/present_vblank.c +index 2c124f4bb..a4b70c0d9 100644 +--- a/present/present_vblank.c ++++ b/present/present_vblank.c +@@ -57,7 +57,7 @@ present_vblank_create(WindowPtr window, + const uint32_t *capabilities, + present_notify_ptr notifies, + int num_notifies, +- uint64_t *target_msc, ++ uint64_t target_msc, + uint64_t crtc_msc) + { + ScreenPtr screen = window->drawable.pScreen; +@@ -100,7 +100,7 @@ present_vblank_create(WindowPtr window, + + vblank->x_off = x_off; + vblank->y_off = y_off; +- vblank->target_msc = *target_msc; ++ vblank->target_msc = target_msc; + vblank->crtc = target_crtc; + vblank->msc_offset = window_priv->msc_offset; + vblank->notifies = notifies; +@@ -111,12 +111,11 @@ present_vblank_create(WindowPtr window, + if (pixmap != NULL && + !(options & PresentOptionCopy) && + capabilities) { +- if (msc_is_after(*target_msc, crtc_msc) && ++ if (msc_is_after(target_msc, crtc_msc) && + screen_priv->check_flip (target_crtc, window, pixmap, TRUE, valid, x_off, y_off, &reason)) + { + vblank->flip = TRUE; + vblank->sync_flip = TRUE; +- *target_msc = *target_msc - 1; + } else if ((*capabilities & PresentCapabilityAsync) && + screen_priv->check_flip (target_crtc, window, pixmap, FALSE, valid, x_off, y_off, &reason)) + { +@@ -139,7 +138,7 @@ present_vblank_create(WindowPtr window, + + if (pixmap) + DebugPresent(("q %" PRIu64 " %p %" PRIu64 ": %08" PRIx32 " -> %08" PRIx32 " (crtc %p) flip %d vsync %d serial %d\n", +- vblank->event_id, vblank, *target_msc, ++ vblank->event_id, vblank, target_msc, + vblank->pixmap->drawable.id, vblank->window->drawable.id, + target_crtc, vblank->flip, vblank->sync_flip, vblank->serial)); + return vblank; +diff --git a/present/present_wnmd.c b/present/present_wnmd.c +index 35ea12968..31e83d6ee 100644 +--- a/present/present_wnmd.c ++++ b/present/present_wnmd.c +@@ -626,11 +626,14 @@ present_wnmd_pixmap(WindowPtr window, + &screen_priv->wnmd_info->capabilities, + notifies, + num_notifies, +- &target_msc, ++ target_msc, + crtc_msc); + if (!vblank) + return BadAlloc; + ++ if (vblank->flip && vblank->sync_flip) ++ target_msc--; ++ + xorg_list_append(&vblank->event_queue, &window_priv->exec_queue); + vblank->queued = TRUE; + if (crtc_msc < target_msc) { +-- +2.28.0 + diff --git a/0013-xwayland-Set-_XWAYLAND_RANDR_EMU_MONITOR_RECTS-prope.patch b/0013-xwayland-Set-_XWAYLAND_RANDR_EMU_MONITOR_RECTS-prope.patch index cfcfd4c..83116b9 100644 --- a/0013-xwayland-Set-_XWAYLAND_RANDR_EMU_MONITOR_RECTS-prope.patch +++ b/0013-xwayland-Set-_XWAYLAND_RANDR_EMU_MONITOR_RECTS-prope.patch @@ -1,4 +1,4 @@ -From dda4a8b2f672eb5791f39222dd0996e07b416eb7 Mon Sep 17 00:00:00 2001 +From e40d94637207543481769fb570515b782225ff09 Mon Sep 17 00:00:00 2001 From: Hans de Goede Date: Mon, 2 Sep 2019 17:32:45 +0200 Subject: [PATCH xserver 13/24] xwayland: Set _XWAYLAND_RANDR_EMU_MONITOR_RECTS @@ -37,7 +37,7 @@ Signed-off-by: Hans de Goede 3 files changed, 103 insertions(+) diff --git a/hw/xwayland/xwayland-output.c b/hw/xwayland/xwayland-output.c -index 99ab1b288..20c254962 100644 +index e09d00108..0d6b9ac9f 100644 --- a/hw/xwayland/xwayland-output.c +++ b/hw/xwayland/xwayland-output.c @@ -29,6 +29,7 @@ @@ -46,9 +46,9 @@ index 99ab1b288..20c254962 100644 #include +#include - #define DEFAULT_DPI 96 #define ALL_ROTATIONS (RR_Rotate_0 | \ -@@ -428,6 +429,80 @@ xwl_output_find_mode(struct xwl_output *xwl_output, + RR_Rotate_90 | \ +@@ -391,6 +392,80 @@ xwl_output_find_mode(struct xwl_output *xwl_output, return NULL; } @@ -129,7 +129,7 @@ index 99ab1b288..20c254962 100644 void xwl_output_set_emulated_mode(struct xwl_output *xwl_output, ClientPtr client, RRModePtr mode, Bool from_vidmode) -@@ -442,6 +517,8 @@ xwl_output_set_emulated_mode(struct xwl_output *xwl_output, ClientPtr client, +@@ -405,6 +480,8 @@ xwl_output_set_emulated_mode(struct xwl_output *xwl_output, ClientPtr client, xwl_output_add_emulated_mode_for_client(xwl_output, client, mode, from_vidmode); xwl_screen_check_resolution_change_emulation(xwl_output->xwl_screen); @@ -139,10 +139,10 @@ index 99ab1b288..20c254962 100644 static void diff --git a/hw/xwayland/xwayland.c b/hw/xwayland/xwayland.c -index 85036adfe..e43f3de96 100644 +index 2e01822fd..ac4d98e6a 100644 --- a/hw/xwayland/xwayland.c +++ b/hw/xwayland/xwayland.c -@@ -690,6 +690,27 @@ xwl_screen_check_resolution_change_emulation(struct xwl_screen *xwl_screen) +@@ -692,6 +692,27 @@ xwl_screen_check_resolution_change_emulation(struct xwl_screen *xwl_screen) xwl_window_check_resolution_change_emulation(xwl_window); } @@ -170,7 +170,7 @@ index 85036adfe..e43f3de96 100644 static void xwl_window_init_allow_commits(struct xwl_window *xwl_window) { -@@ -855,6 +876,8 @@ xwl_realize_window(WindowPtr window) +@@ -857,6 +878,8 @@ xwl_realize_window(WindowPtr window) return FALSE; } @@ -180,10 +180,10 @@ index 85036adfe..e43f3de96 100644 } diff --git a/hw/xwayland/xwayland.h b/hw/xwayland/xwayland.h -index 9adf3af76..eb8c4bd70 100644 +index 36c4c4c8b..1317ae5bb 100644 --- a/hw/xwayland/xwayland.h +++ b/hw/xwayland/xwayland.h -@@ -418,6 +418,7 @@ Bool xwl_screen_has_resolution_change_emulation(struct xwl_screen *xwl_screen); +@@ -420,6 +420,7 @@ Bool xwl_screen_has_resolution_change_emulation(struct xwl_screen *xwl_screen); struct xwl_output *xwl_screen_get_first_output(struct xwl_screen *xwl_screen); void xwl_screen_check_resolution_change_emulation(struct xwl_screen *xwl_screen); Bool xwl_window_has_viewport_enabled(struct xwl_window *xwl_window); @@ -191,7 +191,7 @@ index 9adf3af76..eb8c4bd70 100644 void xwl_tablet_tool_set_cursor(struct xwl_tablet_tool *tool); void xwl_seat_set_cursor(struct xwl_seat *xwl_seat); -@@ -456,6 +457,8 @@ RRModePtr xwl_output_find_mode(struct xwl_output *xwl_output, +@@ -458,6 +459,8 @@ RRModePtr xwl_output_find_mode(struct xwl_output *xwl_output, void xwl_output_set_emulated_mode(struct xwl_output *xwl_output, ClientPtr client, RRModePtr mode, Bool from_vidmode); @@ -201,5 +201,5 @@ index 9adf3af76..eb8c4bd70 100644 RRModePtr xwayland_cvt(int HDisplay, int VDisplay, float VRefresh, Bool Reduced, Bool Interlaced); -- -2.25.2 +2.26.2 diff --git a/0014-present-Add-present_vblank-exec_msc-field.patch b/0014-present-Add-present_vblank-exec_msc-field.patch new file mode 100644 index 0000000..e15a7df --- /dev/null +++ b/0014-present-Add-present_vblank-exec_msc-field.patch @@ -0,0 +1,236 @@ +From 669e40390c3679b649db33f0aa4ae4cfdd17e2a9 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Michel=20D=C3=A4nzer?= +Date: Fri, 11 Sep 2020 17:00:35 +0200 +Subject: [PATCH xserver 14/16] present: Add present_vblank::exec_msc field +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +For tracking the MSC when the present can be executed separately from +the target MSC. + +Allows removing the requeue field instead, plus more later. + +v2: +* Rename wait_msc → exec_msc (Roman Gilg) +* Use exec_msc = target_msc instead of exec_msc++, for clarity. +* Bug fix: Set exec_msc = target_msc also if present_flip returned + false in present_execute. +v3: +* Set exec_msc = target_msc also if present_wnmd_flip returned + false in present_wnmd_execute, for consistency. +v4: +* Specifically check for exec_msc == crtc_msc + 1 in + present_execute_wait/copy, to avoid re-introducing + https://bugs.freedesktop.org/show_bug.cgi?id=94596 . + +Reviewed-by: Roman Gilg +Tested-by: Roman Gilg +(cherry picked from commit b0b3159abd8001fa3f6dfc44a288a95a62aa5cf6) +--- + present/present_execute.c | 23 ++++++++++------------- + present/present_priv.h | 4 ++-- + present/present_scmd.c | 13 +++++++------ + present/present_vblank.c | 9 +++++---- + present/present_wnmd.c | 13 +++++++------ + 5 files changed, 31 insertions(+), 31 deletions(-) + +diff --git a/present/present_execute.c b/present/present_execute.c +index 8d1ef4a8c..58066db86 100644 +--- a/present/present_execute.c ++++ b/present/present_execute.c +@@ -48,16 +48,13 @@ present_execute_wait(present_vblank_ptr vblank, uint64_t crtc_msc) + ScreenPtr screen = window->drawable.pScreen; + present_screen_priv_ptr screen_priv = present_screen_priv(screen); + +- if (vblank->requeue) { +- vblank->requeue = FALSE; +- if (msc_is_after(vblank->target_msc, crtc_msc) && +- Success == screen_priv->queue_vblank(screen, +- window, +- vblank->crtc, +- vblank->event_id, +- vblank->target_msc)) +- return TRUE; +- } ++ /* We may have to requeue for the next MSC if check_flip_window prevented ++ * using a flip. ++ */ ++ if (vblank->exec_msc == crtc_msc + 1 && ++ screen_priv->queue_vblank(screen, window, vblank->crtc, vblank->event_id, ++ vblank->exec_msc) == Success) ++ return TRUE; + + if (vblank->wait_fence) { + if (!present_fence_check_triggered(vblank->wait_fence)) { +@@ -75,13 +72,13 @@ present_execute_copy(present_vblank_ptr vblank, uint64_t crtc_msc) + ScreenPtr screen = window->drawable.pScreen; + present_screen_priv_ptr screen_priv = present_screen_priv(screen); + +- /* If present_flip failed, we may have to requeue for the target MSC */ +- if (vblank->target_msc == crtc_msc + 1 && ++ /* If present_flip failed, we may have to requeue for the next MSC */ ++ if (vblank->exec_msc == crtc_msc + 1 && + Success == screen_priv->queue_vblank(screen, + window, + vblank->crtc, + vblank->event_id, +- vblank->target_msc)) { ++ vblank->exec_msc)) { + vblank->queued = TRUE; + return; + } +diff --git a/present/present_priv.h b/present/present_priv.h +index 90c3f4e79..f34edd5cf 100644 +--- a/present/present_priv.h ++++ b/present/present_priv.h +@@ -70,14 +70,14 @@ struct present_vblank { + int16_t y_off; + CARD16 kind; + uint64_t event_id; +- uint64_t target_msc; ++ uint64_t target_msc; /* target MSC when present should complete */ ++ uint64_t exec_msc; /* MSC at which present can be executed */ + uint64_t msc_offset; + present_fence_ptr idle_fence; + present_fence_ptr wait_fence; + present_notify_ptr notifies; + int num_notifies; + Bool queued; /* on present_exec_queue */ +- Bool requeue; /* on queue, but target_msc has changed */ + Bool flip; /* planning on using flip */ + Bool flip_ready; /* wants to flip, but waiting for previous flip or unflip */ + Bool flip_idler; /* driver explicitly permitted idling */ +diff --git a/present/present_scmd.c b/present/present_scmd.c +index a4d046ca8..3e3ae3477 100644 +--- a/present/present_scmd.c ++++ b/present/present_scmd.c +@@ -361,8 +361,8 @@ present_flip_notify(present_vblank_ptr vblank, uint64_t ust, uint64_t crtc_msc) + ScreenPtr screen = vblank->screen; + present_screen_priv_ptr screen_priv = present_screen_priv(screen); + +- DebugPresent(("\tn %" PRIu64 " %p %" PRIu64 ": %08" PRIx32 " -> %08" PRIx32 "\n", +- vblank->event_id, vblank, vblank->target_msc, ++ DebugPresent(("\tn %" PRIu64 " %p %" PRIu64 " %" PRIu64 ": %08" PRIx32 " -> %08" PRIx32 "\n", ++ vblank->event_id, vblank, vblank->exec_msc, vblank->target_msc, + vblank->pixmap ? vblank->pixmap->drawable.id : 0, + vblank->window ? vblank->window->drawable.id : 0)); + +@@ -482,7 +482,7 @@ present_check_flip_window (WindowPtr window) + vblank->flip = FALSE; + vblank->reason = reason; + if (vblank->sync_flip) +- vblank->requeue = TRUE; ++ vblank->exec_msc = vblank->target_msc; + } + } + } +@@ -608,6 +608,7 @@ present_execute(present_vblank_ptr vblank, uint64_t ust, uint64_t crtc_msc) + */ + screen_priv->flip_pending = NULL; + vblank->flip = FALSE; ++ vblank->exec_msc = vblank->target_msc; + } + DebugPresent(("\tc %p %" PRIu64 ": %08" PRIx32 " -> %08" PRIx32 "\n", + vblank, crtc_msc, vblank->pixmap->drawable.id, vblank->window->drawable.id)); +@@ -752,12 +753,12 @@ present_scmd_pixmap(WindowPtr window, + return BadAlloc; + + if (vblank->flip && vblank->sync_flip) +- target_msc--; ++ vblank->exec_msc--; + + xorg_list_append(&vblank->event_queue, &present_exec_queue); + vblank->queued = TRUE; +- if (msc_is_after(target_msc, crtc_msc)) { +- ret = present_queue_vblank(screen, window, target_crtc, vblank->event_id, target_msc); ++ if (msc_is_after(vblank->exec_msc, crtc_msc)) { ++ ret = present_queue_vblank(screen, window, target_crtc, vblank->event_id, vblank->exec_msc); + if (ret == Success) + return Success; + +diff --git a/present/present_vblank.c b/present/present_vblank.c +index a4b70c0d9..af14fe134 100644 +--- a/present/present_vblank.c ++++ b/present/present_vblank.c +@@ -101,6 +101,7 @@ present_vblank_create(WindowPtr window, + vblank->x_off = x_off; + vblank->y_off = y_off; + vblank->target_msc = target_msc; ++ vblank->exec_msc = target_msc; + vblank->crtc = target_crtc; + vblank->msc_offset = window_priv->msc_offset; + vblank->notifies = notifies; +@@ -152,8 +153,8 @@ no_mem: + void + present_vblank_scrap(present_vblank_ptr vblank) + { +- DebugPresent(("\tx %" PRIu64 " %p %" PRIu64 ": %08" PRIx32 " -> %08" PRIx32 " (crtc %p)\n", +- vblank->event_id, vblank, vblank->target_msc, ++ DebugPresent(("\tx %" PRIu64 " %p %" PRIu64 " %" PRIu64 ": %08" PRIx32 " -> %08" PRIx32 " (crtc %p)\n", ++ vblank->event_id, vblank, vblank->exec_msc, vblank->target_msc, + vblank->pixmap->drawable.id, vblank->window->drawable.id, + vblank->crtc)); + +@@ -174,8 +175,8 @@ present_vblank_destroy(present_vblank_ptr vblank) + /* Also make sure vblank is removed from event queue (wnmd) */ + xorg_list_del(&vblank->event_queue); + +- DebugPresent(("\td %" PRIu64 " %p %" PRIu64 ": %08" PRIx32 " -> %08" PRIx32 "\n", +- vblank->event_id, vblank, vblank->target_msc, ++ DebugPresent(("\td %" PRIu64 " %p %" PRIu64 " %" PRIu64 ": %08" PRIx32 " -> %08" PRIx32 "\n", ++ vblank->event_id, vblank, vblank->exec_msc, vblank->target_msc, + vblank->pixmap ? vblank->pixmap->drawable.id : 0, + vblank->window ? vblank->window->drawable.id : 0)); + +diff --git a/present/present_wnmd.c b/present/present_wnmd.c +index 31e83d6ee..339e93edb 100644 +--- a/present/present_wnmd.c ++++ b/present/present_wnmd.c +@@ -168,8 +168,8 @@ present_wnmd_flip_notify(present_vblank_ptr vblank, uint64_t ust, uint64_t crtc_ + WindowPtr window = vblank->window; + present_window_priv_ptr window_priv = present_window_priv(window); + +- DebugPresent(("\tn %" PRIu64 " %p %" PRIu64 ": %08" PRIx32 " -> %08" PRIx32 "\n", +- vblank->event_id, vblank, vblank->target_msc, ++ DebugPresent(("\tn %" PRIu64 " %p %" PRIu64 " %" PRIu64 ": %08" PRIx32 " -> %08" PRIx32 "\n", ++ vblank->event_id, vblank, vblank->exec_msc, vblank->target_msc, + vblank->pixmap ? vblank->pixmap->drawable.id : 0, + vblank->window ? vblank->window->drawable.id : 0)); + +@@ -343,7 +343,7 @@ present_wnmd_check_flip_window (WindowPtr window) + vblank->flip = FALSE; + vblank->reason = reason; + if (vblank->sync_flip) +- vblank->requeue = TRUE; ++ vblank->exec_msc = vblank->target_msc; + } + } + } +@@ -491,6 +491,7 @@ present_wnmd_execute(present_vblank_ptr vblank, uint64_t ust, uint64_t crtc_msc) + */ + window_priv->flip_pending = NULL; + vblank->flip = FALSE; ++ vblank->exec_msc = vblank->target_msc; + } + DebugPresent(("\tc %p %" PRIu64 ": %08" PRIx32 " -> %08" PRIx32 "\n", + vblank, crtc_msc, vblank->pixmap->drawable.id, vblank->window->drawable.id)); +@@ -632,12 +633,12 @@ present_wnmd_pixmap(WindowPtr window, + return BadAlloc; + + if (vblank->flip && vblank->sync_flip) +- target_msc--; ++ vblank->exec_msc--; + + xorg_list_append(&vblank->event_queue, &window_priv->exec_queue); + vblank->queued = TRUE; +- if (crtc_msc < target_msc) { +- if (present_wnmd_queue_vblank(screen, window, target_crtc, vblank->event_id, target_msc) == Success) { ++ if (crtc_msc < vblank->exec_msc) { ++ if (present_wnmd_queue_vblank(screen, window, target_crtc, vblank->event_id, vblank->exec_msc) == Success) { + return Success; + } + DebugPresent(("present_queue_vblank failed\n")); +-- +2.28.0 + diff --git a/0014-xwayland-Cache-client-id-for-the-window-manager-clie.patch b/0014-xwayland-Cache-client-id-for-the-window-manager-clie.patch index 08c605f..1142b23 100644 --- a/0014-xwayland-Cache-client-id-for-the-window-manager-clie.patch +++ b/0014-xwayland-Cache-client-id-for-the-window-manager-clie.patch @@ -1,4 +1,4 @@ -From aa0f9ba1aa3f12f7e65ed64ac03114f27c8bff1f Mon Sep 17 00:00:00 2001 +From a35e6f9a2b15a446138f6f3e201a19833a5a2454 Mon Sep 17 00:00:00 2001 From: Hans de Goede Date: Mon, 27 Jan 2020 11:08:00 +0100 Subject: [PATCH xserver 14/24] xwayland: Cache client-id for the @@ -24,10 +24,10 @@ Signed-off-by: Hans de Goede 2 files changed, 34 insertions(+), 16 deletions(-) diff --git a/hw/xwayland/xwayland.c b/hw/xwayland/xwayland.c -index e43f3de96..f4d433bca 100644 +index ac4d98e6a..c16da330c 100644 --- a/hw/xwayland/xwayland.c +++ b/hw/xwayland/xwayland.c -@@ -576,20 +576,11 @@ xwl_window_enable_viewport(struct xwl_window *xwl_window, +@@ -578,20 +578,11 @@ xwl_window_enable_viewport(struct xwl_window *xwl_window, } static Bool @@ -51,7 +51,7 @@ index e43f3de96..f4d433bca 100644 } static ClientPtr -@@ -603,7 +594,7 @@ xwl_window_get_owner(struct xwl_window *xwl_window) +@@ -605,7 +596,7 @@ xwl_window_get_owner(struct xwl_window *xwl_window) * decoration window. In that case return the client of the * first *and only* child of the toplevel (decoration) window. */ @@ -60,7 +60,7 @@ index e43f3de96..f4d433bca 100644 if (window->firstChild && window->firstChild == window->lastChild) return wClient(window->firstChild); else -@@ -698,9 +689,7 @@ xwl_screen_check_resolution_change_emulation(struct xwl_screen *xwl_screen) +@@ -700,9 +691,7 @@ xwl_screen_check_resolution_change_emulation(struct xwl_screen *xwl_screen) Bool xwl_window_is_toplevel(WindowPtr window) { @@ -71,7 +71,7 @@ index e43f3de96..f4d433bca 100644 return FALSE; /* CSD and override-redirect toplevel windows */ -@@ -975,6 +964,30 @@ xwl_set_window_pixmap(WindowPtr window, +@@ -977,6 +966,30 @@ xwl_set_window_pixmap(WindowPtr window, ensure_surface_for_window(window); } @@ -102,7 +102,7 @@ index e43f3de96..f4d433bca 100644 static void xwl_resize_window(WindowPtr window, int x, int y, -@@ -1552,6 +1565,9 @@ xwl_screen_init(ScreenPtr pScreen, int argc, char **argv) +@@ -1576,6 +1589,9 @@ xwl_screen_init(ScreenPtr pScreen, int argc, char **argv) xwl_screen->CloseScreen = pScreen->CloseScreen; pScreen->CloseScreen = xwl_close_screen; @@ -113,7 +113,7 @@ index e43f3de96..f4d433bca 100644 pScreen->ResizeWindow = xwl_resize_window; diff --git a/hw/xwayland/xwayland.h b/hw/xwayland/xwayland.h -index eb8c4bd70..126af8823 100644 +index 1317ae5bb..f5ffadfcc 100644 --- a/hw/xwayland/xwayland.h +++ b/hw/xwayland/xwayland.h @@ -118,6 +118,7 @@ struct xwl_screen { @@ -133,5 +133,5 @@ index eb8c4bd70..126af8823 100644 struct xorg_list output_list; -- -2.25.2 +2.26.2 diff --git a/0015-present-wnmd-Move-up-present_wnmd_queue_vblank.patch b/0015-present-wnmd-Move-up-present_wnmd_queue_vblank.patch new file mode 100644 index 0000000..13f7ecd --- /dev/null +++ b/0015-present-wnmd-Move-up-present_wnmd_queue_vblank.patch @@ -0,0 +1,58 @@ +From 96ef31e0f20fcffb2edfe4cb9510f994c188785f Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Michel=20D=C3=A4nzer?= +Date: Tue, 28 Jul 2020 18:53:45 +0200 +Subject: [PATCH xserver 15/16] present/wnmd: Move up present_wnmd_queue_vblank + +Allowing it to be called from more functions than before. No functional +change. + +Reviewed-by: Roman Gilg +Tested-by: Roman Gilg +(cherry picked from commit d14ea667feccf085c7d66a7c63f380975e07af66) +--- + present/present_wnmd.c | 22 +++++++++++----------- + 1 file changed, 11 insertions(+), 11 deletions(-) + +diff --git a/present/present_wnmd.c b/present/present_wnmd.c +index 339e93edb..2c11e53f5 100644 +--- a/present/present_wnmd.c ++++ b/present/present_wnmd.c +@@ -42,6 +42,17 @@ + static void + present_wnmd_execute(present_vblank_ptr vblank, uint64_t ust, uint64_t crtc_msc); + ++static int ++present_wnmd_queue_vblank(ScreenPtr screen, ++ WindowPtr window, ++ RRCrtcPtr crtc, ++ uint64_t event_id, ++ uint64_t msc) ++{ ++ present_screen_priv_ptr screen_priv = present_screen_priv(screen); ++ return (*screen_priv->wnmd_info->queue_vblank) (window, crtc, event_id, msc); ++} ++ + static void + present_wnmd_create_event_id(present_window_priv_ptr window_priv, present_vblank_ptr vblank) + { +@@ -511,17 +522,6 @@ present_wnmd_execute(present_vblank_ptr vblank, uint64_t ust, uint64_t crtc_msc) + present_execute_post(vblank, ust, crtc_msc); + } + +-static int +-present_wnmd_queue_vblank(ScreenPtr screen, +- WindowPtr window, +- RRCrtcPtr crtc, +- uint64_t event_id, +- uint64_t msc) +-{ +- present_screen_priv_ptr screen_priv = present_screen_priv(screen); +- return (*screen_priv->wnmd_info->queue_vblank) (window, crtc, event_id, msc); +-} +- + static uint64_t + present_wnmd_window_to_crtc_msc(WindowPtr window, RRCrtcPtr crtc, uint64_t window_msc, uint64_t new_msc) + { +-- +2.28.0 + diff --git a/0015-xwayland-Reuse-viewport-instead-of-recreating.patch b/0015-xwayland-Reuse-viewport-instead-of-recreating.patch index 3f6cb2d..9fa0e06 100644 --- a/0015-xwayland-Reuse-viewport-instead-of-recreating.patch +++ b/0015-xwayland-Reuse-viewport-instead-of-recreating.patch @@ -1,4 +1,4 @@ -From 1f39cb2ef51c72ec0c448c5d9571540bb0d9f3eb Mon Sep 17 00:00:00 2001 +From e4d8f7770e27ed56e23e0ef2a87bed8cb4fa28e0 Mon Sep 17 00:00:00 2001 From: Roman Gilg Date: Fri, 3 Jan 2020 17:12:14 +0100 Subject: [PATCH xserver 15/24] xwayland: Reuse viewport instead of recreating @@ -17,10 +17,10 @@ Signed-off-by: Hans de Goede 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/hw/xwayland/xwayland.c b/hw/xwayland/xwayland.c -index f4d433bca..320589dde 100644 +index c16da330c..ac301ae4a 100644 --- a/hw/xwayland/xwayland.c +++ b/hw/xwayland/xwayland.c -@@ -550,17 +550,13 @@ xwl_window_enable_viewport(struct xwl_window *xwl_window, +@@ -552,17 +552,13 @@ xwl_window_enable_viewport(struct xwl_window *xwl_window, struct xwl_output *xwl_output, struct xwl_emulated_mode *emulated_mode) { @@ -46,5 +46,5 @@ index f4d433bca..320589dde 100644 wp_viewport_set_source(xwl_window->viewport, wl_fixed_from_int(0), -- -2.25.2 +2.26.2 diff --git a/0016-present-wnmd-Execute-copies-at-target_msc-1-already.patch b/0016-present-wnmd-Execute-copies-at-target_msc-1-already.patch new file mode 100644 index 0000000..a761129 --- /dev/null +++ b/0016-present-wnmd-Execute-copies-at-target_msc-1-already.patch @@ -0,0 +1,139 @@ +From c3e4c1a0fd5d4d6015e9e6317b758018317e56d1 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Michel=20D=C3=A4nzer?= +Date: Tue, 28 Jul 2020 18:40:47 +0200 +Subject: [PATCH xserver 16/16] present/wnmd: Execute copies at target_msc-1 + already + +It always takes one update cycle for the copy to become visible on the +host windowing system, so waiting for the target MSC resulted in 1 cycle +delay. + +We re-use the idle list for copies which were executed but need their +completion event sent. + +Fixes black seams when resizing the "Builder" sub-window of + + GDK_BACKEND=x11 gtk4-demo + +on Xwayland (see +https://gitlab.gnome.org/GNOME/mutter/-/issues/1290#note_873557). + +Unfortunately, this cannot completely fix the seams with apps which +queue up multiple frames in advance, since there's always at least one +queued frame corresponding to the old window size. But it should at +least help a little in that case as well. + +v2: +* Bug fix: Don't update exec_msc in present_wnmd_check_flip_window. + (Roman Gilg) +* Use exec_msc = target_msc - 1 instead of exec_msc--, and add a + comment, for clarity. +v3: +* Drop exec_msc = target_msc again in present_wnmd_execute. +* present_execute_copy should never set vblank->queued in + present_wnmd_execute now, so replace that branch with an assertion. + (Roman Gilg) + +Reviewed-by: Roman Gilg +Tested-by: Roman Gilg +(cherry picked from commit 1cccb486d48a5d2e7649836b993805bb65dc09e3) +[Since present_wnmd_event_notify hasn't been split up on the 1.20 +branch, it needs to check vblank->flip. Doing the same in +present_wnmd_free_idle_vblanks to be safe, though I'm not sure it's +actually possible to hit non-flips there.] +--- + present/present_wnmd.c | 28 ++++++++++++++++++---------- + 1 file changed, 18 insertions(+), 10 deletions(-) + +diff --git a/present/present_wnmd.c b/present/present_wnmd.c +index 2c11e53f5..8c31619a2 100644 +--- a/present/present_wnmd.c ++++ b/present/present_wnmd.c +@@ -122,7 +122,8 @@ present_wnmd_free_idle_vblanks(WindowPtr window) + present_vblank_ptr vblank, tmp; + + xorg_list_for_each_entry_safe(vblank, tmp, &window_priv->idle_queue, event_queue) { +- present_wnmd_free_idle_vblank(vblank); ++ if (vblank->flip) ++ present_wnmd_free_idle_vblank(vblank); + } + + if (window_priv->flip_active) { +@@ -245,7 +246,12 @@ present_wnmd_event_notify(WindowPtr window, uint64_t event_id, uint64_t ust, uin + + xorg_list_for_each_entry(vblank, &window_priv->idle_queue, event_queue) { + if (vblank->event_id == event_id) { +- present_wnmd_free_idle_vblank(vblank); ++ if (vblank->flip) ++ present_wnmd_free_idle_vblank(vblank); ++ else ++ /* Copies which were executed but need their completion event sent */ ++ present_execute_post(vblank, ust, msc); ++ + return; + } + } +@@ -353,8 +359,6 @@ present_wnmd_check_flip_window (WindowPtr window) + vblank->sync_flip, vblank->valid, 0, 0, &reason)) { + vblank->flip = FALSE; + vblank->reason = reason; +- if (vblank->sync_flip) +- vblank->exec_msc = vblank->target_msc; + } + } + } +@@ -454,6 +458,7 @@ present_wnmd_execute(present_vblank_ptr vblank, uint64_t ust, uint64_t crtc_msc) + vblank->queued = FALSE; + + if (vblank->pixmap && vblank->window) { ++ ScreenPtr screen = window->drawable.pScreen; + + if (vblank->flip) { + RegionPtr damage; +@@ -479,7 +484,6 @@ present_wnmd_execute(present_vblank_ptr vblank, uint64_t ust, uint64_t crtc_msc) + // ask the driver + if (present_wnmd_flip(vblank->window, vblank->crtc, vblank->event_id, + vblank->target_msc, vblank->pixmap, vblank->sync_flip, damage)) { +- ScreenPtr screen = window->drawable.pScreen; + WindowPtr toplvl_window = present_wnmd_toplvl_pixmap_window(vblank->window); + PixmapPtr old_pixmap = screen->GetWindowPixmap(window); + +@@ -502,7 +506,6 @@ present_wnmd_execute(present_vblank_ptr vblank, uint64_t ust, uint64_t crtc_msc) + */ + window_priv->flip_pending = NULL; + vblank->flip = FALSE; +- vblank->exec_msc = vblank->target_msc; + } + DebugPresent(("\tc %p %" PRIu64 ": %08" PRIx32 " -> %08" PRIx32 "\n", + vblank, crtc_msc, vblank->pixmap->drawable.id, vblank->window->drawable.id)); +@@ -510,9 +513,12 @@ present_wnmd_execute(present_vblank_ptr vblank, uint64_t ust, uint64_t crtc_msc) + present_wnmd_cancel_flip(window); + + present_execute_copy(vblank, crtc_msc); ++ assert(!vblank->queued); + +- if (vblank->queued) { +- xorg_list_add(&vblank->event_queue, &window_priv->exec_queue); ++ if (present_wnmd_queue_vblank(screen, window, vblank->crtc, ++ vblank->event_id, crtc_msc + 1) ++ == Success) { ++ xorg_list_add(&vblank->event_queue, &window_priv->idle_queue); + xorg_list_append(&vblank->window_list, &window_priv->vblank); + + return; +@@ -632,8 +638,10 @@ present_wnmd_pixmap(WindowPtr window, + if (!vblank) + return BadAlloc; + +- if (vblank->flip && vblank->sync_flip) +- vblank->exec_msc--; ++ /* WNMD presentations always complete (at least) one frame after they ++ * are executed ++ */ ++ vblank->exec_msc = vblank->target_msc - 1; + + xorg_list_append(&vblank->event_queue, &window_priv->exec_queue); + vblank->queued = TRUE; +-- +2.28.0 + diff --git a/0016-xwayland-Recurse-on-finding-the-none-wm-owner.patch b/0016-xwayland-Recurse-on-finding-the-none-wm-owner.patch index 8299c92..558f3bf 100644 --- a/0016-xwayland-Recurse-on-finding-the-none-wm-owner.patch +++ b/0016-xwayland-Recurse-on-finding-the-none-wm-owner.patch @@ -1,4 +1,4 @@ -From 8cedbfd448edf410a45c57addcee0e7304f11b86 Mon Sep 17 00:00:00 2001 +From 66a026eeaa49e1042d4d2ec655e78771e1acd9df Mon Sep 17 00:00:00 2001 From: Roman Gilg Date: Fri, 3 Jan 2020 17:27:28 +0100 Subject: [PATCH xserver 16/24] xwayland: Recurse on finding the none-wm owner @@ -28,10 +28,10 @@ Signed-off-by: Hans de Goede 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/hw/xwayland/xwayland.c b/hw/xwayland/xwayland.c -index 320589dde..f42b80b90 100644 +index ac301ae4a..94e3a18fa 100644 --- a/hw/xwayland/xwayland.c +++ b/hw/xwayland/xwayland.c -@@ -580,19 +580,18 @@ window_is_wm_window(WindowPtr window) +@@ -582,19 +582,18 @@ window_is_wm_window(WindowPtr window) } static ClientPtr @@ -56,7 +56,7 @@ index 320589dde..f42b80b90 100644 else return NULL; /* Should never happen, skip resolution emulation */ } -@@ -613,7 +612,7 @@ xwl_window_should_enable_viewport(struct xwl_window *xwl_window, +@@ -615,7 +614,7 @@ xwl_window_should_enable_viewport(struct xwl_window *xwl_window, if (!xwl_screen_has_resolution_change_emulation(xwl_screen)) return FALSE; @@ -65,7 +65,7 @@ index 320589dde..f42b80b90 100644 if (!owner) return FALSE; -@@ -692,8 +691,8 @@ xwl_window_is_toplevel(WindowPtr window) +@@ -694,8 +693,8 @@ xwl_window_is_toplevel(WindowPtr window) if (window_get_damage(window)) return TRUE; @@ -77,5 +77,5 @@ index 320589dde..f42b80b90 100644 static void -- -2.25.2 +2.26.2 diff --git a/0017-xwayland-Make-window_get_none_wm_owner-return-a-Wind.patch b/0017-xwayland-Make-window_get_none_wm_owner-return-a-Wind.patch index b9a2331..75b5ddc 100644 --- a/0017-xwayland-Make-window_get_none_wm_owner-return-a-Wind.patch +++ b/0017-xwayland-Make-window_get_none_wm_owner-return-a-Wind.patch @@ -1,4 +1,4 @@ -From 939a78925a1d591e6aaf291a6609b9c6e54ee6ce Mon Sep 17 00:00:00 2001 +From 8b9a66212bacd780f1a8ac37cbb490b650843c28 Mon Sep 17 00:00:00 2001 From: Roman Gilg Date: Wed, 15 Jan 2020 10:07:58 +0100 Subject: [PATCH xserver 17/24] xwayland: Make window_get_none_wm_owner return @@ -25,10 +25,10 @@ Signed-off-by: Hans de Goede 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/hw/xwayland/xwayland.c b/hw/xwayland/xwayland.c -index f42b80b90..d70d729ae 100644 +index 94e3a18fa..c60a2ce67 100644 --- a/hw/xwayland/xwayland.c +++ b/hw/xwayland/xwayland.c -@@ -579,10 +579,10 @@ window_is_wm_window(WindowPtr window) +@@ -581,10 +581,10 @@ window_is_wm_window(WindowPtr window) return CLIENT_ID(window->drawable.id) == xwl_screen->wm_client_id; } @@ -42,7 +42,7 @@ index f42b80b90..d70d729ae 100644 /* If the toplevel window is owned by the window-manager, then the * actual client toplevel window has been reparented to some window-manager -@@ -591,12 +591,12 @@ window_get_none_wm_owner(WindowPtr window) +@@ -593,12 +593,12 @@ window_get_none_wm_owner(WindowPtr window) */ if (window_is_wm_window(window)) { if (window->firstChild && window->firstChild == window->lastChild) @@ -57,7 +57,7 @@ index f42b80b90..d70d729ae 100644 } static Bool -@@ -608,14 +608,17 @@ xwl_window_should_enable_viewport(struct xwl_window *xwl_window, +@@ -610,14 +610,17 @@ xwl_window_should_enable_viewport(struct xwl_window *xwl_window, struct xwl_emulated_mode *emulated_mode; struct xwl_output *xwl_output; ClientPtr owner; @@ -78,5 +78,5 @@ index f42b80b90..d70d729ae 100644 * This path gets hit by most games / libs (e.g. SDL, SFML, OGRE) */ -- -2.25.2 +2.26.2 diff --git a/0018-xwayland-Check-emulation-on-client-toplevel-resize.patch b/0018-xwayland-Check-emulation-on-client-toplevel-resize.patch index dcc0f5e..b268bb9 100644 --- a/0018-xwayland-Check-emulation-on-client-toplevel-resize.patch +++ b/0018-xwayland-Check-emulation-on-client-toplevel-resize.patch @@ -1,4 +1,4 @@ -From c5d9cb5f4bc4f703b66fc524a76247c742490b30 Mon Sep 17 00:00:00 2001 +From da3e06f4bed7fa60838ce89a0b45ea73c7d9615c Mon Sep 17 00:00:00 2001 From: Roman Gilg Date: Fri, 3 Jan 2020 17:55:28 +0100 Subject: [PATCH xserver 18/24] xwayland: Check emulation on client toplevel @@ -25,10 +25,10 @@ Signed-off-by: Hans de Goede 2 files changed, 11 insertions(+), 17 deletions(-) diff --git a/hw/xwayland/xwayland.c b/hw/xwayland/xwayland.c -index d70d729ae..14227a327 100644 +index c60a2ce67..898a291fd 100644 --- a/hw/xwayland/xwayland.c +++ b/hw/xwayland/xwayland.c -@@ -609,6 +609,7 @@ xwl_window_should_enable_viewport(struct xwl_window *xwl_window, +@@ -611,6 +611,7 @@ xwl_window_should_enable_viewport(struct xwl_window *xwl_window, struct xwl_output *xwl_output; ClientPtr owner; WindowPtr window; @@ -36,7 +36,7 @@ index d70d729ae..14227a327 100644 if (!xwl_screen_has_resolution_change_emulation(xwl_screen)) return FALSE; -@@ -618,6 +619,7 @@ xwl_window_should_enable_viewport(struct xwl_window *xwl_window, +@@ -620,6 +621,7 @@ xwl_window_should_enable_viewport(struct xwl_window *xwl_window, return FALSE; owner = wClient(window); @@ -44,7 +44,7 @@ index d70d729ae..14227a327 100644 /* 1. Test if the window matches the emulated mode on one of the outputs * This path gets hit by most games / libs (e.g. SDL, SFML, OGRE) -@@ -627,10 +629,10 @@ xwl_window_should_enable_viewport(struct xwl_window *xwl_window, +@@ -629,10 +631,10 @@ xwl_window_should_enable_viewport(struct xwl_window *xwl_window, if (!emulated_mode) continue; @@ -59,7 +59,7 @@ index d70d729ae..14227a327 100644 *emulated_mode_ret = emulated_mode; *xwl_output_ret = xwl_output; -@@ -646,9 +648,9 @@ xwl_window_should_enable_viewport(struct xwl_window *xwl_window, +@@ -648,9 +650,9 @@ xwl_window_should_enable_viewport(struct xwl_window *xwl_window, emulated_mode = xwl_output_get_emulated_mode_for_client(xwl_output, owner); if (xwl_output && xwl_window->window->overrideRedirect && emulated_mode && emulated_mode->from_vidmode && @@ -72,7 +72,7 @@ index d70d729ae..14227a327 100644 *emulated_mode_ret = emulated_mode; *xwl_output_ret = xwl_output; -@@ -768,8 +770,6 @@ ensure_surface_for_window(WindowPtr window) +@@ -770,8 +772,6 @@ ensure_surface_for_window(WindowPtr window) xwl_window->xwl_screen = xwl_screen; xwl_window->window = window; @@ -81,7 +81,7 @@ index d70d729ae..14227a327 100644 xwl_window->surface = wl_compositor_create_surface(xwl_screen->compositor); if (xwl_window->surface == NULL) { ErrorF("wl_display_create_surface failed\n"); -@@ -997,20 +997,15 @@ xwl_resize_window(WindowPtr window, +@@ -999,20 +999,15 @@ xwl_resize_window(WindowPtr window, struct xwl_window *xwl_window; xwl_screen = xwl_screen_get(screen); @@ -105,7 +105,7 @@ index d70d729ae..14227a327 100644 static void diff --git a/hw/xwayland/xwayland.h b/hw/xwayland/xwayland.h -index 126af8823..01aef27d2 100644 +index f5ffadfcc..0d0baac9b 100644 --- a/hw/xwayland/xwayland.h +++ b/hw/xwayland/xwayland.h @@ -184,7 +184,6 @@ struct xwl_window { @@ -117,5 +117,5 @@ index 126af8823..01aef27d2 100644 struct wl_shell_surface *shell_surface; WindowPtr window; -- -2.25.2 +2.26.2 diff --git a/0019-xwayland-Also-check-resolution-change-emulation-when.patch b/0019-xwayland-Also-check-resolution-change-emulation-when.patch index a1c0e84..42e24e8 100644 --- a/0019-xwayland-Also-check-resolution-change-emulation-when.patch +++ b/0019-xwayland-Also-check-resolution-change-emulation-when.patch @@ -1,4 +1,4 @@ -From 63b0c0d76d1020f0cac331f3eff30fba07f79965 Mon Sep 17 00:00:00 2001 +From 09eb525863ab6c08fd743a637f7da9d10c0c01eb Mon Sep 17 00:00:00 2001 From: Hans de Goede Date: Wed, 15 Jan 2020 14:36:45 +0100 Subject: [PATCH xserver 19/24] xwayland: Also check @@ -28,10 +28,10 @@ Signed-off-by: Hans de Goede 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hw/xwayland/xwayland.c b/hw/xwayland/xwayland.c -index 14227a327..298ef3ac8 100644 +index 898a291fd..b40502dad 100644 --- a/hw/xwayland/xwayland.c +++ b/hw/xwayland/xwayland.c -@@ -1004,7 +1004,7 @@ xwl_resize_window(WindowPtr window, +@@ -1006,7 +1006,7 @@ xwl_resize_window(WindowPtr window, xwl_screen->ResizeWindow = screen->ResizeWindow; screen->ResizeWindow = xwl_resize_window; @@ -41,5 +41,5 @@ index 14227a327..298ef3ac8 100644 } -- -2.25.2 +2.26.2 diff --git a/0020-xwayland-Also-hook-screen-s-MoveWindow-method.patch b/0020-xwayland-Also-hook-screen-s-MoveWindow-method.patch index 51f3fe8..dedf011 100644 --- a/0020-xwayland-Also-hook-screen-s-MoveWindow-method.patch +++ b/0020-xwayland-Also-hook-screen-s-MoveWindow-method.patch @@ -1,4 +1,4 @@ -From 309e6e549adc5a164541d16822745c022cd8574b Mon Sep 17 00:00:00 2001 +From 9f2ebb5f07dc3fff8e061b21fa175d3d958d0ee4 Mon Sep 17 00:00:00 2001 From: Hans de Goede Date: Thu, 9 Jan 2020 11:00:36 +0100 Subject: [PATCH xserver 20/24] xwayland: Also hook screen's MoveWindow method @@ -24,10 +24,10 @@ Signed-off-by: Hans de Goede 2 files changed, 26 insertions(+) diff --git a/hw/xwayland/xwayland.c b/hw/xwayland/xwayland.c -index 298ef3ac8..1294ff1d8 100644 +index b40502dad..7111e20ae 100644 --- a/hw/xwayland/xwayland.c +++ b/hw/xwayland/xwayland.c -@@ -1008,6 +1008,28 @@ xwl_resize_window(WindowPtr window, +@@ -1010,6 +1010,28 @@ xwl_resize_window(WindowPtr window, xwl_window_check_resolution_change_emulation(xwl_window); } @@ -56,7 +56,7 @@ index 298ef3ac8..1294ff1d8 100644 static void frame_callback(void *data, struct wl_callback *callback, -@@ -1564,6 +1586,9 @@ xwl_screen_init(ScreenPtr pScreen, int argc, char **argv) +@@ -1588,6 +1610,9 @@ xwl_screen_init(ScreenPtr pScreen, int argc, char **argv) xwl_screen->ResizeWindow = pScreen->ResizeWindow; pScreen->ResizeWindow = xwl_resize_window; @@ -67,7 +67,7 @@ index 298ef3ac8..1294ff1d8 100644 xwl_screen->SetWindowPixmap = pScreen->SetWindowPixmap; pScreen->SetWindowPixmap = xwl_set_window_pixmap; diff --git a/hw/xwayland/xwayland.h b/hw/xwayland/xwayland.h -index 01aef27d2..72225374b 100644 +index 0d0baac9b..451c08e23 100644 --- a/hw/xwayland/xwayland.h +++ b/hw/xwayland/xwayland.h @@ -138,6 +138,7 @@ struct xwl_screen { @@ -79,5 +79,5 @@ index 01aef27d2..72225374b 100644 struct xorg_list output_list; struct xorg_list seat_list; -- -2.25.2 +2.26.2 diff --git a/0021-xwayland-Fix-emulated-modes-not-being-removed-when-s.patch b/0021-xwayland-Fix-emulated-modes-not-being-removed-when-s.patch index 2b1bc84..b00f9bd 100644 --- a/0021-xwayland-Fix-emulated-modes-not-being-removed-when-s.patch +++ b/0021-xwayland-Fix-emulated-modes-not-being-removed-when-s.patch @@ -1,4 +1,4 @@ -From 52bbef1f55d17229684b0d76a478ec639c4032ed Mon Sep 17 00:00:00 2001 +From 958b34ce3cab02219457d5dcc25217e7c9a0beba Mon Sep 17 00:00:00 2001 From: Hans de Goede Date: Mon, 7 Oct 2019 14:27:49 +0200 Subject: [PATCH xserver 21/24] xwayland: Fix emulated modes not being removed @@ -32,10 +32,10 @@ Signed-off-by: Hans de Goede 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/hw/xwayland/xwayland-output.c b/hw/xwayland/xwayland-output.c -index 20c254962..7d705d919 100644 +index 0d6b9ac9f..4bc9cd6b8 100644 --- a/hw/xwayland/xwayland-output.c +++ b/hw/xwayland/xwayland-output.c -@@ -309,8 +309,11 @@ xwl_output_remove_emulated_mode_for_client(struct xwl_output *xwl_output, +@@ -272,8 +272,11 @@ xwl_output_remove_emulated_mode_for_client(struct xwl_output *xwl_output, struct xwl_emulated_mode *emulated_mode; emulated_mode = xwl_output_get_emulated_mode_for_client(xwl_output, client); @@ -48,7 +48,7 @@ index 20c254962..7d705d919 100644 } /* From hw/xfree86/common/xf86DefModeSet.c with some obscure modes dropped */ -@@ -511,7 +514,8 @@ xwl_output_set_emulated_mode(struct xwl_output *xwl_output, ClientPtr client, +@@ -474,7 +477,8 @@ xwl_output_set_emulated_mode(struct xwl_output *xwl_output, ClientPtr client, from_vidmode ? "vidmode" : "randr", mode->mode.width, mode->mode.height); @@ -59,5 +59,5 @@ index 20c254962..7d705d919 100644 else xwl_output_add_emulated_mode_for_client(xwl_output, client, mode, from_vidmode); -- -2.25.2 +2.26.2 diff --git a/0022-xwayland-Call-xwl_window_check_resolution_change_emu.patch b/0022-xwayland-Call-xwl_window_check_resolution_change_emu.patch index 0b6a07b..0fedf5d 100644 --- a/0022-xwayland-Call-xwl_window_check_resolution_change_emu.patch +++ b/0022-xwayland-Call-xwl_window_check_resolution_change_emu.patch @@ -1,4 +1,4 @@ -From 57d0ad44fd0b04fff98e9b484816dc95068a90cc Mon Sep 17 00:00:00 2001 +From 12a9c05a3088480bc7ab80902e384053f10e51a6 Mon Sep 17 00:00:00 2001 From: Hans de Goede Date: Mon, 4 Nov 2019 11:46:49 +0100 Subject: [PATCH xserver 22/24] xwayland: Call @@ -28,10 +28,10 @@ Signed-off-by: Hans de Goede 1 file changed, 5 insertions(+) diff --git a/hw/xwayland/xwayland.c b/hw/xwayland/xwayland.c -index 1294ff1d8..6b86e56bd 100644 +index 7111e20ae..734e76b2e 100644 --- a/hw/xwayland/xwayland.c +++ b/hw/xwayland/xwayland.c -@@ -819,6 +819,11 @@ ensure_surface_for_window(WindowPtr window) +@@ -821,6 +821,11 @@ ensure_surface_for_window(WindowPtr window) xwl_window_init_allow_commits(xwl_window); @@ -44,5 +44,5 @@ index 1294ff1d8..6b86e56bd 100644 err_surf: -- -2.25.2 +2.26.2 diff --git a/0023-xwayland-Fix-setting-of-_XWAYLAND_RANDR_EMU_MONITOR_.patch b/0023-xwayland-Fix-setting-of-_XWAYLAND_RANDR_EMU_MONITOR_.patch index f2654fb..dcd96a6 100644 --- a/0023-xwayland-Fix-setting-of-_XWAYLAND_RANDR_EMU_MONITOR_.patch +++ b/0023-xwayland-Fix-setting-of-_XWAYLAND_RANDR_EMU_MONITOR_.patch @@ -1,4 +1,4 @@ -From 87a1a7b9f8f7d848302057b9ca54f6729e82bbe7 Mon Sep 17 00:00:00 2001 +From 94fc11313b34e3b35aa275dad1c3bc2455a24ec3 Mon Sep 17 00:00:00 2001 From: Hans de Goede Date: Mon, 4 Nov 2019 14:32:29 +0100 Subject: [PATCH xserver 23/24] xwayland: Fix setting of @@ -35,10 +35,10 @@ Signed-off-by: Hans de Goede 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/hw/xwayland/xwayland.c b/hw/xwayland/xwayland.c -index 6b86e56bd..e721d6cb5 100644 +index 734e76b2e..a7c4f82df 100644 --- a/hw/xwayland/xwayland.c +++ b/hw/xwayland/xwayland.c -@@ -749,6 +749,7 @@ ensure_surface_for_window(WindowPtr window) +@@ -751,6 +751,7 @@ ensure_surface_for_window(WindowPtr window) struct xwl_screen *xwl_screen; struct xwl_window *xwl_window; struct wl_region *region; @@ -46,7 +46,7 @@ index 6b86e56bd..e721d6cb5 100644 if (xwl_window_get(window)) return TRUE; -@@ -819,7 +820,14 @@ ensure_surface_for_window(WindowPtr window) +@@ -821,7 +822,14 @@ ensure_surface_for_window(WindowPtr window) xwl_window_init_allow_commits(xwl_window); @@ -62,7 +62,7 @@ index 6b86e56bd..e721d6cb5 100644 /* CSD or O-R toplevel window, check viewport on creation */ xwl_window_check_resolution_change_emulation(xwl_window); } -@@ -868,8 +876,6 @@ xwl_realize_window(WindowPtr window) +@@ -870,8 +878,6 @@ xwl_realize_window(WindowPtr window) return FALSE; } @@ -72,5 +72,5 @@ index 6b86e56bd..e721d6cb5 100644 } -- -2.25.2 +2.26.2 diff --git a/0024-xwayland-Remove-unnecessary-xwl_window_is_toplevel-c.patch b/0024-xwayland-Remove-unnecessary-xwl_window_is_toplevel-c.patch index c4925c2..0a3ea40 100644 --- a/0024-xwayland-Remove-unnecessary-xwl_window_is_toplevel-c.patch +++ b/0024-xwayland-Remove-unnecessary-xwl_window_is_toplevel-c.patch @@ -1,4 +1,4 @@ -From 231d5e2da2e1b0aee3cfe6febc54daf7a0e4b4c7 Mon Sep 17 00:00:00 2001 +From 2d078b3372e26278e687399a39699c495bfe16d4 Mon Sep 17 00:00:00 2001 From: Hans de Goede Date: Mon, 4 Nov 2019 15:01:18 +0100 Subject: [PATCH xserver 24/24] xwayland: Remove unnecessary @@ -21,10 +21,10 @@ Signed-off-by: Hans de Goede 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/hw/xwayland/xwayland-output.c b/hw/xwayland/xwayland-output.c -index 7d705d919..084b669e4 100644 +index 4bc9cd6b8..9d3372c8e 100644 --- a/hw/xwayland/xwayland-output.c +++ b/hw/xwayland/xwayland-output.c -@@ -468,9 +468,6 @@ static void +@@ -431,9 +431,6 @@ static void xwl_output_set_randr_emu_prop(WindowPtr window, struct xwl_output_randr_emu_prop *prop) { @@ -34,7 +34,7 @@ index 7d705d919..084b669e4 100644 if (prop->rect_count) { dixChangeWindowProperty(serverClient, window, prop->atom, XA_CARDINAL, 32, PropModeReplace, -@@ -483,7 +480,8 @@ xwl_output_set_randr_emu_prop(WindowPtr window, +@@ -446,7 +443,8 @@ xwl_output_set_randr_emu_prop(WindowPtr window, static void xwl_output_set_randr_emu_prop_callback(void *resource, XID id, void *user_data) { @@ -45,5 +45,5 @@ index 7d705d919..084b669e4 100644 static void -- -2.25.2 +2.26.2 diff --git a/sources b/sources index b0a0c91..043e4bb 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -SHA512 (xorg-server-1.20.8.tar.bz2) = ab0ec0fcbf490c61558b9297f61b58fd2dedb676c78bef6431dc9166054743b43a0091b88a8b3f4e81d1f539909440ee7e188a298cefabe13ea89159639cd805 +SHA512 (xorg-server-1.20.9.tar.bz2) = d9b5f93e1b9763a89187d8b272aa7d4ce9709641b8539f4536708af153310e5a4931bffd4229c51a3b0e3b12da7838750aa71b635751fb4c0bb27438cce4e5e6 diff --git a/xorg-x11-server.spec b/xorg-x11-server.spec index 647148b..842e909 100644 --- a/xorg-x11-server.spec +++ b/xorg-x11-server.spec @@ -45,8 +45,8 @@ Summary: X.Org X11 X server Name: xorg-x11-server -Version: 1.20.8 -Release: 4%{?gitdate:.%{gitdate}}%{?dist} +Version: 1.20.9 +Release: 1%{?gitdate:.%{gitdate}}%{?dist} URL: http://www.x.org License: MIT @@ -93,9 +93,24 @@ Patch5: 0001-autobind-GPUs-to-the-screen.patch Patch6: 0001-Fedora-hack-Make-the-suid-root-wrapper-always-start-.patch # Backports from current stable "server-1.20-branch": +Patch101: 0001-Revert-linux-Fix-platform-device-probe-for-DT-based-.patch +Patch102: 0002-Revert-linux-Fix-platform-device-PCI-detection-for-c.patch +Patch103: 0003-Revert-linux-Make-platform-device-probe-less-fragile.patch +Patch104: 0004-include-Increase-the-number-of-max.-input-devices-to.patch +Patch105: 0005-glamor-Fix-glamor_poly_fill_rect_gl-xRectangle-width.patch +Patch106: 0006-xfree86-Take-second-reference-for-SavedCursor-in-xf8.patch +Patch107: 0007-present-wnmd-Can-t-use-page-flipping-for-windows-cli.patch +Patch108: 0008-xwayland-Check-window-pixmap-in-xwl_present_check_fl.patch +Patch109: 0009-present-wnmd-Remove-dead-check-from-present_wnmd_che.patch +Patch110: 0010-xwayland-Do-not-discard-frame-callbacks-on-allow-com.patch +Patch111: 0011-xwayland-use-drmGetNodeTypeFromFd-for-checking-if-a-.patch +Patch112: 0012-xwayland-Remove-pending-stream-reference-when-freein.patch +Patch113: 0013-present-Move-flip-target_msc-adjustment-out-of-prese.patch +Patch114: 0014-present-Add-present_vblank-exec_msc-field.patch +Patch115: 0015-present-wnmd-Move-up-present_wnmd_queue_vblank.patch +Patch116: 0016-present-wnmd-Execute-copies-at-target_msc-1-already.patch # Backports from "master" upstream: -Patch100: 0001-fix-for-ZDI-11426.patch # Backported Xwayland randr resolution change emulation support Patch501: 0001-dix-Add-GetCurrentClient-helper.patch @@ -548,6 +563,9 @@ find %{inst_srcdir}/hw/xfree86 -name \*.c -delete %changelog +* Thu Oct 8 2020 Olivier Fourdan - 1.20.9-1 +- xserver 1.20.9 + all current fixes from upstream + * Wed Aug 12 2020 Adam Jackson - 1.20.8-4 - Enable XC-SECURITY