surface-actor: Do not copy empty clip/unobscured regions

Clip and unobscured regions stricly shrink during culling. If they
are already empty, simply reference the empty region to reduce allocations.

https://gitlab.gnome.org/GNOME/mutter/merge_requests/1082
This commit is contained in:
Robert Mader 2020-02-25 19:59:22 +01:00 committed by Carlos Garnacho
parent 6831f2edb4
commit c979cd95aa

View File

@ -103,21 +103,28 @@ set_unobscured_region (MetaSurfaceActor *surface_actor,
g_clear_pointer (&priv->unobscured_region, cairo_region_destroy); g_clear_pointer (&priv->unobscured_region, cairo_region_destroy);
if (unobscured_region) if (unobscured_region)
{ {
cairo_rectangle_int_t bounds = { 0, }; if (cairo_region_is_empty (unobscured_region))
float width, height; {
priv->unobscured_region = cairo_region_reference (unobscured_region);
}
else
{
cairo_rectangle_int_t bounds = { 0, };
float width, height;
clutter_content_get_preferred_size (CLUTTER_CONTENT (priv->texture), clutter_content_get_preferred_size (CLUTTER_CONTENT (priv->texture),
&width, &width,
&height); &height);
bounds = (cairo_rectangle_int_t) { bounds = (cairo_rectangle_int_t) {
.width = width, .width = width,
.height = height, .height = height,
}; };
priv->unobscured_region = priv->unobscured_region =
get_scaled_region (surface_actor, unobscured_region); get_scaled_region (surface_actor, unobscured_region);
cairo_region_intersect_rectangle (priv->unobscured_region, &bounds); cairo_region_intersect_rectangle (priv->unobscured_region, &bounds);
}
} }
} }
@ -130,7 +137,12 @@ set_clip_region (MetaSurfaceActor *surface_actor,
g_clear_pointer (&priv->clip_region, cairo_region_destroy); g_clear_pointer (&priv->clip_region, cairo_region_destroy);
if (clip_region) if (clip_region)
priv->clip_region = get_scaled_region (surface_actor, clip_region); {
if (cairo_region_is_empty (clip_region))
priv->clip_region = cairo_region_reference (clip_region);
else
priv->clip_region = get_scaled_region (surface_actor, clip_region);
}
} }
static void static void