|
|
d05f4b |
From 9966356963803db35997f26330fb1245777012a1 Mon Sep 17 00:00:00 2001
|
|
|
d05f4b |
From: Olivier Fourdan <ofourdan@redhat.com>
|
|
|
d05f4b |
Date: Thu, 15 Apr 2021 10:59:36 +0200
|
|
|
d05f4b |
Subject: [PATCH xserver 11/27] xwayland/eglstream: Small refactoring
|
|
|
d05f4b |
MIME-Version: 1.0
|
|
|
d05f4b |
Content-Type: text/plain; charset=UTF-8
|
|
|
d05f4b |
Content-Transfer-Encoding: 8bit
|
|
|
d05f4b |
|
|
|
d05f4b |
Some functions are called "callback" whereas they are not longer
|
|
|
d05f4b |
callback functions or "unref" while they no longer deal with a reference
|
|
|
d05f4b |
counter anymore, which is quite confusing. Rename those functions to be
|
|
|
d05f4b |
more explicit.
|
|
|
d05f4b |
|
|
|
d05f4b |
Also, the pending streams can be destroyed in different places, move the
|
|
|
d05f4b |
common code to separate function to avoid duplicating code and help with
|
|
|
d05f4b |
readability of the code.
|
|
|
d05f4b |
|
|
|
d05f4b |
Signed-off-by: Olivier Fourdan <ofourdan@redhat.com>
|
|
|
d05f4b |
Acked-by: Michel Dänzer <mdaenzer@redhat.com>
|
|
|
d05f4b |
(cherry picked from commit 823f3254fabd16e5e721da57cd260beac9b8f8bd)
|
|
|
d05f4b |
---
|
|
|
d05f4b |
hw/xwayland/xwayland-glamor-eglstream.c | 42 ++++++++++++++-----------
|
|
|
d05f4b |
1 file changed, 24 insertions(+), 18 deletions(-)
|
|
|
d05f4b |
|
|
|
d05f4b |
diff --git a/hw/xwayland/xwayland-glamor-eglstream.c b/hw/xwayland/xwayland-glamor-eglstream.c
|
|
|
d05f4b |
index 64fe93b7c..9abb7b779 100644
|
|
|
d05f4b |
--- a/hw/xwayland/xwayland-glamor-eglstream.c
|
|
|
d05f4b |
+++ b/hw/xwayland/xwayland-glamor-eglstream.c
|
|
|
d05f4b |
@@ -287,7 +287,7 @@ xwl_glamor_egl_device_has_egl_extensions(void *device,
|
|
|
d05f4b |
}
|
|
|
d05f4b |
|
|
|
d05f4b |
static void
|
|
|
d05f4b |
-xwl_eglstream_unref_pixmap_stream(struct xwl_pixmap *xwl_pixmap)
|
|
|
d05f4b |
+xwl_eglstream_destroy_pixmap_stream(struct xwl_pixmap *xwl_pixmap)
|
|
|
d05f4b |
{
|
|
|
d05f4b |
struct xwl_screen *xwl_screen = xwl_pixmap->xwl_screen;
|
|
|
d05f4b |
|
|
|
d05f4b |
@@ -319,7 +319,17 @@ xwl_eglstream_unref_pixmap_stream(struct xwl_pixmap *xwl_pixmap)
|
|
|
d05f4b |
}
|
|
|
d05f4b |
|
|
|
d05f4b |
static void
|
|
|
d05f4b |
-xwl_glamor_eglstream_del_pending_stream_cb(struct xwl_pixmap *xwl_pixmap)
|
|
|
d05f4b |
+xwl_glamor_eglstream_destroy_pending_stream(struct xwl_eglstream_pending_stream *pending)
|
|
|
d05f4b |
+{
|
|
|
d05f4b |
+ if (pending->cb)
|
|
|
d05f4b |
+ wl_callback_destroy(pending->cb);
|
|
|
d05f4b |
+ xwl_eglstream_window_set_pending(pending->window, NULL);
|
|
|
d05f4b |
+ xorg_list_del(&pending->link);
|
|
|
d05f4b |
+ free(pending);
|
|
|
d05f4b |
+}
|
|
|
d05f4b |
+
|
|
|
d05f4b |
+static void
|
|
|
d05f4b |
+xwl_glamor_eglstream_remove_pending_stream(struct xwl_pixmap *xwl_pixmap)
|
|
|
d05f4b |
{
|
|
|
d05f4b |
struct xwl_eglstream_private *xwl_eglstream =
|
|
|
d05f4b |
xwl_eglstream_get(xwl_pixmap->xwl_screen);
|
|
|
d05f4b |
@@ -328,10 +338,7 @@ xwl_glamor_eglstream_del_pending_stream_cb(struct xwl_pixmap *xwl_pixmap)
|
|
|
d05f4b |
xorg_list_for_each_entry(pending,
|
|
|
d05f4b |
&xwl_eglstream->pending_streams, link) {
|
|
|
d05f4b |
if (pending->xwl_pixmap == xwl_pixmap) {
|
|
|
d05f4b |
- wl_callback_destroy(pending->cb);
|
|
|
d05f4b |
- xwl_eglstream_window_set_pending(pending->window, NULL);
|
|
|
d05f4b |
- xorg_list_del(&pending->link);
|
|
|
d05f4b |
- free(pending);
|
|
|
d05f4b |
+ xwl_glamor_eglstream_destroy_pending_stream(pending);
|
|
|
d05f4b |
break;
|
|
|
d05f4b |
}
|
|
|
d05f4b |
}
|
|
|
d05f4b |
@@ -343,9 +350,9 @@ xwl_glamor_eglstream_destroy_pixmap(PixmapPtr pixmap)
|
|
|
d05f4b |
struct xwl_pixmap *xwl_pixmap = xwl_pixmap_get(pixmap);
|
|
|
d05f4b |
|
|
|
d05f4b |
if (xwl_pixmap && pixmap->refcnt == 1) {
|
|
|
d05f4b |
- xwl_glamor_eglstream_del_pending_stream_cb(xwl_pixmap);
|
|
|
d05f4b |
+ xwl_glamor_eglstream_remove_pending_stream(xwl_pixmap);
|
|
|
d05f4b |
+ xwl_eglstream_destroy_pixmap_stream(xwl_pixmap);
|
|
|
d05f4b |
xwl_pixmap_del_buffer_release_cb(pixmap);
|
|
|
d05f4b |
- xwl_eglstream_unref_pixmap_stream(xwl_pixmap);
|
|
|
d05f4b |
}
|
|
|
d05f4b |
return glamor_destroy_pixmap(pixmap);
|
|
|
d05f4b |
}
|
|
|
d05f4b |
@@ -432,8 +439,6 @@ xwl_eglstream_consumer_ready_callback(void *data,
|
|
|
d05f4b |
struct xwl_eglstream_pending_stream *pending;
|
|
|
d05f4b |
Bool found = FALSE;
|
|
|
d05f4b |
|
|
|
d05f4b |
- wl_callback_destroy(callback);
|
|
|
d05f4b |
-
|
|
|
d05f4b |
xorg_list_for_each_entry(pending, &xwl_eglstream->pending_streams, link) {
|
|
|
d05f4b |
if (pending->cb == callback) {
|
|
|
d05f4b |
found = TRUE;
|
|
|
d05f4b |
@@ -442,8 +447,11 @@ xwl_eglstream_consumer_ready_callback(void *data,
|
|
|
d05f4b |
}
|
|
|
d05f4b |
assert(found);
|
|
|
d05f4b |
|
|
|
d05f4b |
+ wl_callback_destroy(callback);
|
|
|
d05f4b |
+ pending->cb = NULL;
|
|
|
d05f4b |
+
|
|
|
d05f4b |
if (!pending->is_valid) {
|
|
|
d05f4b |
- xwl_eglstream_unref_pixmap_stream(pending->xwl_pixmap);
|
|
|
d05f4b |
+ xwl_eglstream_destroy_pixmap_stream(pending->xwl_pixmap);
|
|
|
d05f4b |
goto out;
|
|
|
d05f4b |
}
|
|
|
d05f4b |
|
|
|
d05f4b |
@@ -462,9 +470,7 @@ xwl_eglstream_consumer_ready_callback(void *data,
|
|
|
d05f4b |
pending->window->drawable.id, pending->pixmap);
|
|
|
d05f4b |
|
|
|
d05f4b |
out:
|
|
|
d05f4b |
- xwl_eglstream_window_set_pending(pending->window, NULL);
|
|
|
d05f4b |
- xorg_list_del(&pending->link);
|
|
|
d05f4b |
- free(pending);
|
|
|
d05f4b |
+ xwl_glamor_eglstream_destroy_pending_stream(pending);
|
|
|
d05f4b |
}
|
|
|
d05f4b |
|
|
|
d05f4b |
static const struct wl_callback_listener consumer_ready_listener = {
|
|
|
d05f4b |
@@ -514,8 +520,8 @@ static const struct wl_buffer_listener xwl_eglstream_buffer_release_listener = {
|
|
|
d05f4b |
};
|
|
|
d05f4b |
|
|
|
d05f4b |
static void
|
|
|
d05f4b |
-xwl_eglstream_create_pending_stream(struct xwl_screen *xwl_screen,
|
|
|
d05f4b |
- WindowPtr window, PixmapPtr pixmap)
|
|
|
d05f4b |
+xwl_eglstream_create_pixmap_and_stream(struct xwl_screen *xwl_screen,
|
|
|
d05f4b |
+ WindowPtr window, PixmapPtr pixmap)
|
|
|
d05f4b |
{
|
|
|
d05f4b |
struct xwl_eglstream_private *xwl_eglstream =
|
|
|
d05f4b |
xwl_eglstream_get(xwl_screen);
|
|
|
d05f4b |
@@ -599,8 +605,8 @@ xwl_glamor_eglstream_allow_commits(struct xwl_window *xwl_window)
|
|
|
d05f4b |
/* Glamor pixmap has no backing stream yet; begin making one and disallow
|
|
|
d05f4b |
* commits until then
|
|
|
d05f4b |
*/
|
|
|
d05f4b |
- xwl_eglstream_create_pending_stream(xwl_screen, xwl_window->window,
|
|
|
d05f4b |
- pixmap);
|
|
|
d05f4b |
+ xwl_eglstream_create_pixmap_and_stream(xwl_screen, xwl_window->window,
|
|
|
d05f4b |
+ pixmap);
|
|
|
d05f4b |
|
|
|
d05f4b |
return FALSE;
|
|
|
d05f4b |
}
|
|
|
d05f4b |
--
|
|
|
d05f4b |
2.31.1
|
|
|
d05f4b |
|