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: <https://gitlab.freedesktop.org/xorg/xserver/-/merge_requests/1314>
This commit is contained in:
Michel Dänzer 2024-02-19 16:39:13 +01:00 committed by Michel Dänzer
parent 913631071e
commit c1c5bf382e
6 changed files with 20 additions and 15 deletions

View File

@ -874,9 +874,10 @@ xwl_glamor_pixmap_get_wl_buffer(PixmapPtr pixmap)
Bool Bool
xwl_glamor_post_damage(struct xwl_window *xwl_window, xwl_glamor_post_damage(struct xwl_window *xwl_window,
PixmapPtr pixmap, RegionPtr region) PixmapPtr pixmap)
{ {
struct xwl_screen *xwl_screen = xwl_window->xwl_screen; 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) if (xwl_screen->egl_backend->post_damage)
return xwl_screen->egl_backend->post_damage(xwl_window, pixmap, region); return xwl_screen->egl_backend->post_damage(xwl_window, pixmap, region);

View File

@ -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, Bool xwl_glamor_has_wl_interfaces(struct xwl_screen *xwl_screen,
struct xwl_egl_backend *xwl_egl_backend); struct xwl_egl_backend *xwl_egl_backend);
Bool xwl_glamor_post_damage(struct xwl_window *xwl_window, 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); Bool xwl_glamor_allow_commits(struct xwl_window *xwl_window);
void xwl_glamor_egl_make_current(struct xwl_screen *xwl_screen); void xwl_glamor_egl_make_current(struct xwl_screen *xwl_screen);
Bool xwl_glamor_needs_buffer_flush(struct xwl_screen *xwl_screen); Bool xwl_glamor_needs_buffer_flush(struct xwl_screen *xwl_screen);

View File

@ -114,9 +114,9 @@ xwl_window_buffer_maybe_dispose(struct xwl_window_buffer *xwl_window_buffer)
} }
static void static void
xwl_window_buffer_add_damage_region(struct xwl_window *xwl_window, xwl_window_buffer_add_damage_region(struct xwl_window *xwl_window)
RegionPtr damage_region)
{ {
RegionPtr region = xwl_window_get_damage_region(xwl_window);
struct xwl_window_buffer *xwl_window_buffer; struct xwl_window_buffer *xwl_window_buffer;
/* Add damage region to all buffers */ /* Add damage region to all buffers */
@ -125,14 +125,14 @@ xwl_window_buffer_add_damage_region(struct xwl_window *xwl_window,
link_buffer) { link_buffer) {
RegionUnion(xwl_window_buffer->damage_region, RegionUnion(xwl_window_buffer->damage_region,
xwl_window_buffer->damage_region, xwl_window_buffer->damage_region,
damage_region); region);
} }
xorg_list_for_each_entry(xwl_window_buffer, xorg_list_for_each_entry(xwl_window_buffer,
&xwl_window->window_buffers_unavailable, &xwl_window->window_buffers_unavailable,
link_buffer) { link_buffer) {
RegionUnion(xwl_window_buffer->damage_region, RegionUnion(xwl_window_buffer->damage_region,
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 PixmapPtr
xwl_window_buffers_get_pixmap(struct xwl_window *xwl_window, xwl_window_buffers_get_pixmap(struct xwl_window *xwl_window)
RegionPtr damage_region)
{ {
struct xwl_screen *xwl_screen = xwl_window->xwl_screen; struct xwl_screen *xwl_screen = xwl_window->xwl_screen;
struct xwl_window_buffer *xwl_window_buffer; struct xwl_window_buffer *xwl_window_buffer;
@ -346,7 +345,7 @@ xwl_window_buffers_get_pixmap(struct xwl_window *xwl_window,
return window_pixmap; return window_pixmap;
#endif /* XWL_HAS_GLAMOR */ #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); xwl_window_buffer = xwl_window_buffer_get_available(xwl_window);
if (xwl_window_buffer) { if (xwl_window_buffer) {

View File

@ -30,12 +30,10 @@
#include <xwayland-config.h> #include <xwayland-config.h>
#include "xwayland-types.h" #include "xwayland-types.h"
#include "regionstr.h"
void xwl_window_buffers_init(struct xwl_window *xwl_window); void xwl_window_buffers_init(struct xwl_window *xwl_window);
void xwl_window_buffers_dispose(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); void xwl_window_recycle_pixmap(struct xwl_window *xwl_window);
PixmapPtr xwl_window_buffers_get_pixmap(struct xwl_window *xwl_window, PixmapPtr xwl_window_buffers_get_pixmap(struct xwl_window *xwl_window);
RegionPtr damage_region);
#endif /* XWAYLAND_WINDOW_BUFFERS_H */ #endif /* XWAYLAND_WINDOW_BUFFERS_H */

View File

@ -77,6 +77,12 @@ window_get_damage(WindowPtr window)
return dixLookupPrivate(&window->devPrivates, &xwl_damage_private_key); 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 * struct xwl_window *
xwl_window_from_window(WindowPtr window) xwl_window_from_window(WindowPtr window)
{ {
@ -1380,8 +1386,7 @@ xwl_window_attach_buffer(struct xwl_window *xwl_window)
PixmapPtr pixmap; PixmapPtr pixmap;
int i; int i;
region = DamageRegion(window_get_damage(xwl_window->window)); pixmap = xwl_window_buffers_get_pixmap(xwl_window);
pixmap = xwl_window_buffers_get_pixmap(xwl_window, region);
buffer = xwl_pixmap_get_wl_buffer(pixmap); buffer = xwl_pixmap_get_wl_buffer(pixmap);
if (!buffer) { if (!buffer) {
@ -1391,7 +1396,7 @@ xwl_window_attach_buffer(struct xwl_window *xwl_window)
#ifdef XWL_HAS_GLAMOR #ifdef XWL_HAS_GLAMOR
if (xwl_screen->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"); ErrorF("glamor: Failed to post damage\n");
return FALSE; 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 * connection. If we flood it too much anyway, this could
* abort in libwayland-client. * abort in libwayland-client.
*/ */
region = xwl_window_get_damage_region(xwl_window);
if (RegionNumRects(region) > 256) { if (RegionNumRects(region) > 256) {
box = RegionExtents(region); box = RegionExtents(region);
xwl_surface_damage(xwl_screen, xwl_window->surface, xwl_surface_damage(xwl_screen, xwl_window->surface,

View File

@ -123,6 +123,7 @@ struct xwl_window {
}; };
struct xwl_window *xwl_window_get(WindowPtr 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); struct xwl_window *xwl_window_from_window(WindowPtr window);
Bool is_surface_from_xwl_window(struct wl_surface *surface); Bool is_surface_from_xwl_window(struct wl_surface *surface);