From 7b2ae2ba77de69d38d4ff54973d012d6b904d15d Mon Sep 17 00:00:00 2001 From: Derek Foreman Date: Wed, 21 Jun 2023 16:03:35 -0500 Subject: [PATCH] libweston: Add visible region to weston_view Later, we'll want to use the visible region for damage tracking in paint_nodes. For now, we can use it in the renderers where they've been calculating it independently to draw paint nodes. We still can't remove view->clip entirely, because weston_view_damage_below() may be called before the first render of a view, when its visible region hasn't been calculated yet. The clip is empty at that point, which allows weston_view_damage_below() to "work". Signed-off-by: Derek Foreman --- include/libweston/libweston.h | 1 + libweston/compositor.c | 4 ++++ libweston/pixman-renderer.c | 3 +-- libweston/renderer-gl/gl-renderer.c | 4 +--- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/include/libweston/libweston.h b/include/libweston/libweston.h index 150c9001..97faa212 100644 --- a/include/libweston/libweston.h +++ b/include/libweston/libweston.h @@ -1657,6 +1657,7 @@ struct weston_view { unsigned int click_to_activate_serial; pixman_region32_t clip; /* See weston_view_damage_below() */ + pixman_region32_t visible; /* Unoccluded region in global space */ float alpha; /* part of geometry, see below */ /* Surface geometry state, mutable. diff --git a/libweston/compositor.c b/libweston/compositor.c index 111ffff9..f2f5c099 100644 --- a/libweston/compositor.c +++ b/libweston/compositor.c @@ -484,6 +484,7 @@ weston_view_create_internal(struct weston_surface *surface) wl_list_init(&view->paint_node_list); pixman_region32_init(&view->clip); + pixman_region32_init(&view->visible); view->alpha = 1.0; pixman_region32_init(&view->transform.opaque); @@ -2283,6 +2284,7 @@ weston_view_destroy(struct weston_view *view) weston_layer_entry_remove(&view->layer_link); pixman_region32_fini(&view->clip); + pixman_region32_fini(&view->visible); pixman_region32_fini(&view->geometry.scissor); pixman_region32_fini(&view->transform.boundingbox); pixman_region32_fini(&view->transform.opaque); @@ -2931,6 +2933,8 @@ view_accumulate_damage(struct weston_view *view, pixman_region32_union(&view->plane->damage, &view->plane->damage, &damage); pixman_region32_fini(&damage); + pixman_region32_subtract(&view->visible, &view->transform.boundingbox, + opaque); pixman_region32_copy(&view->clip, opaque); pixman_region32_union(opaque, opaque, &view->transform.opaque); } diff --git a/libweston/pixman-renderer.c b/libweston/pixman-renderer.c index 18874591..763ca30a 100644 --- a/libweston/pixman-renderer.c +++ b/libweston/pixman-renderer.c @@ -514,8 +514,7 @@ draw_paint_node(struct weston_paint_node *pnode, pixman_region32_init(&repaint); pixman_region32_intersect(&repaint, - &pnode->view->transform.boundingbox, damage); - pixman_region32_subtract(&repaint, &repaint, &pnode->view->clip); + &pnode->view->visible, damage); if (!pixman_region32_not_empty(&repaint)) goto out; diff --git a/libweston/renderer-gl/gl-renderer.c b/libweston/renderer-gl/gl-renderer.c index 35a878ea..6ed9e4ee 100644 --- a/libweston/renderer-gl/gl-renderer.c +++ b/libweston/renderer-gl/gl-renderer.c @@ -1257,9 +1257,7 @@ draw_paint_node(struct weston_paint_node *pnode, return; pixman_region32_init(&repaint); - pixman_region32_intersect(&repaint, - &pnode->view->transform.boundingbox, damage); - pixman_region32_subtract(&repaint, &repaint, &pnode->view->clip); + pixman_region32_intersect(&repaint, &pnode->view->visible, damage); if (!pixman_region32_not_empty(&repaint)) goto out;