patcchy
This commit is contained in:
parent
6074a88699
commit
b37abc917e
2
debian/changelog
vendored
2
debian/changelog
vendored
@ -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
|
* Update to pikauwu
|
||||||
|
|
||||||
|
2
main.sh
2
main.sh
@ -1,5 +1,5 @@
|
|||||||
# Clone Upstream
|
# 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 -rvf ./debian ./xwayland/
|
||||||
cp -vf ./meson.build ./xwayland/
|
cp -vf ./meson.build ./xwayland/
|
||||||
cd ./xwayland
|
cd ./xwayland
|
||||||
|
@ -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 <ekurzinger@nvidia.com>
|
From: Erik Kurzinger <ekurzinger@nvidia.com>
|
||||||
Date: Tue, 24 Oct 2023 16:14:17 -0700
|
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
|
DRI3SetDRMDeviceInUse
|
||||||
|
|
||||||
DRI3 version 1.3 introduced a new request which allows clients to
|
DRI3 version 1.3 introduced a new request which allows clients to
|
||||||
@ -104,10 +104,10 @@ index bb2b81b8f9..951cc6357e 100644
|
|||||||
GitLab
|
GitLab
|
||||||
|
|
||||||
|
|
||||||
From 6cff285583bd05e3ef1d932c3592cce07633c9b6 Mon Sep 17 00:00:00 2001
|
From 7bdf16ff9725990ed1e54437748bed3899e9d67b Mon Sep 17 00:00:00 2001
|
||||||
From: Erik Kurzinger <ekurzinger@nvidia.com>
|
From: Erik Kurzinger <ekurzinger@nvidia.com>
|
||||||
Date: Tue, 16 Aug 2022 11:57:40 -0700
|
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
|
Adds the required infrastructure in the core DRI3 code to support
|
||||||
importing DRM synchronization objects from clients. This includes
|
importing DRM synchronization objects from clients. This includes
|
||||||
@ -436,10 +436,10 @@ index 951cc6357e..2b0f85e392 100644
|
|||||||
GitLab
|
GitLab
|
||||||
|
|
||||||
|
|
||||||
From ce7301f622a5b671d05d626a65d6ba7cbea2f67e Mon Sep 17 00:00:00 2001
|
From 1faf528c3c99884a8d04031ee96a1ff44531f77f Mon Sep 17 00:00:00 2001
|
||||||
From: Erik Kurzinger <ekurzinger@nvidia.com>
|
From: Erik Kurzinger <ekurzinger@nvidia.com>
|
||||||
Date: Tue, 16 Aug 2022 11:59:14 -0700
|
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
|
Adds an implementation of the import_syncobj DRI3 screen info callback
|
||||||
for Xwayland along with the various operations defined for dri3_syncobj
|
for Xwayland along with the various operations defined for dri3_syncobj
|
||||||
@ -451,10 +451,10 @@ Signed-off-by: Erik Kurzinger <ekurzinger@nvidia.com>
|
|||||||
1 file changed, 213 insertions(+), 1 deletion(-)
|
1 file changed, 213 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
diff --git a/hw/xwayland/xwayland-glamor-gbm.c b/hw/xwayland/xwayland-glamor-gbm.c
|
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
|
--- a/hw/xwayland/xwayland-glamor-gbm.c
|
||||||
+++ b/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;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -669,7 +669,7 @@ index 9442aee024..c1d9ddd37f 100644
|
|||||||
.version = 2,
|
.version = 2,
|
||||||
.open = NULL,
|
.open = NULL,
|
||||||
.pixmap_from_fds = glamor_pixmap_from_fds,
|
.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_formats = xwl_glamor_get_formats,
|
||||||
.get_modifiers = xwl_glamor_get_modifiers,
|
.get_modifiers = xwl_glamor_get_modifiers,
|
||||||
.get_drawable_modifiers = xwl_glamor_get_drawable_modifiers,
|
.get_drawable_modifiers = xwl_glamor_get_drawable_modifiers,
|
||||||
@ -677,7 +677,7 @@ index 9442aee024..c1d9ddd37f 100644
|
|||||||
};
|
};
|
||||||
|
|
||||||
static const char *
|
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);
|
struct xwl_gbm_private *xwl_gbm = xwl_gbm_get(xwl_screen);
|
||||||
|
|
||||||
@ -693,10 +693,10 @@ index 9442aee024..c1d9ddd37f 100644
|
|||||||
GitLab
|
GitLab
|
||||||
|
|
||||||
|
|
||||||
From 7381542b61aeec02f5f37fbe1967a87dcc56710d Mon Sep 17 00:00:00 2001
|
From 9609ec156eb29bd66e3a5cf2001d6b222e0dada3 Mon Sep 17 00:00:00 2001
|
||||||
From: Erik Kurzinger <ekurzinger@nvidia.com>
|
From: Erik Kurzinger <ekurzinger@nvidia.com>
|
||||||
Date: Tue, 16 Aug 2022 12:03:59 -0700
|
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
|
Adds support for an augmented version of PresentPixmap supporting
|
||||||
explicit synchronization with the GPU by way of a DRM synchronization
|
explicit synchronization with the GPU by way of a DRM synchronization
|
||||||
@ -733,7 +733,7 @@ Signed-off-by: Erik Kurzinger <ekurzinger@nvidia.com>
|
|||||||
hw/xfree86/common/xf86Module.h | 2 +-
|
hw/xfree86/common/xf86Module.h | 2 +-
|
||||||
hw/xwayland/xwayland-glamor.c | 24 +++++
|
hw/xwayland/xwayland-glamor.c | 24 +++++
|
||||||
hw/xwayland/xwayland-glamor.h | 1 +
|
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-present.h | 5 +-
|
||||||
hw/xwayland/xwayland-screen.h | 2 +
|
hw/xwayland/xwayland-screen.h | 2 +
|
||||||
include/protocol-versions.h | 2 +-
|
include/protocol-versions.h | 2 +-
|
||||||
@ -744,7 +744,7 @@ Signed-off-by: Erik Kurzinger <ekurzinger@nvidia.com>
|
|||||||
present/present_scmd.c | 8 ++
|
present/present_scmd.c | 8 ++
|
||||||
present/present_screen.c | 1 +
|
present/present_screen.c | 1 +
|
||||||
present/present_vblank.c | 36 +++++++
|
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
|
diff --git a/hw/xfree86/common/xf86Module.h b/hw/xfree86/common/xf86Module.h
|
||||||
index 6166e85590..b6eb806228 100644
|
index 6166e85590..b6eb806228 100644
|
||||||
@ -760,10 +760,10 @@ index 6166e85590..b6eb806228 100644
|
|||||||
#define ABI_EXTENSION_VERSION SET_ABI_VERSION(10, 0)
|
#define ABI_EXTENSION_VERSION SET_ABI_VERSION(10, 0)
|
||||||
|
|
||||||
diff --git a/hw/xwayland/xwayland-glamor.c b/hw/xwayland/xwayland-glamor.c
|
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
|
--- a/hw/xwayland/xwayland-glamor.c
|
||||||
+++ b/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;
|
return NullPixmap;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -807,18 +807,18 @@ index 97e8fb6642..260c60b652 100644
|
|||||||
#ifdef XV
|
#ifdef XV
|
||||||
/* glamor Xv Adaptor */
|
/* glamor Xv Adaptor */
|
||||||
diff --git a/hw/xwayland/xwayland-present.c b/hw/xwayland/xwayland-present.c
|
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
|
--- a/hw/xwayland/xwayland-present.c
|
||||||
+++ b/hw/xwayland/xwayland-present.c
|
+++ b/hw/xwayland/xwayland-present.c
|
||||||
@@ -27,6 +27,7 @@
|
@@ -30,6 +30,7 @@
|
||||||
|
#endif
|
||||||
#include <windowstr.h>
|
#include <windowstr.h>
|
||||||
#include <present.h>
|
#include <present.h>
|
||||||
+#include <sys/eventfd.h>
|
+#include <sys/eventfd.h>
|
||||||
|
|
||||||
#include "xwayland-present.h"
|
#include "xwayland-present.h"
|
||||||
#include "xwayland-screen.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
|
static void
|
||||||
xwl_present_execute(present_vblank_ptr vblank, uint64_t ust, uint64_t crtc_msc);
|
xwl_present_execute(present_vblank_ptr vblank, uint64_t ust, uint64_t crtc_msc);
|
||||||
|
|
||||||
@ -838,7 +838,7 @@ index 941be06daf..f402a85622 100644
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int
|
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;
|
return Success;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -855,7 +855,7 @@ index 941be06daf..f402a85622 100644
|
|||||||
/*
|
/*
|
||||||
* When the wait fence or previous flip is completed, it's time
|
* When the wait fence or previous flip is completed, it's time
|
||||||
* to re-try the request
|
* 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
|
static void
|
||||||
xwl_present_re_execute(present_vblank_ptr vblank)
|
xwl_present_re_execute(present_vblank_ptr vblank)
|
||||||
{
|
{
|
||||||
@ -883,7 +883,7 @@ index 941be06daf..f402a85622 100644
|
|||||||
xwl_present_execute(vblank, ust, crtc_msc);
|
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
|
static void
|
||||||
xwl_present_free_idle_vblank(present_vblank_ptr vblank)
|
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);
|
present_pixmap_idle(vblank->pixmap, vblank->window, vblank->serial, vblank->idle_fence);
|
||||||
xwl_present_free_event(xwl_present_event_from_vblank(vblank));
|
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;
|
return;
|
||||||
|
|
||||||
vblank = &event->vblank;
|
vblank = &event->vblank;
|
||||||
@ -906,23 +906,27 @@ index 941be06daf..f402a85622 100644
|
|||||||
present_pixmap_idle(vblank->pixmap, vblank->window, vblank->serial, vblank->idle_fence);
|
present_pixmap_idle(vblank->pixmap, vblank->window, vblank->serial, vblank->idle_fence);
|
||||||
|
|
||||||
xwl_present_window = xwl_present_window_priv(vblank->window);
|
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
|
+static int
|
||||||
+xwl_present_flush_fenced(WindowPtr window)
|
+xwl_present_flush_fenced(WindowPtr window)
|
||||||
+{
|
+{
|
||||||
|
+ int fence = -1;
|
||||||
|
+#ifdef XWL_HAS_GLAMOR
|
||||||
+ struct xwl_window *xwl_window = xwl_window_from_window(window);
|
+ 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);
|
+ xwl_present_flush(window);
|
||||||
|
+#endif /* XWL_HAS_GLAMOR */
|
||||||
+ return fence;
|
+ return fence;
|
||||||
+}
|
+}
|
||||||
+
|
+
|
||||||
static Bool
|
static Bool
|
||||||
xwl_present_check_flip(RRCrtcPtr crtc,
|
xwl_present_check_flip(RRCrtcPtr crtc,
|
||||||
WindowPtr present_window,
|
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) {
|
if (xwl_window->tearing_control) {
|
||||||
uint32_t hint;
|
uint32_t hint;
|
||||||
@ -931,7 +935,7 @@ index 941be06daf..f402a85622 100644
|
|||||||
hint = WP_TEARING_CONTROL_V1_PRESENTATION_HINT_ASYNC;
|
hint = WP_TEARING_CONTROL_V1_PRESENTATION_HINT_ASYNC;
|
||||||
else
|
else
|
||||||
hint = WP_TEARING_CONTROL_V1_PRESENTATION_HINT_VSYNC;
|
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);
|
xorg_list_del(&vblank->event_queue);
|
||||||
|
|
||||||
@ -939,7 +943,7 @@ index 941be06daf..f402a85622 100644
|
|||||||
if (present_execute_wait(vblank, crtc_msc))
|
if (present_execute_wait(vblank, crtc_msc))
|
||||||
return;
|
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;
|
vblank->flip = FALSE;
|
||||||
@ -948,7 +952,7 @@ index 941be06daf..f402a85622 100644
|
|||||||
}
|
}
|
||||||
DebugPresent(("\tc %p %" PRIu64 ": %08" PRIx32 " -> %08" PRIx32 "\n",
|
DebugPresent(("\tc %p %" PRIu64 ": %08" PRIx32 " -> %08" PRIx32 "\n",
|
||||||
vblank, crtc_msc, vblank->pixmap->drawable.id, vblank->window->drawable.id));
|
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,
|
RRCrtcPtr target_crtc,
|
||||||
SyncFence *wait_fence,
|
SyncFence *wait_fence,
|
||||||
SyncFence *idle_fence,
|
SyncFence *idle_fence,
|
||||||
@ -959,7 +963,7 @@ index 941be06daf..f402a85622 100644
|
|||||||
uint32_t options,
|
uint32_t options,
|
||||||
uint64_t target_window_msc,
|
uint64_t target_window_msc,
|
||||||
uint64_t divisor,
|
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;
|
ScreenPtr screen = window->drawable.pScreen;
|
||||||
present_window_priv_ptr window_priv = present_get_window_priv(window, TRUE);
|
present_window_priv_ptr window_priv = present_get_window_priv(window, TRUE);
|
||||||
present_screen_priv_ptr screen_priv = present_screen_priv(screen);
|
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);
|
target_crtc = xwl_present_get_crtc(screen_priv, window);
|
||||||
|
|
||||||
ret = xwl_present_get_ust_msc(screen, window, &ust, &crtc_msc);
|
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)
|
if (vblank->target_msc != target_msc)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
@ -988,7 +992,7 @@ index 941be06daf..f402a85622 100644
|
|||||||
present_vblank_scrap(vblank);
|
present_vblank_scrap(vblank);
|
||||||
if (vblank->flip_ready)
|
if (vblank->flip_ready)
|
||||||
xwl_present_re_execute(vblank);
|
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;
|
vblank = &event->vblank;
|
||||||
if (!present_vblank_init(vblank, window, pixmap, serial, valid, update, x_off, y_off,
|
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;
|
vblank->queued = TRUE;
|
||||||
if (crtc_msc < vblank->exec_msc) {
|
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))
|
if (!dixRegisterPrivateKey(&xwl_present_window_private_key, PRIVATE_WINDOW, 0))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
+ xwl_screen->present_capabilities = XWL_PRESENT_CAPS;
|
+ xwl_screen->present_capabilities = XWL_PRESENT_CAPS;
|
||||||
|
+#ifdef XWL_HAS_GLAMOR
|
||||||
+ if (epoxy_has_egl_extension(xwl_screen->egl_display,
|
+ if (epoxy_has_egl_extension(xwl_screen->egl_display,
|
||||||
+ "ANDROID_native_fence_sync"))
|
+ "ANDROID_native_fence_sync"))
|
||||||
+ xwl_screen->present_capabilities |=
|
+ xwl_screen->present_capabilities |=
|
||||||
+ PresentCapabilitySyncobj;
|
+ PresentCapabilitySyncobj;
|
||||||
|
+#endif /* XWL_HAS_GLAMOR */
|
||||||
+
|
+
|
||||||
screen_priv->query_capabilities = xwl_present_query_capabilities;
|
screen_priv->query_capabilities = xwl_present_query_capabilities;
|
||||||
screen_priv->get_crtc = xwl_present_get_crtc;
|
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->present_pixmap = xwl_present_pixmap;
|
||||||
screen_priv->queue_vblank = xwl_present_queue_vblank;
|
screen_priv->queue_vblank = xwl_present_queue_vblank;
|
||||||
screen_priv->flush = xwl_present_flush;
|
screen_priv->flush = xwl_present_flush;
|
||||||
@ -1040,10 +1054,10 @@ index 941be06daf..f402a85622 100644
|
|||||||
|
|
||||||
screen_priv->abort_vblank = xwl_present_abort_vblank;
|
screen_priv->abort_vblank = xwl_present_abort_vblank;
|
||||||
diff --git a/hw/xwayland/xwayland-present.h b/hw/xwayland/xwayland-present.h
|
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
|
--- a/hw/xwayland/xwayland-present.h
|
||||||
+++ b/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;
|
present_vblank_rec vblank;
|
||||||
|
|
||||||
PixmapPtr pixmap;
|
PixmapPtr pixmap;
|
||||||
@ -1056,17 +1070,17 @@ index 4fd1e579ff..8a6f11ec4e 100644
|
|||||||
|
|
||||||
Bool xwl_present_entered_for_each_frame_callback(void);
|
Bool xwl_present_entered_for_each_frame_callback(void);
|
||||||
diff --git a/hw/xwayland/xwayland-screen.h b/hw/xwayland/xwayland-screen.h
|
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
|
--- a/hw/xwayland/xwayland-screen.h
|
||||||
+++ b/hw/xwayland/xwayland-screen.h
|
+++ b/hw/xwayland/xwayland-screen.h
|
||||||
@@ -145,6 +146,8 @@ struct xwl_screen {
|
@@ -147,6 +147,8 @@ struct xwl_screen {
|
||||||
int libdecor_fd;
|
|
||||||
struct libdecor *libdecor_context;
|
struct libdecor *libdecor_context;
|
||||||
#endif
|
#endif
|
||||||
|
const char *output_name;
|
||||||
+
|
+
|
||||||
+ uint32_t present_capabilities;
|
+ uint32_t present_capabilities;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Apps which use randr/vidmode to change the mode when going fullscreen,
|
/* Apps which use randr/vidmode to change the mode when going fullscreen,
|
||||||
diff --git a/include/protocol-versions.h b/include/protocol-versions.h
|
diff --git a/include/protocol-versions.h b/include/protocol-versions.h
|
||||||
index 2b0f85e392..aa3ba41fe1 100644
|
index 2b0f85e392..aa3ba41fe1 100644
|
||||||
@ -1642,10 +1656,10 @@ index 4f94f16e44..2eb57abfff 100644
|
|||||||
GitLab
|
GitLab
|
||||||
|
|
||||||
|
|
||||||
From 3def7fbff930f94ae1e1d31a55520988c1ec153e Mon Sep 17 00:00:00 2001
|
From bcb2a82b5c83a25351ff806df29a2a6bad4648e6 Mon Sep 17 00:00:00 2001
|
||||||
From: Erik Kurzinger <ekurzinger@nvidia.com>
|
From: Erik Kurzinger <ekurzinger@nvidia.com>
|
||||||
Date: Tue, 15 Aug 2023 15:32:47 -0700
|
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
|
This protocol allows for explicit synchronization of GPU operations by
|
||||||
Wayland clients and the compositor. Xwayland can make use of this to
|
Wayland clients and the compositor. Xwayland can make use of this to
|
||||||
@ -1665,7 +1679,7 @@ Signed-off-by: Erik Kurzinger <ekurzinger@nvidia.com>
|
|||||||
hw/xwayland/xwayland-glamor-gbm.c | 146 +++++++++++++++++++++++++-
|
hw/xwayland/xwayland-glamor-gbm.c | 146 +++++++++++++++++++++++++-
|
||||||
hw/xwayland/xwayland-glamor.c | 94 +++++++++++++++++
|
hw/xwayland/xwayland-glamor.c | 94 +++++++++++++++++
|
||||||
hw/xwayland/xwayland-glamor.h | 30 ++++++
|
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-present.h | 1 -
|
||||||
hw/xwayland/xwayland-screen.c | 1 +
|
hw/xwayland/xwayland-screen.c | 1 +
|
||||||
hw/xwayland/xwayland-screen.h | 1 +
|
hw/xwayland/xwayland-screen.h | 1 +
|
||||||
@ -1673,13 +1687,13 @@ Signed-off-by: Erik Kurzinger <ekurzinger@nvidia.com>
|
|||||||
hw/xwayland/xwayland-window.c | 10 ++
|
hw/xwayland/xwayland-window.c | 10 ++
|
||||||
hw/xwayland/xwayland-window.h | 1 +
|
hw/xwayland/xwayland-window.h | 1 +
|
||||||
present/present_execute.c | 5 +-
|
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
|
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
|
--- a/hw/xwayland/meson.build
|
||||||
+++ b/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')
|
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')
|
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')
|
tearing_xml = join_paths(protodir, 'staging', 'tearing-control', 'tearing-control-v1.xml')
|
||||||
@ -1687,7 +1701,7 @@ index 748c40c150..4fa1dcd8ec 100644
|
|||||||
|
|
||||||
client_header = generator(scanner,
|
client_header = generator(scanner,
|
||||||
output : '@BASENAME@-client-protocol.h',
|
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(shortcuts_inhibit_xml)
|
||||||
srcs += client_header.process(xwayland_shell_xml)
|
srcs += client_header.process(xwayland_shell_xml)
|
||||||
srcs += client_header.process(tearing_xml)
|
srcs += client_header.process(tearing_xml)
|
||||||
@ -1695,7 +1709,7 @@ index 748c40c150..4fa1dcd8ec 100644
|
|||||||
srcs += code.process(relative_xml)
|
srcs += code.process(relative_xml)
|
||||||
srcs += code.process(pointer_xml)
|
srcs += code.process(pointer_xml)
|
||||||
srcs += code.process(gestures_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(shortcuts_inhibit_xml)
|
||||||
srcs += code.process(xwayland_shell_xml)
|
srcs += code.process(xwayland_shell_xml)
|
||||||
srcs += code.process(tearing_xml)
|
srcs += code.process(tearing_xml)
|
||||||
@ -1704,7 +1718,7 @@ index 748c40c150..4fa1dcd8ec 100644
|
|||||||
if build_ei
|
if build_ei
|
||||||
xwayland_dep += libei_dep
|
xwayland_dep += libei_dep
|
||||||
diff --git a/hw/xwayland/xwayland-glamor-gbm.c b/hw/xwayland/xwayland-glamor-gbm.c
|
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
|
--- a/hw/xwayland/xwayland-glamor-gbm.c
|
||||||
+++ b/hw/xwayland/xwayland-glamor-gbm.c
|
+++ b/hw/xwayland/xwayland-glamor-gbm.c
|
||||||
@@ -35,6 +35,9 @@
|
@@ -35,6 +35,9 @@
|
||||||
@ -1725,7 +1739,7 @@ index c1d9ddd37f..2047c9f4df 100644
|
|||||||
|
|
||||||
struct xwl_gbm_private {
|
struct xwl_gbm_private {
|
||||||
drmDevice *device;
|
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);
|
wl_drm_destroy(xwl_gbm->drm);
|
||||||
if (xwl_gbm->gbm)
|
if (xwl_gbm->gbm)
|
||||||
gbm_device_destroy(xwl_gbm->gbm);
|
gbm_device_destroy(xwl_gbm->gbm);
|
||||||
@ -1734,7 +1748,7 @@ index c1d9ddd37f..2047c9f4df 100644
|
|||||||
|
|
||||||
free(xwl_gbm);
|
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;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1823,7 +1837,7 @@ index c1d9ddd37f..2047c9f4df 100644
|
|||||||
static Bool
|
static Bool
|
||||||
xwl_dri3_check_syncobj(struct dri3_syncobj *syncobj, uint64_t point, Bool check_avail)
|
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_screen *xwl_screen = xwl_screen_get(syncobj->screen);
|
||||||
struct xwl_gbm_private *xwl_gbm = xwl_gbm_get(xwl_screen);
|
struct xwl_gbm_private *xwl_gbm = xwl_gbm_get(xwl_screen);
|
||||||
|
|
||||||
@ -1833,7 +1847,7 @@ index c1d9ddd37f..2047c9f4df 100644
|
|||||||
if (xwl_syncobj->handle)
|
if (xwl_syncobj->handle)
|
||||||
drmSyncobjDestroy(xwl_gbm->drm_fd, 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_dri3_syncobj *syncobj = calloc(1, sizeof (*syncobj));
|
||||||
struct xwl_gbm_private *xwl_gbm = xwl_gbm_get(xwl_screen);
|
struct xwl_gbm_private *xwl_gbm = xwl_gbm_get(xwl_screen);
|
||||||
@ -1861,7 +1875,7 @@ index c1d9ddd37f..2047c9f4df 100644
|
|||||||
syncobj->handle = handle;
|
syncobj->handle = handle;
|
||||||
syncobj->base.screen = xwl_screen->screen;
|
syncobj->base.screen = xwl_screen->screen;
|
||||||
syncobj->base.refcount = 1;
|
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;
|
return &syncobj->base;
|
||||||
|
|
||||||
fail:
|
fail:
|
||||||
@ -1880,7 +1894,7 @@ index c1d9ddd37f..2047c9f4df 100644
|
|||||||
static struct dri3_syncobj *
|
static struct dri3_syncobj *
|
||||||
xwl_dri3_import_syncobj(ClientPtr client, ScreenPtr screen, XID id, int fd)
|
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) {
|
} else if (strcmp(name, zwp_linux_dmabuf_v1_interface.name) == 0) {
|
||||||
xwl_screen_set_dmabuf_interface(xwl_screen, id, version);
|
xwl_screen_set_dmabuf_interface(xwl_screen, id, version);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
@ -1892,16 +1906,16 @@ index c1d9ddd37f..2047c9f4df 100644
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* no match */
|
/* 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);
|
struct xwl_gbm_private *xwl_gbm = xwl_gbm_get(xwl_screen);
|
||||||
EGLint major, minor;
|
EGLint major, minor;
|
||||||
const GLubyte *renderer;
|
const GLubyte *renderer;
|
||||||
- const char *gbm_backend_name;
|
- const char *gbm_backend_name;
|
||||||
+ const char *gbm_backend_name, *egl_vendor;
|
+ const char *gbm_backend_name, *egl_vendor;
|
||||||
|
|
||||||
if (!xwl_gbm->fd_render_node && !xwl_gbm->drm_authenticated) {
|
if (!xwl_gbm->drm && !xwl_glamor_gbm_init_main_dev(xwl_screen))
|
||||||
ErrorF("Failed to get wl_drm, disabling Glamor and DRI3\n");
|
return FALSE;
|
||||||
@@ -1408,6 +1523,25 @@ xwl_glamor_gbm_init_egl(struct xwl_screen *xwl_screen)
|
@@ -1455,6 +1570,25 @@ xwl_glamor_gbm_init_egl(struct xwl_screen *xwl_screen)
|
||||||
xwl_screen->glvnd_vendor = gbm_backend_name;
|
xwl_screen->glvnd_vendor = gbm_backend_name;
|
||||||
xwl_gbm->glamor_gles = !epoxy_is_desktop_gl();
|
xwl_gbm->glamor_gles = !epoxy_is_desktop_gl();
|
||||||
|
|
||||||
@ -1927,7 +1941,7 @@ index c1d9ddd37f..2047c9f4df 100644
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
error:
|
error:
|
||||||
if (xwl_screen->egl_display != EGL_NO_DISPLAY) {
|
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);
|
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.version = 4;
|
||||||
xwl_dri3_info.import_syncobj = xwl_dri3_import_syncobj;
|
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.get_main_device = xwl_gbm_get_main_device;
|
||||||
xwl_screen->gbm_backend.is_available = TRUE;
|
xwl_screen->gbm_backend.is_available = TRUE;
|
||||||
xwl_screen->gbm_backend.backend_flags = XWL_EGL_BACKEND_NEEDS_BUFFER_FLUSH |
|
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;
|
+ 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
|
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
|
--- a/hw/xwayland/xwayland-glamor.c
|
||||||
+++ b/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);
|
XWL_EGL_BACKEND_NEEDS_N_BUFFERING);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1981,7 +1995,7 @@ index 2b18cba1ee..5fd3b837d9 100644
|
|||||||
PixmapPtr
|
PixmapPtr
|
||||||
xwl_glamor_create_pixmap_for_window(struct xwl_window *xwl_window)
|
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;
|
return fence_fd;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2130,18 +2144,18 @@ index 260c60b652..7e3eea014b 100644
|
|||||||
#ifdef XV
|
#ifdef XV
|
||||||
/* glamor Xv Adaptor */
|
/* glamor Xv Adaptor */
|
||||||
diff --git a/hw/xwayland/xwayland-present.c b/hw/xwayland/xwayland-present.c
|
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
|
--- a/hw/xwayland/xwayland-present.c
|
||||||
+++ b/hw/xwayland/xwayland-present.c
|
+++ b/hw/xwayland/xwayland-present.c
|
||||||
@@ -36,6 +36,7 @@
|
@@ -39,6 +39,7 @@
|
||||||
#include "glamor.h"
|
#include "xwayland-pixmap.h"
|
||||||
|
|
||||||
#include "tearing-control-v1-client-protocol.h"
|
#include "tearing-control-v1-client-protocol.h"
|
||||||
+#include "linux-drm-syncobj-v1-client-protocol.h"
|
+#include "linux-drm-syncobj-v1-client-protocol.h"
|
||||||
|
|
||||||
#define XWL_PRESENT_CAPS PresentCapabilityAsync | PresentCapabilityAsyncMayTear
|
#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
|
static void
|
||||||
xwl_present_free_idle_vblank(present_vblank_ptr vblank)
|
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);
|
present_pixmap_idle(vblank->pixmap, vblank->window, vblank->serial, vblank->idle_fence);
|
||||||
xwl_present_free_event(xwl_present_event_from_vblank(vblank));
|
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)
|
xwl_present_buffer_release(void *data)
|
||||||
{
|
{
|
||||||
struct xwl_present_window *xwl_present_window;
|
struct xwl_present_window *xwl_present_window;
|
||||||
@ -2160,7 +2174,7 @@ index f402a85622..b88107a1ae 100644
|
|||||||
struct xwl_present_event *event = data;
|
struct xwl_present_event *event = data;
|
||||||
present_vblank_ptr vblank;
|
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;
|
vblank = &event->vblank;
|
||||||
|
|
||||||
@ -2168,6 +2182,7 @@ index f402a85622..b88107a1ae 100644
|
|||||||
- vblank->release_syncobj->signal(vblank->release_syncobj,
|
- vblank->release_syncobj->signal(vblank->release_syncobj,
|
||||||
- vblank->release_point);
|
- vblank->release_point);
|
||||||
+ xwl_screen = xwl_screen_get(vblank->screen);
|
+ xwl_screen = xwl_screen_get(vblank->screen);
|
||||||
|
+#ifdef XWL_HAS_GLAMOR
|
||||||
+ if (vblank->release_syncobj && !xwl_screen->explicit_sync) {
|
+ if (vblank->release_syncobj && !xwl_screen->explicit_sync) {
|
||||||
+ /* transfer implicit fence to release syncobj */
|
+ /* transfer implicit fence to release syncobj */
|
||||||
+ int fence_fd = xwl_glamor_dmabuf_export_sync_file(vblank->pixmap);
|
+ int fence_fd = xwl_glamor_dmabuf_export_sync_file(vblank->pixmap);
|
||||||
@ -2175,10 +2190,11 @@ index f402a85622..b88107a1ae 100644
|
|||||||
+ vblank->release_point,
|
+ vblank->release_point,
|
||||||
+ fence_fd);
|
+ fence_fd);
|
||||||
+ }
|
+ }
|
||||||
|
+#endif /* XWL_HAS_GLAMOR */
|
||||||
|
|
||||||
present_pixmap_idle(vblank->pixmap, vblank->window, vblank->serial, vblank->idle_fence);
|
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);
|
WindowPtr toplvl_window = xwl_present_toplvl_pixmap_window(present_window);
|
||||||
struct xwl_window *xwl_window = xwl_window_from_window(present_window);
|
struct xwl_window *xwl_window = xwl_window_from_window(present_window);
|
||||||
ScreenPtr screen = pixmap->drawable.pScreen;
|
ScreenPtr screen = pixmap->drawable.pScreen;
|
||||||
@ -2186,18 +2202,20 @@ index f402a85622..b88107a1ae 100644
|
|||||||
|
|
||||||
if (reason)
|
if (reason)
|
||||||
*reason = PRESENT_FLIP_REASON_UNKNOWN;
|
*reason = PRESENT_FLIP_REASON_UNKNOWN;
|
||||||
@@ -736,6 +740,10 @@ xwl_present_check_flip(RRCrtcPtr crtc,
|
@@ -753,7 +759,11 @@ xwl_present_check_flip(RRCrtcPtr crtc,
|
||||||
if (!xwl_glamor_check_flip(present_window, pixmap))
|
if (xwl_window->xwl_screen->glamor &&
|
||||||
|
!xwl_glamor_check_flip(present_window, pixmap))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
-#endif
|
||||||
|
+
|
||||||
+ if (!xwl_glamor_supports_implicit_sync(xwl_screen) &&
|
+ if (!xwl_glamor_supports_implicit_sync(xwl_screen) &&
|
||||||
+ !xwl_screen->explicit_sync)
|
+ !xwl_screen->explicit_sync)
|
||||||
+ return FALSE;
|
+ return FALSE;
|
||||||
+
|
+#endif /* XWL_HAS_GLAMOR */
|
||||||
|
|
||||||
/* Can't flip if the window pixmap doesn't match the xwl_window parent
|
/* 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
|
* window's, e.g. because a client redirected this window or one of its
|
||||||
* parents.
|
@@ -833,6 +843,7 @@ xwl_present_flip(present_vblank_ptr vblank, RegionPtr damage)
|
||||||
@@ -814,6 +822,7 @@ xwl_present_flip(present_vblank_ptr vblank, RegionPtr damage)
|
|
||||||
PixmapPtr pixmap = vblank->pixmap;
|
PixmapPtr pixmap = vblank->pixmap;
|
||||||
struct xwl_window *xwl_window = xwl_window_from_window(present_window);
|
struct xwl_window *xwl_window = xwl_window_from_window(present_window);
|
||||||
struct xwl_present_window *xwl_present_window = xwl_present_window_priv(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;
|
BoxPtr damage_box;
|
||||||
struct wl_buffer *buffer;
|
struct wl_buffer *buffer;
|
||||||
struct xwl_present_event *event = xwl_present_event_from_vblank(vblank);
|
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;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2220,9 +2238,7 @@ index f402a85622..b88107a1ae 100644
|
|||||||
|
|
||||||
event->pixmap = pixmap;
|
event->pixmap = pixmap;
|
||||||
|
|
||||||
+ assert(xwl_glamor_supports_implicit_sync(xwl_screen) ||
|
+#ifdef XWL_HAS_GLAMOR
|
||||||
+ xwl_screen->explicit_sync);
|
|
||||||
+
|
|
||||||
+ if (vblank->acquire_syncobj && vblank->release_syncobj) {
|
+ if (vblank->acquire_syncobj && vblank->release_syncobj) {
|
||||||
+ if (xwl_screen->explicit_sync)
|
+ if (xwl_screen->explicit_sync)
|
||||||
+ xwl_glamor_dri3_syncobj_passthrough(present_window,
|
+ 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);
|
+ 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);
|
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) */
|
/* 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;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2261,7 +2278,7 @@ index f402a85622..b88107a1ae 100644
|
|||||||
/*
|
/*
|
||||||
* Once the required MSC has been reached, execute the pending request.
|
* 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;
|
WindowPtr window = vblank->window;
|
||||||
struct xwl_present_window *xwl_present_window = xwl_present_window_get_priv(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);
|
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);
|
xorg_list_del(&vblank->event_queue);
|
||||||
|
|
||||||
@@ -919,6 +965,19 @@ retry:
|
@@ -938,6 +985,19 @@ retry:
|
||||||
vblank->event_id, vblank, crtc_msc,
|
vblank->event_id, vblank, crtc_msc,
|
||||||
vblank->pixmap->drawable.id, vblank->window->drawable.id));
|
vblank->pixmap->drawable.id, vblank->window->drawable.id));
|
||||||
|
|
||||||
@ -2289,24 +2306,24 @@ index f402a85622..b88107a1ae 100644
|
|||||||
/* Set update region as damaged */
|
/* Set update region as damaged */
|
||||||
if (vblank->update) {
|
if (vblank->update) {
|
||||||
damage = RegionDuplicate(vblank->update);
|
damage = RegionDuplicate(vblank->update);
|
||||||
@@ -1136,10 +1195,8 @@ xwl_present_init(ScreenPtr screen)
|
@@ -1158,10 +1218,8 @@ xwl_present_init(ScreenPtr screen)
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
xwl_screen->present_capabilities = XWL_PRESENT_CAPS;
|
xwl_screen->present_capabilities = XWL_PRESENT_CAPS;
|
||||||
|
#ifdef XWL_HAS_GLAMOR
|
||||||
- if (epoxy_has_egl_extension(xwl_screen->egl_display,
|
- if (epoxy_has_egl_extension(xwl_screen->egl_display,
|
||||||
- "ANDROID_native_fence_sync"))
|
- "ANDROID_native_fence_sync"))
|
||||||
- xwl_screen->present_capabilities |=
|
- xwl_screen->present_capabilities |=
|
||||||
- PresentCapabilitySyncobj;
|
- PresentCapabilitySyncobj;
|
||||||
+ if (xwl_glamor_supports_syncobjs(xwl_screen))
|
+ if (xwl_glamor_supports_syncobjs(xwl_screen))
|
||||||
+ xwl_screen->present_capabilities |= PresentCapabilitySyncobj;
|
+ xwl_screen->present_capabilities |= PresentCapabilitySyncobj;
|
||||||
|
#endif /* XWL_HAS_GLAMOR */
|
||||||
|
|
||||||
screen_priv->query_capabilities = xwl_present_query_capabilities;
|
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
|
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
|
--- a/hw/xwayland/xwayland-present.h
|
||||||
+++ b/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;
|
present_vblank_rec vblank;
|
||||||
|
|
||||||
PixmapPtr pixmap;
|
PixmapPtr pixmap;
|
||||||
@ -2315,7 +2332,7 @@ index 8a6f11ec4e..ffc16f52e6 100644
|
|||||||
uint64_t divisor;
|
uint64_t divisor;
|
||||||
uint64_t remainder;
|
uint64_t remainder;
|
||||||
diff --git a/hw/xwayland/xwayland-screen.c b/hw/xwayland/xwayland-screen.c
|
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
|
--- a/hw/xwayland/xwayland-screen.c
|
||||||
+++ b/hw/xwayland/xwayland-screen.c
|
+++ b/hw/xwayland/xwayland-screen.c
|
||||||
@@ -68,6 +68,7 @@
|
@@ -68,6 +68,7 @@
|
||||||
@ -2327,10 +2344,10 @@ index 22afd4e948..092b3768f1 100644
|
|||||||
static DevPrivateKeyRec xwl_screen_private_key;
|
static DevPrivateKeyRec xwl_screen_private_key;
|
||||||
static DevPrivateKeyRec xwl_client_private_key;
|
static DevPrivateKeyRec xwl_client_private_key;
|
||||||
diff --git a/hw/xwayland/xwayland-screen.h b/hw/xwayland/xwayland-screen.h
|
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
|
--- a/hw/xwayland/xwayland-screen.h
|
||||||
+++ b/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 wp_viewporter *viewporter;
|
||||||
struct xwayland_shell_v1 *xwayland_shell;
|
struct xwayland_shell_v1 *xwayland_shell;
|
||||||
struct wp_tearing_control_manager_v1 *tearing_control_manager;
|
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 queued_drm_lease_devices;
|
||||||
struct xorg_list drm_leases;
|
struct xorg_list drm_leases;
|
||||||
diff --git a/hw/xwayland/xwayland-window-buffers.c b/hw/xwayland/xwayland-window-buffers.c
|
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
|
--- a/hw/xwayland/xwayland-window-buffers.c
|
||||||
+++ b/hw/xwayland/xwayland-window-buffers.c
|
+++ b/hw/xwayland/xwayland-window-buffers.c
|
||||||
@@ -32,6 +32,14 @@
|
@@ -32,6 +32,14 @@
|
||||||
@ -2364,9 +2381,9 @@ index 599ad53707..c5aa348ed4 100644
|
|||||||
+ struct dri3_syncobj *syncobj;
|
+ struct dri3_syncobj *syncobj;
|
||||||
+ uint64_t timeline_point;
|
+ uint64_t timeline_point;
|
||||||
+ int efd;
|
+ int efd;
|
||||||
Bool recycle_on_release;
|
|
||||||
int refcnt;
|
int refcnt;
|
||||||
uint32_t time;
|
uint32_t time;
|
||||||
|
struct xorg_list link_buffer;
|
||||||
@@ -76,6 +87,7 @@ xwl_window_buffer_new(struct xwl_window *xwl_window)
|
@@ -76,6 +87,7 @@ xwl_window_buffer_new(struct xwl_window *xwl_window)
|
||||||
xwl_window_buffer->xwl_window = xwl_window;
|
xwl_window_buffer->xwl_window = xwl_window;
|
||||||
xwl_window_buffer->damage_region = RegionCreate(NullBox, 1);
|
xwl_window_buffer->damage_region = RegionCreate(NullBox, 1);
|
||||||
@ -2409,7 +2426,7 @@ index 599ad53707..c5aa348ed4 100644
|
|||||||
void
|
void
|
||||||
xwl_window_buffers_init(struct xwl_window *xwl_window)
|
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);
|
screen->DestroyPixmap(window_pixmap);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2456,10 +2473,16 @@ index 599ad53707..c5aa348ed4 100644
|
|||||||
PixmapPtr
|
PixmapPtr
|
||||||
xwl_window_buffers_get_pixmap(struct xwl_window *xwl_window,
|
xwl_window_buffers_get_pixmap(struct xwl_window *xwl_window,
|
||||||
RegionPtr damage_region)
|
RegionPtr damage_region)
|
||||||
@@ -313,6 +385,16 @@ xwl_window_buffers_get_pixmap(struct xwl_window *xwl_window,
|
@@ -349,11 +421,22 @@ xwl_window_buffers_get_pixmap(struct xwl_window *xwl_window,
|
||||||
|
xwl_window_buffer_add_damage_region(xwl_window, damage_region);
|
||||||
full_damage = xwl_window_buffer->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
|
+#ifdef XWL_HAS_GLAMOR
|
||||||
+ if (xwl_window_buffer->syncobj) {
|
+ if (xwl_window_buffer->syncobj) {
|
||||||
+ int fence_fd =
|
+ int fence_fd =
|
||||||
@ -2470,10 +2493,10 @@ index 599ad53707..c5aa348ed4 100644
|
|||||||
+ }
|
+ }
|
||||||
+#endif /* XWL_HAS_GLAMOR */
|
+#endif /* XWL_HAS_GLAMOR */
|
||||||
+
|
+
|
||||||
if (xwl_window_buffer->pixmap) {
|
new_window_pixmap = xwl_window_buffer->pixmap;
|
||||||
BoxPtr pBox = RegionRects(full_damage);
|
|
||||||
int nBox = RegionNumRects(full_damage);
|
while (nBox--) {
|
||||||
@@ -384,9 +467,30 @@ xwl_window_buffers_get_pixmap(struct xwl_window *xwl_window,
|
@@ -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 */
|
/* Hold a reference on the buffer until it's released by the compositor */
|
||||||
xwl_window_buffer->refcnt++;
|
xwl_window_buffer->refcnt++;
|
||||||
@ -2508,10 +2531,10 @@ index 599ad53707..c5aa348ed4 100644
|
|||||||
xorg_list_del(&xwl_window_buffer->link_buffer);
|
xorg_list_del(&xwl_window_buffer->link_buffer);
|
||||||
xorg_list_append(&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
|
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
|
--- a/hw/xwayland/xwayland-window.c
|
||||||
+++ b/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 "viewporter-client-protocol.h"
|
||||||
#include "xdg-shell-client-protocol.h"
|
#include "xdg-shell-client-protocol.h"
|
||||||
#include "xwayland-shell-v1-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 */
|
#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)
|
if (xwl_window->tearing_control)
|
||||||
wp_tearing_control_v1_destroy(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);
|
release_wl_surface_for_window(xwl_window);
|
||||||
xorg_list_del(&xwl_window->link_damage);
|
xorg_list_del(&xwl_window->link_damage);
|
||||||
xorg_list_del(&xwl_window->link_window);
|
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);
|
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) {
|
+ if (xwl_window->surface_sync) {
|
||||||
+ /* default to implicit sync */
|
+ /* default to implicit sync */
|
||||||
+ wp_linux_drm_syncobj_surface_v1_destroy(xwl_window->surface_sync);
|
+ wp_linux_drm_syncobj_surface_v1_destroy(xwl_window->surface_sync);
|
||||||
+ xwl_window->surface_sync = NULL;
|
+ xwl_window->surface_sync = NULL;
|
||||||
+ }
|
+ }
|
||||||
+
|
+
|
||||||
if (xwl_screen->glamor)
|
if (!buffer) {
|
||||||
buffer = xwl_glamor_pixmap_get_wl_buffer(pixmap);
|
ErrorF("Error getting buffer\n");
|
||||||
else
|
return FALSE;
|
||||||
diff --git a/hw/xwayland/xwayland-window.h b/hw/xwayland/xwayland-window.h
|
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
|
--- a/hw/xwayland/xwayland-window.h
|
||||||
+++ b/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 */
|
/* If TRUE, the window buffer format supports scanout with implicit modifier */
|
||||||
Bool has_implicit_scanout_support;
|
Bool has_implicit_scanout_support;
|
||||||
struct wp_tearing_control_v1 *tearing_control;
|
struct wp_tearing_control_v1 *tearing_control;
|
||||||
@ -2571,4 +2594,83 @@ index 913a8b67ba..2fb49749eb 100644
|
|||||||
vblank->acquire_point)) {
|
vblank->acquire_point)) {
|
||||||
vblank->efd = eventfd(0, EFD_CLOEXEC);
|
vblank->efd = eventfd(0, EFD_CLOEXEC);
|
||||||
--
|
--
|
||||||
GitLab
|
GitLab
|
||||||
|
|
||||||
|
|
||||||
|
From b28cb0a1dd8872a667843c6be297588ba5c405e9 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Erik Kurzinger <ekurzinger@nvidia.com>
|
||||||
|
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 <ekurzinger@nvidia.com>
|
||||||
|
---
|
||||||
|
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
|
||||||
|
Loading…
Reference in New Issue
Block a user