From c1c5bf382e497eb3641354e54384731c1d7198b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michel=20D=C3=A4nzer?= Date: Mon, 19 Feb 2024 16:39:13 +0100 Subject: [PATCH] xwayland: Do not plumb damage region through function parameters Each function can get the damage region from the xwl_window instead. Add xwl_window_get_damage_region helper for this. v2: * Use xwl_window_get_damage_region in xwl_window_attach_buffer as well (Olivier Fourdan) Part-of: --- hw/xwayland/xwayland-glamor.c | 3 ++- hw/xwayland/xwayland-glamor.h | 2 +- hw/xwayland/xwayland-window-buffers.c | 13 ++++++------- hw/xwayland/xwayland-window-buffers.h | 4 +--- hw/xwayland/xwayland-window.c | 12 +++++++++--- hw/xwayland/xwayland-window.h | 1 + 6 files changed, 20 insertions(+), 15 deletions(-) diff --git a/hw/xwayland/xwayland-glamor.c b/hw/xwayland/xwayland-glamor.c index 28a8e7bc9..657578a8f 100644 --- a/hw/xwayland/xwayland-glamor.c +++ b/hw/xwayland/xwayland-glamor.c @@ -874,9 +874,10 @@ xwl_glamor_pixmap_get_wl_buffer(PixmapPtr pixmap) Bool xwl_glamor_post_damage(struct xwl_window *xwl_window, - PixmapPtr pixmap, RegionPtr region) + PixmapPtr pixmap) { struct xwl_screen *xwl_screen = xwl_window->xwl_screen; + RegionPtr region = xwl_window_get_damage_region(xwl_window); if (xwl_screen->egl_backend->post_damage) return xwl_screen->egl_backend->post_damage(xwl_window, pixmap, region); diff --git a/hw/xwayland/xwayland-glamor.h b/hw/xwayland/xwayland-glamor.h index 97e8fb664..5513230ff 100644 --- a/hw/xwayland/xwayland-glamor.h +++ b/hw/xwayland/xwayland-glamor.h @@ -137,7 +137,7 @@ void xwl_glamor_init_wl_registry(struct xwl_screen *xwl_screen, Bool xwl_glamor_has_wl_interfaces(struct xwl_screen *xwl_screen, struct xwl_egl_backend *xwl_egl_backend); Bool xwl_glamor_post_damage(struct xwl_window *xwl_window, - PixmapPtr pixmap, RegionPtr region); + PixmapPtr pixmap); Bool xwl_glamor_allow_commits(struct xwl_window *xwl_window); void xwl_glamor_egl_make_current(struct xwl_screen *xwl_screen); Bool xwl_glamor_needs_buffer_flush(struct xwl_screen *xwl_screen); diff --git a/hw/xwayland/xwayland-window-buffers.c b/hw/xwayland/xwayland-window-buffers.c index 40e19e349..8751de918 100644 --- a/hw/xwayland/xwayland-window-buffers.c +++ b/hw/xwayland/xwayland-window-buffers.c @@ -114,9 +114,9 @@ xwl_window_buffer_maybe_dispose(struct xwl_window_buffer *xwl_window_buffer) } static void -xwl_window_buffer_add_damage_region(struct xwl_window *xwl_window, - RegionPtr damage_region) +xwl_window_buffer_add_damage_region(struct xwl_window *xwl_window) { + RegionPtr region = xwl_window_get_damage_region(xwl_window); struct xwl_window_buffer *xwl_window_buffer; /* Add damage region to all buffers */ @@ -125,14 +125,14 @@ xwl_window_buffer_add_damage_region(struct xwl_window *xwl_window, link_buffer) { RegionUnion(xwl_window_buffer->damage_region, xwl_window_buffer->damage_region, - damage_region); + region); } xorg_list_for_each_entry(xwl_window_buffer, &xwl_window->window_buffers_unavailable, link_buffer) { RegionUnion(xwl_window_buffer->damage_region, xwl_window_buffer->damage_region, - damage_region); + region); } } @@ -332,8 +332,7 @@ xwl_window_recycle_pixmap(struct xwl_window *xwl_window) } PixmapPtr -xwl_window_buffers_get_pixmap(struct xwl_window *xwl_window, - RegionPtr damage_region) +xwl_window_buffers_get_pixmap(struct xwl_window *xwl_window) { struct xwl_screen *xwl_screen = xwl_window->xwl_screen; struct xwl_window_buffer *xwl_window_buffer; @@ -346,7 +345,7 @@ xwl_window_buffers_get_pixmap(struct xwl_window *xwl_window, return window_pixmap; #endif /* XWL_HAS_GLAMOR */ - xwl_window_buffer_add_damage_region(xwl_window, damage_region); + xwl_window_buffer_add_damage_region(xwl_window); xwl_window_buffer = xwl_window_buffer_get_available(xwl_window); if (xwl_window_buffer) { diff --git a/hw/xwayland/xwayland-window-buffers.h b/hw/xwayland/xwayland-window-buffers.h index c795564bd..a2ff5fdb1 100644 --- a/hw/xwayland/xwayland-window-buffers.h +++ b/hw/xwayland/xwayland-window-buffers.h @@ -30,12 +30,10 @@ #include #include "xwayland-types.h" -#include "regionstr.h" void xwl_window_buffers_init(struct xwl_window *xwl_window); void xwl_window_buffers_dispose(struct xwl_window *xwl_window); void xwl_window_recycle_pixmap(struct xwl_window *xwl_window); -PixmapPtr xwl_window_buffers_get_pixmap(struct xwl_window *xwl_window, - RegionPtr damage_region); +PixmapPtr xwl_window_buffers_get_pixmap(struct xwl_window *xwl_window); #endif /* XWAYLAND_WINDOW_BUFFERS_H */ diff --git a/hw/xwayland/xwayland-window.c b/hw/xwayland/xwayland-window.c index d2434de8f..da614f57f 100644 --- a/hw/xwayland/xwayland-window.c +++ b/hw/xwayland/xwayland-window.c @@ -77,6 +77,12 @@ window_get_damage(WindowPtr window) return dixLookupPrivate(&window->devPrivates, &xwl_damage_private_key); } +RegionPtr +xwl_window_get_damage_region(struct xwl_window *xwl_window) +{ + return DamageRegion(window_get_damage(xwl_window->window)); +} + struct xwl_window * xwl_window_from_window(WindowPtr window) { @@ -1380,8 +1386,7 @@ xwl_window_attach_buffer(struct xwl_window *xwl_window) PixmapPtr pixmap; int i; - region = DamageRegion(window_get_damage(xwl_window->window)); - pixmap = xwl_window_buffers_get_pixmap(xwl_window, region); + pixmap = xwl_window_buffers_get_pixmap(xwl_window); buffer = xwl_pixmap_get_wl_buffer(pixmap); if (!buffer) { @@ -1391,7 +1396,7 @@ xwl_window_attach_buffer(struct xwl_window *xwl_window) #ifdef XWL_HAS_GLAMOR if (xwl_screen->glamor) { - if (!xwl_glamor_post_damage(xwl_window, pixmap, region)) { + if (!xwl_glamor_post_damage(xwl_window, pixmap)) { ErrorF("glamor: Failed to post damage\n"); return FALSE; } @@ -1404,6 +1409,7 @@ xwl_window_attach_buffer(struct xwl_window *xwl_window) * connection. If we flood it too much anyway, this could * abort in libwayland-client. */ + region = xwl_window_get_damage_region(xwl_window); if (RegionNumRects(region) > 256) { box = RegionExtents(region); xwl_surface_damage(xwl_screen, xwl_window->surface, diff --git a/hw/xwayland/xwayland-window.h b/hw/xwayland/xwayland-window.h index 3370c45aa..827a0fd53 100644 --- a/hw/xwayland/xwayland-window.h +++ b/hw/xwayland/xwayland-window.h @@ -123,6 +123,7 @@ struct xwl_window { }; struct xwl_window *xwl_window_get(WindowPtr window); +RegionPtr xwl_window_get_damage_region(struct xwl_window *xwl_window); struct xwl_window *xwl_window_from_window(WindowPtr window); Bool is_surface_from_xwl_window(struct wl_surface *surface);