diff --git a/debian/changelog b/debian/changelog index 68eefc0..6ad901d 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,4 +1,4 @@ -xwayland (2:23.2.4-100pika1) pikauwu; urgency=medium +xwayland (2:23.2.3-100pika1) pikauwu; urgency=medium * Update to pikauwu diff --git a/main.sh b/main.sh index 765a291..362ab38 100755 --- a/main.sh +++ b/main.sh @@ -1,5 +1,5 @@ # Clone Upstream -git clone https://gitlab.freedesktop.org/xorg/xserver.git -b xwayland-23.2.4 ./xwayland +git clone https://gitlab.freedesktop.org/ekurzinger/xserver ./xwayland cp -rvf ./debian ./xwayland/ cp -vf ./meson.build ./xwayland/ cd ./xwayland diff --git a/patches/967.patch b/patches/967.patch index fde60cb..198e2fa 100644 --- a/patches/967.patch +++ b/patches/967.patch @@ -1,7 +1,7 @@ -From 22f85b70ba383e160af50e5a14eb44a37ce1d0fa Mon Sep 17 00:00:00 2001 +From ed9991b1152359079b72d8193509aea0de395f1b Mon Sep 17 00:00:00 2001 From: Erik Kurzinger Date: Tue, 24 Oct 2023 16:14:17 -0700 -Subject: [PATCH 1/5] DRI3: provide stub implementation of +Subject: [PATCH 1/6] DRI3: provide stub implementation of DRI3SetDRMDeviceInUse DRI3 version 1.3 introduced a new request which allows clients to @@ -104,10 +104,10 @@ index bb2b81b8f9..951cc6357e 100644 GitLab -From 6cff285583bd05e3ef1d932c3592cce07633c9b6 Mon Sep 17 00:00:00 2001 +From 7bdf16ff9725990ed1e54437748bed3899e9d67b Mon Sep 17 00:00:00 2001 From: Erik Kurzinger Date: Tue, 16 Aug 2022 11:57:40 -0700 -Subject: [PATCH 2/5] DRI3: add DRI3ImportSyncobj and DRI3FreeSyncobj +Subject: [PATCH 2/6] DRI3: add DRI3ImportSyncobj and DRI3FreeSyncobj Adds the required infrastructure in the core DRI3 code to support importing DRM synchronization objects from clients. This includes @@ -436,10 +436,10 @@ index 951cc6357e..2b0f85e392 100644 GitLab -From ce7301f622a5b671d05d626a65d6ba7cbea2f67e Mon Sep 17 00:00:00 2001 +From 1faf528c3c99884a8d04031ee96a1ff44531f77f Mon Sep 17 00:00:00 2001 From: Erik Kurzinger Date: Tue, 16 Aug 2022 11:59:14 -0700 -Subject: [PATCH 3/5] xwayland: implement support for DRI3 syncobjs +Subject: [PATCH 3/6] xwayland: implement support for DRI3 syncobjs Adds an implementation of the import_syncobj DRI3 screen info callback for Xwayland along with the various operations defined for dri3_syncobj @@ -451,10 +451,10 @@ Signed-off-by: Erik Kurzinger 1 file changed, 213 insertions(+), 1 deletion(-) diff --git a/hw/xwayland/xwayland-glamor-gbm.c b/hw/xwayland/xwayland-glamor-gbm.c -index 9442aee024..c1d9ddd37f 100644 +index 69ead78f26..35c06f5bee 100644 --- a/hw/xwayland/xwayland-glamor-gbm.c +++ b/hw/xwayland/xwayland-glamor-gbm.c -@@ -840,7 +840,213 @@ glamor_egl_fd_from_pixmap(ScreenPtr screen, PixmapPtr pixmap, +@@ -843,7 +843,213 @@ glamor_egl_fd_from_pixmap(ScreenPtr screen, PixmapPtr pixmap, return -1; } @@ -669,7 +669,7 @@ index 9442aee024..c1d9ddd37f 100644 .version = 2, .open = NULL, .pixmap_from_fds = glamor_pixmap_from_fds, -@@ -849,6 +1055,7 @@ static const dri3_screen_info_rec xwl_dri3_info = { +@@ -852,6 +1058,7 @@ static const dri3_screen_info_rec xwl_dri3_info = { .get_formats = xwl_glamor_get_formats, .get_modifiers = xwl_glamor_get_modifiers, .get_drawable_modifiers = xwl_glamor_get_drawable_modifiers, @@ -677,7 +677,7 @@ index 9442aee024..c1d9ddd37f 100644 }; static const char * -@@ -1218,6 +1425,11 @@ xwl_glamor_gbm_init_screen(struct xwl_screen *xwl_screen) +@@ -1265,6 +1472,11 @@ xwl_glamor_gbm_init_screen(struct xwl_screen *xwl_screen) { struct xwl_gbm_private *xwl_gbm = xwl_gbm_get(xwl_screen); @@ -693,10 +693,10 @@ index 9442aee024..c1d9ddd37f 100644 GitLab -From 7381542b61aeec02f5f37fbe1967a87dcc56710d Mon Sep 17 00:00:00 2001 +From 9609ec156eb29bd66e3a5cf2001d6b222e0dada3 Mon Sep 17 00:00:00 2001 From: Erik Kurzinger Date: Tue, 16 Aug 2022 12:03:59 -0700 -Subject: [PATCH 4/5] Present: implement PresentPixmapSynced +Subject: [PATCH 4/6] Present: implement PresentPixmapSynced Adds support for an augmented version of PresentPixmap supporting explicit synchronization with the GPU by way of a DRM synchronization @@ -733,7 +733,7 @@ Signed-off-by: Erik Kurzinger hw/xfree86/common/xf86Module.h | 2 +- hw/xwayland/xwayland-glamor.c | 24 +++++ hw/xwayland/xwayland-glamor.h | 1 + - hw/xwayland/xwayland-present.c | 101 +++++++++++++++++--- + hw/xwayland/xwayland-present.c | 108 ++++++++++++++++++--- hw/xwayland/xwayland-present.h | 5 +- hw/xwayland/xwayland-screen.h | 2 + include/protocol-versions.h | 2 +- @@ -744,7 +744,7 @@ Signed-off-by: Erik Kurzinger present/present_scmd.c | 8 ++ present/present_screen.c | 1 + present/present_vblank.c | 36 +++++++ - 14 files changed, 369 insertions(+), 51 deletions(-) + 14 files changed, 376 insertions(+), 51 deletions(-) diff --git a/hw/xfree86/common/xf86Module.h b/hw/xfree86/common/xf86Module.h index 6166e85590..b6eb806228 100644 @@ -760,10 +760,10 @@ index 6166e85590..b6eb806228 100644 #define ABI_EXTENSION_VERSION SET_ABI_VERSION(10, 0) diff --git a/hw/xwayland/xwayland-glamor.c b/hw/xwayland/xwayland-glamor.c -index 17fa20c80f..2b18cba1ee 100644 +index 074594cc7a..850e25db05 100644 --- a/hw/xwayland/xwayland-glamor.c +++ b/hw/xwayland/xwayland-glamor.c -@@ -1076,6 +1076,30 @@ xwl_glamor_create_pixmap_for_window(struct xwl_window *xwl_window) +@@ -1073,6 +1073,30 @@ xwl_glamor_create_pixmap_for_window(struct xwl_window *xwl_window) return NullPixmap; } @@ -807,18 +807,18 @@ index 97e8fb6642..260c60b652 100644 #ifdef XV /* glamor Xv Adaptor */ diff --git a/hw/xwayland/xwayland-present.c b/hw/xwayland/xwayland-present.c -index 941be06daf..f402a85622 100644 +index 783b04ff43..fb5a37b907 100644 --- a/hw/xwayland/xwayland-present.c +++ b/hw/xwayland/xwayland-present.c -@@ -27,6 +27,7 @@ - +@@ -30,6 +30,7 @@ + #endif #include #include +#include #include "xwayland-present.h" #include "xwayland-screen.h" -@@ -211,10 +212,18 @@ xwl_present_reset_timer(struct xwl_present_window *xwl_present_window) +@@ -214,10 +215,18 @@ xwl_present_reset_timer(struct xwl_present_window *xwl_present_window) static void xwl_present_execute(present_vblank_ptr vblank, uint64_t ust, uint64_t crtc_msc); @@ -838,7 +838,7 @@ index 941be06daf..f402a85622 100644 } static int -@@ -233,6 +242,16 @@ xwl_present_get_ust_msc(ScreenPtr screen, +@@ -236,6 +245,16 @@ xwl_present_get_ust_msc(ScreenPtr screen, return Success; } @@ -855,7 +855,7 @@ index 941be06daf..f402a85622 100644 /* * When the wait fence or previous flip is completed, it's time * to re-try the request -@@ -240,9 +259,27 @@ xwl_present_get_ust_msc(ScreenPtr screen, +@@ -243,9 +262,27 @@ xwl_present_get_ust_msc(ScreenPtr screen, static void xwl_present_re_execute(present_vblank_ptr vblank) { @@ -883,7 +883,7 @@ index 941be06daf..f402a85622 100644 xwl_present_execute(vblank, ust, crtc_msc); } -@@ -281,6 +318,10 @@ xwl_present_free_event(struct xwl_present_event *event) +@@ -284,6 +321,10 @@ xwl_present_free_event(struct xwl_present_event *event) static void xwl_present_free_idle_vblank(present_vblank_ptr vblank) { @@ -894,7 +894,7 @@ index 941be06daf..f402a85622 100644 present_pixmap_idle(vblank->pixmap, vblank->window, vblank->serial, vblank->idle_fence); xwl_present_free_event(xwl_present_event_from_vblank(vblank)); } -@@ -442,6 +483,11 @@ xwl_present_buffer_release(void *data) +@@ -445,6 +486,11 @@ xwl_present_buffer_release(void *data) return; vblank = &event->vblank; @@ -906,23 +906,27 @@ index 941be06daf..f402a85622 100644 present_pixmap_idle(vblank->pixmap, vblank->window, vblank->serial, vblank->idle_fence); xwl_present_window = xwl_present_window_priv(vblank->window); -@@ -632,6 +678,15 @@ xwl_present_maybe_set_reason(struct xwl_window *xwl_window, PresentFlipReason *r +@@ -641,6 +687,19 @@ xwl_present_maybe_set_reason(struct xwl_window *xwl_window, PresentFlipReason *r } } +static int +xwl_present_flush_fenced(WindowPtr window) +{ ++ int fence = -1; ++#ifdef XWL_HAS_GLAMOR + struct xwl_window *xwl_window = xwl_window_from_window(window); -+ int fence = xwl_glamor_get_fence(xwl_window->xwl_screen); ++ if (xwl_window) ++ fence = xwl_glamor_get_fence(xwl_window->xwl_screen); + xwl_present_flush(window); ++#endif /* XWL_HAS_GLAMOR */ + return fence; +} + static Bool xwl_present_check_flip(RRCrtcPtr crtc, WindowPtr present_window, -@@ -799,7 +854,7 @@ xwl_present_flip(present_vblank_ptr vblank, RegionPtr damage) +@@ -814,7 +873,7 @@ xwl_present_flip(present_vblank_ptr vblank, RegionPtr damage) if (xwl_window->tearing_control) { uint32_t hint; @@ -931,7 +935,7 @@ index 941be06daf..f402a85622 100644 hint = WP_TEARING_CONTROL_V1_PRESENTATION_HINT_ASYNC; else hint = WP_TEARING_CONTROL_V1_PRESENTATION_HINT_VSYNC; -@@ -840,6 +895,7 @@ xwl_present_execute(present_vblank_ptr vblank, uint64_t ust, uint64_t crtc_msc) +@@ -855,6 +914,7 @@ xwl_present_execute(present_vblank_ptr vblank, uint64_t ust, uint64_t crtc_msc) xorg_list_del(&vblank->event_queue); @@ -939,7 +943,7 @@ index 941be06daf..f402a85622 100644 if (present_execute_wait(vblank, crtc_msc)) return; -@@ -900,6 +956,8 @@ xwl_present_execute(present_vblank_ptr vblank, uint64_t ust, uint64_t crtc_msc) +@@ -920,6 +980,8 @@ xwl_present_execute(present_vblank_ptr vblank, uint64_t ust, uint64_t crtc_msc) } vblank->flip = FALSE; @@ -948,7 +952,7 @@ index 941be06daf..f402a85622 100644 } DebugPresent(("\tc %p %" PRIu64 ": %08" PRIx32 " -> %08" PRIx32 "\n", vblank, crtc_msc, vblank->pixmap->drawable.id, vblank->window->drawable.id)); -@@ -936,6 +994,10 @@ xwl_present_pixmap(WindowPtr window, +@@ -956,6 +1018,10 @@ xwl_present_pixmap(WindowPtr window, RRCrtcPtr target_crtc, SyncFence *wait_fence, SyncFence *idle_fence, @@ -959,7 +963,7 @@ index 941be06daf..f402a85622 100644 uint32_t options, uint64_t target_window_msc, uint64_t divisor, -@@ -952,11 +1014,17 @@ xwl_present_pixmap(WindowPtr window, +@@ -972,11 +1038,17 @@ xwl_present_pixmap(WindowPtr window, ScreenPtr screen = window->drawable.pScreen; present_window_priv_ptr window_priv = present_get_window_priv(window, TRUE); present_screen_priv_ptr screen_priv = present_screen_priv(screen); @@ -977,7 +981,7 @@ index 941be06daf..f402a85622 100644 target_crtc = xwl_present_get_crtc(screen_priv, window); ret = xwl_present_get_ust_msc(screen, window, &ust, &crtc_msc); -@@ -991,6 +1059,10 @@ xwl_present_pixmap(WindowPtr window, +@@ -1011,6 +1083,10 @@ xwl_present_pixmap(WindowPtr window, if (vblank->target_msc != target_msc) continue; @@ -988,7 +992,7 @@ index 941be06daf..f402a85622 100644 present_vblank_scrap(vblank); if (vblank->flip_ready) xwl_present_re_execute(vblank); -@@ -1003,22 +1075,18 @@ xwl_present_pixmap(WindowPtr window, +@@ -1023,22 +1099,18 @@ xwl_present_pixmap(WindowPtr window, vblank = &event->vblank; if (!present_vblank_init(vblank, window, pixmap, serial, valid, update, x_off, y_off, @@ -1018,20 +1022,30 @@ index 941be06daf..f402a85622 100644 vblank->queued = TRUE; if (crtc_msc < vblank->exec_msc) { -@@ -1067,6 +1135,12 @@ xwl_present_init(ScreenPtr screen) +@@ -1068,6 +1140,7 @@ xwl_present_unrealize_window(struct xwl_present_window *xwl_present_window) + Bool + xwl_present_init(ScreenPtr screen) + { ++ struct xwl_screen *xwl_screen = xwl_screen_get(screen); + present_screen_priv_ptr screen_priv; + + if (!present_screen_register_priv_keys()) +@@ -1083,6 +1156,14 @@ xwl_present_init(ScreenPtr screen) if (!dixRegisterPrivateKey(&xwl_present_window_private_key, PRIVATE_WINDOW, 0)) return FALSE; + xwl_screen->present_capabilities = XWL_PRESENT_CAPS; ++#ifdef XWL_HAS_GLAMOR + if (epoxy_has_egl_extension(xwl_screen->egl_display, + "ANDROID_native_fence_sync")) + xwl_screen->present_capabilities |= + PresentCapabilitySyncobj; ++#endif /* XWL_HAS_GLAMOR */ + screen_priv->query_capabilities = xwl_present_query_capabilities; screen_priv->get_crtc = xwl_present_get_crtc; -@@ -1077,6 +1151,7 @@ xwl_present_init(ScreenPtr screen) +@@ -1093,6 +1174,7 @@ xwl_present_init(ScreenPtr screen) screen_priv->present_pixmap = xwl_present_pixmap; screen_priv->queue_vblank = xwl_present_queue_vblank; screen_priv->flush = xwl_present_flush; @@ -1040,10 +1054,10 @@ index 941be06daf..f402a85622 100644 screen_priv->abort_vblank = xwl_present_abort_vblank; diff --git a/hw/xwayland/xwayland-present.h b/hw/xwayland/xwayland-present.h -index 4fd1e579ff..8a6f11ec4e 100644 +index dab636c844..b10198a40b 100644 --- a/hw/xwayland/xwayland-present.h +++ b/hw/xwayland/xwayland-present.h -@@ -59,7 +59,10 @@ struct xwl_present_event { +@@ -58,7 +58,10 @@ struct xwl_present_event { present_vblank_rec vblank; PixmapPtr pixmap; @@ -1056,17 +1070,17 @@ index 4fd1e579ff..8a6f11ec4e 100644 Bool xwl_present_entered_for_each_frame_callback(void); diff --git a/hw/xwayland/xwayland-screen.h b/hw/xwayland/xwayland-screen.h -index 92688a7e00..89d105e7fe 100644 +index a53d18bad8..0a41986099 100644 --- a/hw/xwayland/xwayland-screen.h +++ b/hw/xwayland/xwayland-screen.h -@@ -145,6 +146,8 @@ struct xwl_screen { - int libdecor_fd; +@@ -147,6 +147,8 @@ struct xwl_screen { struct libdecor *libdecor_context; #endif + const char *output_name; + + uint32_t present_capabilities; }; - + /* Apps which use randr/vidmode to change the mode when going fullscreen, diff --git a/include/protocol-versions.h b/include/protocol-versions.h index 2b0f85e392..aa3ba41fe1 100644 @@ -1642,10 +1656,10 @@ index 4f94f16e44..2eb57abfff 100644 GitLab -From 3def7fbff930f94ae1e1d31a55520988c1ec153e Mon Sep 17 00:00:00 2001 +From bcb2a82b5c83a25351ff806df29a2a6bad4648e6 Mon Sep 17 00:00:00 2001 From: Erik Kurzinger Date: Tue, 15 Aug 2023 15:32:47 -0700 -Subject: [PATCH 5/5] xwayland: add support for wp_linux_drm_syncobj_v1 +Subject: [PATCH 5/6] xwayland: add support for wp_linux_drm_syncobj_v1 This protocol allows for explicit synchronization of GPU operations by Wayland clients and the compositor. Xwayland can make use of this to @@ -1665,7 +1679,7 @@ Signed-off-by: Erik Kurzinger hw/xwayland/xwayland-glamor-gbm.c | 146 +++++++++++++++++++++++++- hw/xwayland/xwayland-glamor.c | 94 +++++++++++++++++ hw/xwayland/xwayland-glamor.h | 30 ++++++ - hw/xwayland/xwayland-present.c | 79 ++++++++++++-- + hw/xwayland/xwayland-present.c | 82 ++++++++++++--- hw/xwayland/xwayland-present.h | 1 - hw/xwayland/xwayland-screen.c | 1 + hw/xwayland/xwayland-screen.h | 1 + @@ -1673,13 +1687,13 @@ Signed-off-by: Erik Kurzinger hw/xwayland/xwayland-window.c | 10 ++ hw/xwayland/xwayland-window.h | 1 + present/present_execute.c | 5 +- - 12 files changed, 462 insertions(+), 19 deletions(-) + 12 files changed, 464 insertions(+), 20 deletions(-) diff --git a/hw/xwayland/meson.build b/hw/xwayland/meson.build -index 748c40c150..4fa1dcd8ec 100644 +index 8898f3e6c1..df4fa19178 100644 --- a/hw/xwayland/meson.build +++ b/hw/xwayland/meson.build -@@ -48,6 +48,7 @@ drm_lease_xml = join_paths(protodir, 'staging', 'drm-lease', 'drm-lease-v1.xml') +@@ -49,6 +49,7 @@ drm_lease_xml = join_paths(protodir, 'staging', 'drm-lease', 'drm-lease-v1.xml') shortcuts_inhibit_xml = join_paths(protodir, 'unstable', 'keyboard-shortcuts-inhibit', 'keyboard-shortcuts-inhibit-unstable-v1.xml') xwayland_shell_xml = join_paths(protodir, 'staging', 'xwayland-shell', 'xwayland-shell-v1.xml') tearing_xml = join_paths(protodir, 'staging', 'tearing-control', 'tearing-control-v1.xml') @@ -1687,7 +1701,7 @@ index 748c40c150..4fa1dcd8ec 100644 client_header = generator(scanner, output : '@BASENAME@-client-protocol.h', -@@ -77,6 +78,7 @@ srcs += client_header.process(drm_lease_xml) +@@ -78,6 +79,7 @@ srcs += client_header.process(drm_lease_xml) srcs += client_header.process(shortcuts_inhibit_xml) srcs += client_header.process(xwayland_shell_xml) srcs += client_header.process(tearing_xml) @@ -1695,7 +1709,7 @@ index 748c40c150..4fa1dcd8ec 100644 srcs += code.process(relative_xml) srcs += code.process(pointer_xml) srcs += code.process(gestures_xml) -@@ -90,6 +92,7 @@ srcs += code.process(drm_lease_xml) +@@ -91,6 +93,7 @@ srcs += code.process(drm_lease_xml) srcs += code.process(shortcuts_inhibit_xml) srcs += code.process(xwayland_shell_xml) srcs += code.process(tearing_xml) @@ -1704,7 +1718,7 @@ index 748c40c150..4fa1dcd8ec 100644 if build_ei xwayland_dep += libei_dep diff --git a/hw/xwayland/xwayland-glamor-gbm.c b/hw/xwayland/xwayland-glamor-gbm.c -index c1d9ddd37f..2047c9f4df 100644 +index 35c06f5bee..da8ae6c32f 100644 --- a/hw/xwayland/xwayland-glamor-gbm.c +++ b/hw/xwayland/xwayland-glamor-gbm.c @@ -35,6 +35,9 @@ @@ -1725,7 +1739,7 @@ index c1d9ddd37f..2047c9f4df 100644 struct xwl_gbm_private { drmDevice *device; -@@ -596,6 +600,8 @@ xwl_glamor_gbm_cleanup(struct xwl_screen *xwl_screen) +@@ -599,6 +603,8 @@ xwl_glamor_gbm_cleanup(struct xwl_screen *xwl_screen) wl_drm_destroy(xwl_gbm->drm); if (xwl_gbm->gbm) gbm_device_destroy(xwl_gbm->gbm); @@ -1734,7 +1748,7 @@ index c1d9ddd37f..2047c9f4df 100644 free(xwl_gbm); } -@@ -840,12 +846,88 @@ glamor_egl_fd_from_pixmap(ScreenPtr screen, PixmapPtr pixmap, +@@ -843,12 +849,88 @@ glamor_egl_fd_from_pixmap(ScreenPtr screen, PixmapPtr pixmap, return -1; } @@ -1823,7 +1837,7 @@ index c1d9ddd37f..2047c9f4df 100644 static Bool xwl_dri3_check_syncobj(struct dri3_syncobj *syncobj, uint64_t point, Bool check_avail) { -@@ -946,6 +1028,9 @@ xwl_dri3_free_syncobj(struct dri3_syncobj *syncobj) +@@ -949,6 +1031,9 @@ xwl_dri3_free_syncobj(struct dri3_syncobj *syncobj) struct xwl_screen *xwl_screen = xwl_screen_get(syncobj->screen); struct xwl_gbm_private *xwl_gbm = xwl_gbm_get(xwl_screen); @@ -1833,7 +1847,7 @@ index c1d9ddd37f..2047c9f4df 100644 if (xwl_syncobj->handle) drmSyncobjDestroy(xwl_gbm->drm_fd, xwl_syncobj->handle); -@@ -983,10 +1068,27 @@ xwl_dri3_create_syncobj(struct xwl_screen *xwl_screen, uint32_t handle) +@@ -986,10 +1071,27 @@ xwl_dri3_create_syncobj(struct xwl_screen *xwl_screen, uint32_t handle) { struct xwl_dri3_syncobj *syncobj = calloc(1, sizeof (*syncobj)); struct xwl_gbm_private *xwl_gbm = xwl_gbm_get(xwl_screen); @@ -1861,7 +1875,7 @@ index c1d9ddd37f..2047c9f4df 100644 syncobj->handle = handle; syncobj->base.screen = xwl_screen->screen; syncobj->base.refcount = 1; -@@ -1002,10 +1104,18 @@ xwl_dri3_create_syncobj(struct xwl_screen *xwl_screen, uint32_t handle) +@@ -1005,10 +1107,18 @@ xwl_dri3_create_syncobj(struct xwl_screen *xwl_screen, uint32_t handle) return &syncobj->base; fail: @@ -1880,7 +1894,7 @@ index c1d9ddd37f..2047c9f4df 100644 static struct dri3_syncobj * xwl_dri3_import_syncobj(ClientPtr client, ScreenPtr screen, XID id, int fd) { -@@ -1217,6 +1327,11 @@ xwl_glamor_gbm_init_wl_registry(struct xwl_screen *xwl_screen, +@@ -1220,6 +1330,11 @@ xwl_glamor_gbm_init_wl_registry(struct xwl_screen *xwl_screen, } else if (strcmp(name, zwp_linux_dmabuf_v1_interface.name) == 0) { xwl_screen_set_dmabuf_interface(xwl_screen, id, version); return TRUE; @@ -1892,16 +1906,16 @@ index c1d9ddd37f..2047c9f4df 100644 } /* no match */ -@@ -1346,7 +1461,7 @@ xwl_glamor_gbm_init_egl(struct xwl_screen *xwl_screen) +@@ -1390,7 +1505,7 @@ xwl_glamor_gbm_init_egl(struct xwl_screen *xwl_screen) struct xwl_gbm_private *xwl_gbm = xwl_gbm_get(xwl_screen); EGLint major, minor; const GLubyte *renderer; - const char *gbm_backend_name; + const char *gbm_backend_name, *egl_vendor; - if (!xwl_gbm->fd_render_node && !xwl_gbm->drm_authenticated) { - ErrorF("Failed to get wl_drm, disabling Glamor and DRI3\n"); -@@ -1408,6 +1523,25 @@ xwl_glamor_gbm_init_egl(struct xwl_screen *xwl_screen) + if (!xwl_gbm->drm && !xwl_glamor_gbm_init_main_dev(xwl_screen)) + return FALSE; +@@ -1455,6 +1570,25 @@ xwl_glamor_gbm_init_egl(struct xwl_screen *xwl_screen) xwl_screen->glvnd_vendor = gbm_backend_name; xwl_gbm->glamor_gles = !epoxy_is_desktop_gl(); @@ -1927,7 +1941,7 @@ index c1d9ddd37f..2047c9f4df 100644 return TRUE; error: if (xwl_screen->egl_display != EGL_NO_DISPLAY) { -@@ -1425,7 +1559,7 @@ xwl_glamor_gbm_init_screen(struct xwl_screen *xwl_screen) +@@ -1472,7 +1606,7 @@ xwl_glamor_gbm_init_screen(struct xwl_screen *xwl_screen) { struct xwl_gbm_private *xwl_gbm = xwl_gbm_get(xwl_screen); @@ -1936,7 +1950,7 @@ index c1d9ddd37f..2047c9f4df 100644 xwl_dri3_info.version = 4; xwl_dri3_info.import_syncobj = xwl_dri3_import_syncobj; } -@@ -1498,6 +1632,12 @@ xwl_glamor_init_gbm(struct xwl_screen *xwl_screen) +@@ -1545,6 +1679,12 @@ xwl_glamor_init_gbm(struct xwl_screen *xwl_screen) xwl_screen->gbm_backend.get_main_device = xwl_gbm_get_main_device; xwl_screen->gbm_backend.is_available = TRUE; xwl_screen->gbm_backend.backend_flags = XWL_EGL_BACKEND_NEEDS_BUFFER_FLUSH | @@ -1951,10 +1965,10 @@ index c1d9ddd37f..2047c9f4df 100644 + xwl_screen->gbm_backend.dri3_syncobj_passthrough = xwl_glamor_gbm_dri3_syncobj_passthrough; } diff --git a/hw/xwayland/xwayland-glamor.c b/hw/xwayland/xwayland-glamor.c -index 2b18cba1ee..5fd3b837d9 100644 +index 850e25db05..dcc1c2f5fe 100644 --- a/hw/xwayland/xwayland-glamor.c +++ b/hw/xwayland/xwayland-glamor.c -@@ -1062,6 +1062,26 @@ xwl_glamor_needs_n_buffering(struct xwl_screen *xwl_screen) +@@ -1059,6 +1059,26 @@ xwl_glamor_needs_n_buffering(struct xwl_screen *xwl_screen) XWL_EGL_BACKEND_NEEDS_N_BUFFERING); } @@ -1981,7 +1995,7 @@ index 2b18cba1ee..5fd3b837d9 100644 PixmapPtr xwl_glamor_create_pixmap_for_window(struct xwl_window *xwl_window) { -@@ -1100,6 +1120,80 @@ xwl_glamor_get_fence(struct xwl_screen *xwl_screen) +@@ -1097,6 +1117,80 @@ xwl_glamor_get_fence(struct xwl_screen *xwl_screen) return fence_fd; } @@ -2130,18 +2144,18 @@ index 260c60b652..7e3eea014b 100644 #ifdef XV /* glamor Xv Adaptor */ diff --git a/hw/xwayland/xwayland-present.c b/hw/xwayland/xwayland-present.c -index f402a85622..b88107a1ae 100644 +index fb5a37b907..b7afc4d8b9 100644 --- a/hw/xwayland/xwayland-present.c +++ b/hw/xwayland/xwayland-present.c -@@ -36,6 +36,7 @@ - #include "glamor.h" +@@ -39,6 +39,7 @@ + #include "xwayland-pixmap.h" #include "tearing-control-v1-client-protocol.h" +#include "linux-drm-syncobj-v1-client-protocol.h" #define XWL_PRESENT_CAPS PresentCapabilityAsync | PresentCapabilityAsyncMayTear -@@ -318,10 +319,6 @@ xwl_present_free_event(struct xwl_present_event *event) +@@ -321,10 +322,6 @@ xwl_present_free_event(struct xwl_present_event *event) static void xwl_present_free_idle_vblank(present_vblank_ptr vblank) { @@ -2152,7 +2166,7 @@ index f402a85622..b88107a1ae 100644 present_pixmap_idle(vblank->pixmap, vblank->window, vblank->serial, vblank->idle_fence); xwl_present_free_event(xwl_present_event_from_vblank(vblank)); } -@@ -476,6 +473,7 @@ static void +@@ -479,6 +476,7 @@ static void xwl_present_buffer_release(void *data) { struct xwl_present_window *xwl_present_window; @@ -2160,7 +2174,7 @@ index f402a85622..b88107a1ae 100644 struct xwl_present_event *event = data; present_vblank_ptr vblank; -@@ -484,9 +482,14 @@ xwl_present_buffer_release(void *data) +@@ -487,9 +485,16 @@ xwl_present_buffer_release(void *data) vblank = &event->vblank; @@ -2168,6 +2182,7 @@ index f402a85622..b88107a1ae 100644 - vblank->release_syncobj->signal(vblank->release_syncobj, - vblank->release_point); + xwl_screen = xwl_screen_get(vblank->screen); ++#ifdef XWL_HAS_GLAMOR + if (vblank->release_syncobj && !xwl_screen->explicit_sync) { + /* transfer implicit fence to release syncobj */ + int fence_fd = xwl_glamor_dmabuf_export_sync_file(vblank->pixmap); @@ -2175,10 +2190,11 @@ index f402a85622..b88107a1ae 100644 + vblank->release_point, + fence_fd); + } ++#endif /* XWL_HAS_GLAMOR */ present_pixmap_idle(vblank->pixmap, vblank->window, vblank->serial, vblank->idle_fence); -@@ -700,6 +703,7 @@ xwl_present_check_flip(RRCrtcPtr crtc, +@@ -713,6 +718,7 @@ xwl_present_check_flip(RRCrtcPtr crtc, WindowPtr toplvl_window = xwl_present_toplvl_pixmap_window(present_window); struct xwl_window *xwl_window = xwl_window_from_window(present_window); ScreenPtr screen = pixmap->drawable.pScreen; @@ -2186,18 +2202,20 @@ index f402a85622..b88107a1ae 100644 if (reason) *reason = PRESENT_FLIP_REASON_UNKNOWN; -@@ -736,6 +740,10 @@ xwl_present_check_flip(RRCrtcPtr crtc, - if (!xwl_glamor_check_flip(present_window, pixmap)) +@@ -753,7 +759,11 @@ xwl_present_check_flip(RRCrtcPtr crtc, + if (xwl_window->xwl_screen->glamor && + !xwl_glamor_check_flip(present_window, pixmap)) return FALSE; - +-#endif ++ + if (!xwl_glamor_supports_implicit_sync(xwl_screen) && + !xwl_screen->explicit_sync) + return FALSE; -+ ++#endif /* XWL_HAS_GLAMOR */ + /* 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. -@@ -814,6 +822,7 @@ xwl_present_flip(present_vblank_ptr vblank, RegionPtr damage) +@@ -833,6 +843,7 @@ xwl_present_flip(present_vblank_ptr vblank, RegionPtr damage) PixmapPtr pixmap = vblank->pixmap; struct xwl_window *xwl_window = xwl_window_from_window(present_window); struct xwl_present_window *xwl_present_window = xwl_present_window_priv(present_window); @@ -2205,7 +2223,7 @@ index f402a85622..b88107a1ae 100644 BoxPtr damage_box; struct wl_buffer *buffer; struct xwl_present_event *event = xwl_present_event_from_vblank(vblank); -@@ -827,12 +836,36 @@ xwl_present_flip(present_vblank_ptr vblank, RegionPtr damage) +@@ -846,12 +857,35 @@ xwl_present_flip(present_vblank_ptr vblank, RegionPtr damage) return FALSE; } @@ -2220,9 +2238,7 @@ index f402a85622..b88107a1ae 100644 event->pixmap = pixmap; -+ assert(xwl_glamor_supports_implicit_sync(xwl_screen) || -+ xwl_screen->explicit_sync); -+ ++#ifdef XWL_HAS_GLAMOR + if (vblank->acquire_syncobj && vblank->release_syncobj) { + if (xwl_screen->explicit_sync) + xwl_glamor_dri3_syncobj_passthrough(present_window, @@ -2238,11 +2254,12 @@ index f402a85622..b88107a1ae 100644 + xwl_glamor_dmabuf_import_sync_file(vblank->pixmap, fence_fd); + } + } ++#endif /* XWL_HAS_GLAMOR */ + xwl_pixmap_set_buffer_release_cb(pixmap, xwl_present_buffer_release, event); /* We can flip directly to the main surface (full screen window without clips) */ -@@ -877,6 +910,18 @@ xwl_present_flip(present_vblank_ptr vblank, RegionPtr damage) +@@ -896,6 +930,18 @@ xwl_present_flip(present_vblank_ptr vblank, RegionPtr damage) return TRUE; } @@ -2261,7 +2278,7 @@ index f402a85622..b88107a1ae 100644 /* * Once the required MSC has been reached, execute the pending request. * -@@ -892,6 +937,7 @@ xwl_present_execute(present_vblank_ptr vblank, uint64_t ust, uint64_t crtc_msc) +@@ -911,6 +957,7 @@ xwl_present_execute(present_vblank_ptr vblank, uint64_t ust, uint64_t crtc_msc) WindowPtr window = vblank->window; struct xwl_present_window *xwl_present_window = xwl_present_window_get_priv(window); present_vblank_ptr flip_pending = xwl_present_get_pending_flip(xwl_present_window); @@ -2269,7 +2286,7 @@ index f402a85622..b88107a1ae 100644 xorg_list_del(&vblank->event_queue); -@@ -919,6 +965,19 @@ retry: +@@ -938,6 +985,19 @@ retry: vblank->event_id, vblank, crtc_msc, vblank->pixmap->drawable.id, vblank->window->drawable.id)); @@ -2289,24 +2306,24 @@ index f402a85622..b88107a1ae 100644 /* Set update region as damaged */ if (vblank->update) { damage = RegionDuplicate(vblank->update); -@@ -1136,10 +1195,8 @@ xwl_present_init(ScreenPtr screen) - return FALSE; +@@ -1158,10 +1218,8 @@ xwl_present_init(ScreenPtr screen) xwl_screen->present_capabilities = XWL_PRESENT_CAPS; + #ifdef XWL_HAS_GLAMOR - if (epoxy_has_egl_extension(xwl_screen->egl_display, - "ANDROID_native_fence_sync")) - xwl_screen->present_capabilities |= - PresentCapabilitySyncobj; + if (xwl_glamor_supports_syncobjs(xwl_screen)) + xwl_screen->present_capabilities |= PresentCapabilitySyncobj; + #endif /* XWL_HAS_GLAMOR */ screen_priv->query_capabilities = xwl_present_query_capabilities; - screen_priv->get_crtc = xwl_present_get_crtc; diff --git a/hw/xwayland/xwayland-present.h b/hw/xwayland/xwayland-present.h -index 8a6f11ec4e..ffc16f52e6 100644 +index b10198a40b..f518068fbd 100644 --- a/hw/xwayland/xwayland-present.h +++ b/hw/xwayland/xwayland-present.h -@@ -59,7 +59,6 @@ struct xwl_present_event { +@@ -58,7 +58,6 @@ struct xwl_present_event { present_vblank_rec vblank; PixmapPtr pixmap; @@ -2315,7 +2332,7 @@ index 8a6f11ec4e..ffc16f52e6 100644 uint64_t divisor; uint64_t remainder; diff --git a/hw/xwayland/xwayland-screen.c b/hw/xwayland/xwayland-screen.c -index 22afd4e948..092b3768f1 100644 +index 5c71b55e29..94a047bf63 100644 --- a/hw/xwayland/xwayland-screen.c +++ b/hw/xwayland/xwayland-screen.c @@ -68,6 +68,7 @@ @@ -2327,10 +2344,10 @@ index 22afd4e948..092b3768f1 100644 static DevPrivateKeyRec xwl_screen_private_key; static DevPrivateKeyRec xwl_client_private_key; diff --git a/hw/xwayland/xwayland-screen.h b/hw/xwayland/xwayland-screen.h -index 89d105e7fe..54dc64ae40 100644 +index 0a41986099..2799be773d 100644 --- a/hw/xwayland/xwayland-screen.h +++ b/hw/xwayland/xwayland-screen.h -@@ -111,6 +111,7 @@ struct xwl_screen { +@@ -112,6 +112,7 @@ struct xwl_screen { struct wp_viewporter *viewporter; struct xwayland_shell_v1 *xwayland_shell; struct wp_tearing_control_manager_v1 *tearing_control_manager; @@ -2339,7 +2356,7 @@ index 89d105e7fe..54dc64ae40 100644 struct xorg_list queued_drm_lease_devices; struct xorg_list drm_leases; diff --git a/hw/xwayland/xwayland-window-buffers.c b/hw/xwayland/xwayland-window-buffers.c -index 599ad53707..c5aa348ed4 100644 +index 40e19e3495..fe19caaaed 100644 --- a/hw/xwayland/xwayland-window-buffers.c +++ b/hw/xwayland/xwayland-window-buffers.c @@ -32,6 +32,14 @@ @@ -2364,9 +2381,9 @@ index 599ad53707..c5aa348ed4 100644 + struct dri3_syncobj *syncobj; + uint64_t timeline_point; + int efd; - Bool recycle_on_release; int refcnt; uint32_t time; + struct xorg_list link_buffer; @@ -76,6 +87,7 @@ xwl_window_buffer_new(struct xwl_window *xwl_window) xwl_window_buffer->xwl_window = xwl_window; xwl_window_buffer->damage_region = RegionCreate(NullBox, 1); @@ -2409,7 +2426,7 @@ index 599ad53707..c5aa348ed4 100644 void xwl_window_buffers_init(struct xwl_window *xwl_window) { -@@ -327,6 +359,46 @@ xwl_window_recycle_pixmap(struct xwl_window *xwl_window) +@@ -331,6 +363,46 @@ xwl_window_recycle_pixmap(struct xwl_window *xwl_window) screen->DestroyPixmap(window_pixmap); } @@ -2456,10 +2473,16 @@ index 599ad53707..c5aa348ed4 100644 PixmapPtr xwl_window_buffers_get_pixmap(struct xwl_window *xwl_window, RegionPtr damage_region) -@@ -313,6 +385,16 @@ xwl_window_buffers_get_pixmap(struct xwl_window *xwl_window, - - full_damage = xwl_window_buffer->damage_region; - +@@ -349,11 +421,22 @@ xwl_window_buffers_get_pixmap(struct xwl_window *xwl_window, + xwl_window_buffer_add_damage_region(xwl_window, damage_region); + + xwl_window_buffer = xwl_window_buffer_get_available(xwl_window); ++ + if (xwl_window_buffer) { + RegionPtr full_damage = xwl_window_buffer->damage_region; + BoxPtr pBox = RegionRects(full_damage); + int nBox = RegionNumRects(full_damage); + +#ifdef XWL_HAS_GLAMOR + if (xwl_window_buffer->syncobj) { + int fence_fd = @@ -2470,10 +2493,10 @@ index 599ad53707..c5aa348ed4 100644 + } +#endif /* XWL_HAS_GLAMOR */ + - if (xwl_window_buffer->pixmap) { - BoxPtr pBox = RegionRects(full_damage); - int nBox = RegionNumRects(full_damage); -@@ -384,9 +467,30 @@ xwl_window_buffers_get_pixmap(struct xwl_window *xwl_window, + new_window_pixmap = xwl_window_buffer->pixmap; + + while (nBox--) { +@@ -388,9 +471,30 @@ xwl_window_buffers_get_pixmap(struct xwl_window *xwl_window, /* Hold a reference on the buffer until it's released by the compositor */ xwl_window_buffer->refcnt++; @@ -2508,10 +2531,10 @@ index 599ad53707..c5aa348ed4 100644 xorg_list_del(&xwl_window_buffer->link_buffer); xorg_list_append(&xwl_window_buffer->link_buffer, diff --git a/hw/xwayland/xwayland-window.c b/hw/xwayland/xwayland-window.c -index aaeeace684..ec81b5027e 100644 +index d2434de8f5..023d58ba34 100644 --- a/hw/xwayland/xwayland-window.c +++ b/hw/xwayland/xwayland-window.c -@@ -50,6 +50,7 @@ +@@ -51,6 +51,7 @@ #include "viewporter-client-protocol.h" #include "xdg-shell-client-protocol.h" #include "xwayland-shell-v1-client-protocol.h" @@ -2519,7 +2542,7 @@ index aaeeace684..ec81b5027e 100644 #define DELAYED_WL_SURFACE_DESTROY 1000 /* ms */ -@@ -1188,6 +1189,9 @@ xwl_unrealize_window(WindowPtr window) +@@ -1182,6 +1183,9 @@ xwl_unrealize_window(WindowPtr window) if (xwl_window->tearing_control) wp_tearing_control_v1_destroy(xwl_window->tearing_control); @@ -2529,24 +2552,24 @@ index aaeeace684..ec81b5027e 100644 release_wl_surface_for_window(xwl_window); xorg_list_del(&xwl_window->link_damage); xorg_list_del(&xwl_window->link_window); -@@ -1396,6 +1400,12 @@ xwl_window_attach_buffer(struct xwl_window *xwl_window) +@@ -1384,6 +1388,12 @@ xwl_window_attach_buffer(struct xwl_window *xwl_window) pixmap = xwl_window_buffers_get_pixmap(xwl_window, region); + buffer = xwl_pixmap_get_wl_buffer(pixmap); - #ifdef XWL_HAS_GLAMOR + if (xwl_window->surface_sync) { + /* default to implicit sync */ + wp_linux_drm_syncobj_surface_v1_destroy(xwl_window->surface_sync); + xwl_window->surface_sync = NULL; + } + - if (xwl_screen->glamor) - buffer = xwl_glamor_pixmap_get_wl_buffer(pixmap); - else + if (!buffer) { + ErrorF("Error getting buffer\n"); + return FALSE; diff --git a/hw/xwayland/xwayland-window.h b/hw/xwayland/xwayland-window.h -index 7fbb2a623a..09eb930389 100644 +index 3370c45aaa..d415415f31 100644 --- a/hw/xwayland/xwayland-window.h +++ b/hw/xwayland/xwayland-window.h -@@ -122,6 +122,7 @@ struct xwl_window { +@@ -120,6 +120,7 @@ struct xwl_window { /* If TRUE, the window buffer format supports scanout with implicit modifier */ Bool has_implicit_scanout_support; struct wp_tearing_control_v1 *tearing_control; @@ -2571,4 +2594,83 @@ index 913a8b67ba..2fb49749eb 100644 vblank->acquire_point)) { vblank->efd = eventfd(0, EFD_CLOEXEC); -- -GitLab \ No newline at end of file +GitLab + + +From b28cb0a1dd8872a667843c6be297588ba5c405e9 Mon Sep 17 00:00:00 2001 +From: Erik Kurzinger +Date: Tue, 23 Jan 2024 14:17:57 -0800 +Subject: [PATCH 6/6] xwayland: start present timer when waiting for fence + +Before executing a present request, xwl_present_execute will call +present_execute_wait, which may cause execution to be deferred until +either the wait-fence (for PresentPixmap requests) or the acquire +timeline point (for PresentPixmapSynced requests) has been signaled. + +If another present request is received targeting the same window and msc +before the first request is re-executed the older request will be +scrapped in favor of the newer request. + +However, execution this newer request may also be deferred by +present_execute_wait for the same reason, and if yet another request +arrives quickly enough, the second request will also be scrapped. Thus, +we can get stuck in an endless loop and nothing ever ends up on the +screen. + +This cycle *should* be broken when we bump the msc, causing the last +request before that to be executed for real. But, assuming all of these +requests are targeted for immediate execution, that never actually +happens because we only start the frame timer when queueing a request +for a future msc. + +To fix this, we make two changes. Firstly, if present_execute_wait +causes execution to be deferred and the frame timer for the window is +not running, we will start it. Note that present_execute_wait may have +already called xwl_present_queue_vblank under certain circumstances, +which will have started the timer itself, but not if the request is +deferred due to a fence wait. + +Secondly, we change xwl_present_has_pending_events to return true if the +vblank list of the present_window_priv is non-empty, instead of only +returning true if there are any queued vblanks or a pending flip. So it +will now return true if there are any vblanks waiting on their fence to +be signaled, meaning xwl_present_reset_timer will start the timer in +that case, which is what we want. + +Signed-off-by: Erik Kurzinger +--- + hw/xwayland/xwayland-present.c | 11 ++++++----- + 1 file changed, 6 insertions(+), 5 deletions(-) + +diff --git a/hw/xwayland/xwayland-present.c b/hw/xwayland/xwayland-present.c +index b7afc4d8b9..1b75808654 100644 +--- a/hw/xwayland/xwayland-present.c ++++ b/hw/xwayland/xwayland-present.c +@@ -168,10 +168,8 @@ xwl_present_get_pending_flip(struct xwl_present_window *xwl_present_window) + static inline Bool + xwl_present_has_pending_events(struct xwl_present_window *xwl_present_window) + { +- present_vblank_ptr flip_pending = xwl_present_get_pending_flip(xwl_present_window); +- +- return (flip_pending && flip_pending->sync_flip) || +- !xorg_list_is_empty(&xwl_present_window->wait_list); ++ present_window_priv_ptr window_priv = present_window_priv(xwl_present_window->window); ++ return !xorg_list_is_empty(&window_priv->vblank); + } + + void +@@ -962,8 +960,11 @@ xwl_present_execute(present_vblank_ptr vblank, uint64_t ust, uint64_t crtc_msc) + xorg_list_del(&vblank->event_queue); + + retry: +- if (present_execute_wait(vblank, crtc_msc)) ++ if (present_execute_wait(vblank, crtc_msc)) { ++ if (!xwl_present_window->frame_timer) ++ xwl_present_reset_timer(xwl_present_window); + return; ++ } + + if (flip_pending && vblank->flip && vblank->pixmap && vblank->window) { + DebugPresent(("\tr %" PRIu64 " %p (pending %p)\n", +-- +GitLab