Port to MtkRegion

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3292>
This commit is contained in:
Bilal Elmoussaoui
2023-09-04 16:30:38 +02:00
committed by Marge Bot
parent 7c98910488
commit 655b4a9c75
76 changed files with 928 additions and 1054 deletions

View File

@ -132,8 +132,8 @@ meta_stage_impl_resize (ClutterStageWindow *stage_window,
static void
paint_damage_region (ClutterStageWindow *stage_window,
ClutterStageView *view,
cairo_region_t *swap_region,
cairo_region_t *queued_redraw_clip)
MtkRegion *swap_region,
MtkRegion *queued_redraw_clip)
{
CoglFramebuffer *framebuffer = clutter_stage_view_get_framebuffer (view);
CoglContext *ctx = cogl_framebuffer_get_context (framebuffer);
@ -154,13 +154,13 @@ paint_damage_region (ClutterStageWindow *stage_window,
cogl_pipeline_set_color4ub (overlay_blue, 0x00, 0x00, 0x33, 0x33);
}
n_rects = cairo_region_num_rectangles (swap_region);
n_rects = mtk_region_num_rectangles (swap_region);
for (i = 0; i < n_rects; i++)
{
MtkRectangle rect;
float x_1, x_2, y_1, y_2;
cairo_region_get_rectangle (swap_region, i, &rect);
rect = mtk_region_get_rectangle (swap_region, i);
x_1 = rect.x;
x_2 = rect.x + rect.width;
y_1 = rect.y;
@ -180,13 +180,13 @@ paint_damage_region (ClutterStageWindow *stage_window,
cogl_pipeline_set_color4ub (overlay_red, 0x33, 0x00, 0x00, 0x33);
}
n_rects = cairo_region_num_rectangles (queued_redraw_clip);
n_rects = mtk_region_num_rectangles (queued_redraw_clip);
for (i = 0; i < n_rects; i++)
{
MtkRectangle rect;
float x_1, x_2, y_1, y_2;
cairo_region_get_rectangle (queued_redraw_clip, i, &rect);
rect = mtk_region_get_rectangle (queued_redraw_clip, i);
x_1 = rect.x;
x_2 = rect.x + rect.width;
y_1 = rect.y;
@ -202,7 +202,7 @@ paint_damage_region (ClutterStageWindow *stage_window,
static void
queue_damage_region (ClutterStageWindow *stage_window,
ClutterStageView *stage_view,
cairo_region_t *damage_region)
MtkRegion *damage_region)
{
int *damage, n_rects, i;
g_autofree int *freeme = NULL;
@ -211,7 +211,7 @@ queue_damage_region (ClutterStageWindow *stage_window,
int fb_width;
int fb_height;
if (cairo_region_is_empty (damage_region))
if (mtk_region_is_empty (damage_region))
return;
framebuffer = clutter_stage_view_get_onscreen (stage_view);
@ -222,7 +222,7 @@ queue_damage_region (ClutterStageWindow *stage_window,
fb_width = cogl_framebuffer_get_width (framebuffer);
fb_height = cogl_framebuffer_get_height (framebuffer);
n_rects = cairo_region_num_rectangles (damage_region);
n_rects = mtk_region_num_rectangles (damage_region);
if (n_rects < MAX_STACK_RECTS)
damage = g_newa (int, n_rects * 4);
@ -233,7 +233,7 @@ queue_damage_region (ClutterStageWindow *stage_window,
{
MtkRectangle rect;
cairo_region_get_rectangle (damage_region, i, &rect);
rect = mtk_region_get_rectangle (damage_region, i);
clutter_stage_view_transform_rect_to_onscreen (stage_view,
&rect,
@ -254,7 +254,7 @@ queue_damage_region (ClutterStageWindow *stage_window,
static void
swap_framebuffer (ClutterStageWindow *stage_window,
ClutterStageView *stage_view,
cairo_region_t *swap_region,
MtkRegion *swap_region,
gboolean swap_with_damage,
ClutterFrame *frame)
{
@ -273,13 +273,13 @@ swap_framebuffer (ClutterStageWindow *stage_window,
int *damage, n_rects, i;
CoglFrameInfo *frame_info;
n_rects = cairo_region_num_rectangles (swap_region);
n_rects = mtk_region_num_rectangles (swap_region);
damage = g_newa (int, n_rects * 4);
for (i = 0; i < n_rects; i++)
{
MtkRectangle rect;
cairo_region_get_rectangle (swap_region, i, &rect);
rect = mtk_region_get_rectangle (swap_region, i);
damage[i * 4] = rect.x;
damage[i * 4 + 1] = rect.y;
damage[i * 4 + 2] = rect.width;
@ -333,20 +333,20 @@ swap_framebuffer (ClutterStageWindow *stage_window,
}
}
static cairo_region_t *
offset_scale_and_clamp_region (const cairo_region_t *region,
int offset_x,
int offset_y,
float scale)
static MtkRegion *
offset_scale_and_clamp_region (const MtkRegion *region,
int offset_x,
int offset_y,
float scale)
{
int n_rects, i;
MtkRectangle *rects;
g_autofree MtkRectangle *freeme = NULL;
n_rects = cairo_region_num_rectangles (region);
n_rects = mtk_region_num_rectangles (region);
if (n_rects == 0)
return cairo_region_create ();
return mtk_region_create ();
if (n_rects < MAX_STACK_RECTS)
rects = g_newa (MtkRectangle, n_rects);
@ -358,7 +358,7 @@ offset_scale_and_clamp_region (const cairo_region_t *region,
MtkRectangle *rect = &rects[i];
graphene_rect_t tmp;
cairo_region_get_rectangle (region, i, rect);
*rect = mtk_region_get_rectangle (region, i);
tmp = mtk_rectangle_to_graphene_rect (rect);
graphene_rect_offset (&tmp, offset_x, offset_y);
@ -367,23 +367,23 @@ offset_scale_and_clamp_region (const cairo_region_t *region,
rect);
}
return cairo_region_create_rectangles (rects, n_rects);
return mtk_region_create_rectangles (rects, n_rects);
}
static cairo_region_t *
scale_offset_and_clamp_region (const cairo_region_t *region,
float scale,
int offset_x,
int offset_y)
static MtkRegion *
scale_offset_and_clamp_region (const MtkRegion *region,
float scale,
int offset_x,
int offset_y)
{
int n_rects, i;
MtkRectangle *rects;
g_autofree MtkRectangle *freeme = NULL;
n_rects = cairo_region_num_rectangles (region);
n_rects = mtk_region_num_rectangles (region);
if (n_rects == 0)
return cairo_region_create ();
return mtk_region_create ();
if (n_rects < MAX_STACK_RECTS)
rects = g_newa (MtkRectangle, n_rects);
@ -395,7 +395,7 @@ scale_offset_and_clamp_region (const cairo_region_t *region,
MtkRectangle *rect = &rects[i];
graphene_rect_t tmp;
cairo_region_get_rectangle (region, i, rect);
*rect = mtk_region_get_rectangle (region, i);
tmp = mtk_rectangle_to_graphene_rect (rect);
graphene_rect_scale (&tmp, scale, scale, &tmp);
@ -405,13 +405,13 @@ scale_offset_and_clamp_region (const cairo_region_t *region,
rect);
}
return cairo_region_create_rectangles (rects, n_rects);
return mtk_region_create_rectangles (rects, n_rects);
}
static void
paint_stage (MetaStageImpl *stage_impl,
ClutterStageView *stage_view,
cairo_region_t *redraw_clip,
MtkRegion *redraw_clip,
ClutterFrame *frame)
{
ClutterStage *stage = stage_impl->wrapper;
@ -422,31 +422,31 @@ paint_stage (MetaStageImpl *stage_impl,
clutter_stage_view_after_paint (stage_view, redraw_clip);
}
static cairo_region_t *
static MtkRegion *
transform_swap_region_to_onscreen (ClutterStageView *stage_view,
cairo_region_t *swap_region)
MtkRegion *swap_region)
{
CoglFramebuffer *onscreen = clutter_stage_view_get_onscreen (stage_view);
int n_rects, i;
MtkRectangle *rects;
cairo_region_t *transformed_region;
MtkRegion *transformed_region;
int width, height;
width = cogl_framebuffer_get_width (onscreen);
height = cogl_framebuffer_get_height (onscreen);
n_rects = cairo_region_num_rectangles (swap_region);
n_rects = mtk_region_num_rectangles (swap_region);
rects = g_newa (MtkRectangle, n_rects);
for (i = 0; i < n_rects; i++)
{
cairo_region_get_rectangle (swap_region, i, &rects[i]);
rects[i] = mtk_region_get_rectangle (swap_region, i);
clutter_stage_view_transform_rect_to_onscreen (stage_view,
&rects[i],
width,
height,
&rects[i]);
}
transformed_region = cairo_region_create_rectangles (rects, n_rects);
transformed_region = mtk_region_create_rectangles (rects, n_rects);
return transformed_region;
}
@ -506,10 +506,10 @@ meta_stage_impl_redraw_view_primary (MetaStageImpl *stage_impl,
gboolean buffer_has_valid_damage_history = FALSE;
gboolean has_buffer_age;
gboolean swap_with_damage;
cairo_region_t *redraw_clip;
cairo_region_t *queued_redraw_clip = NULL;
cairo_region_t *fb_clip_region;
cairo_region_t *swap_region;
g_autoptr (MtkRegion) redraw_clip = NULL;
g_autoptr (MtkRegion) queued_redraw_clip = NULL;
g_autoptr (MtkRegion) fb_clip_region = NULL;
g_autoptr (MtkRegion) swap_region = NULL;
ClutterDrawDebugFlag paint_debug_flags;
ClutterDamageHistory *damage_history;
float fb_scale;
@ -577,16 +577,16 @@ meta_stage_impl_redraw_view_primary (MetaStageImpl *stage_impl,
.width = fb_width,
.height = fb_height,
};
fb_clip_region = cairo_region_create_rectangle (&fb_rect);
fb_clip_region = mtk_region_create_rectangle (&fb_rect);
g_clear_pointer (&redraw_clip, cairo_region_destroy);
redraw_clip = cairo_region_create_rectangle (&view_rect);
g_clear_pointer (&redraw_clip, mtk_region_unref);
redraw_clip = mtk_region_create_rectangle (&view_rect);
if (G_UNLIKELY (paint_debug_flags & CLUTTER_DEBUG_PAINT_DAMAGE_REGION))
queued_redraw_clip = cairo_region_reference (redraw_clip);
queued_redraw_clip = mtk_region_ref (redraw_clip);
}
g_return_if_fail (!cairo_region_is_empty (fb_clip_region));
g_return_if_fail (!mtk_region_is_empty (fb_clip_region));
/* XXX: It seems there will be a race here in that the stage
* window may be resized before the cogl_onscreen_swap_region
@ -598,11 +598,11 @@ meta_stage_impl_redraw_view_primary (MetaStageImpl *stage_impl,
*/
/* swap_region does not need damage history, set it up before that */
if (!use_clipped_redraw)
swap_region = cairo_region_create ();
swap_region = mtk_region_create ();
else if (clutter_stage_view_has_shadowfb (stage_view))
swap_region = cairo_region_reference (fb_clip_region);
swap_region = mtk_region_ref (fb_clip_region);
else
swap_region = cairo_region_copy (fb_clip_region);
swap_region = mtk_region_copy (fb_clip_region);
swap_with_damage = FALSE;
if (has_buffer_age)
@ -615,17 +615,17 @@ meta_stage_impl_redraw_view_primary (MetaStageImpl *stage_impl,
for (age = 1; age <= buffer_age; age++)
{
const cairo_region_t *old_damage;
const MtkRegion *old_damage;
old_damage =
clutter_damage_history_lookup (damage_history, age);
cairo_region_union (fb_clip_region, old_damage);
mtk_region_union (fb_clip_region, old_damage);
}
meta_topic (META_DEBUG_BACKEND,
"Reusing back buffer(age=%d) - repairing region: num rects: %d",
buffer_age,
cairo_region_num_rectangles (fb_clip_region));
mtk_region_num_rectangles (fb_clip_region));
swap_with_damage = TRUE;
}
@ -643,7 +643,7 @@ meta_stage_impl_redraw_view_primary (MetaStageImpl *stage_impl,
* offset_scale_and_clamp_region. So we need to ensure redraw_clip
* is a superset of fb_clip_region to avoid such gaps.
*/
cairo_region_destroy (redraw_clip);
g_clear_pointer (&redraw_clip, mtk_region_unref);
redraw_clip = scale_offset_and_clamp_region (fb_clip_region,
1.0 / fb_scale,
view_rect.x,
@ -652,11 +652,10 @@ meta_stage_impl_redraw_view_primary (MetaStageImpl *stage_impl,
if (paint_debug_flags & CLUTTER_DEBUG_PAINT_DAMAGE_REGION)
{
cairo_region_t *debug_redraw_clip;
g_autoptr (MtkRegion) debug_redraw_clip = NULL;
debug_redraw_clip = cairo_region_create_rectangle (&view_rect);
debug_redraw_clip = mtk_region_create_rectangle (&view_rect);
paint_stage (stage_impl, stage_view, debug_redraw_clip, frame);
cairo_region_destroy (debug_redraw_clip);
}
else if (use_clipped_redraw)
{
@ -675,15 +674,15 @@ meta_stage_impl_redraw_view_primary (MetaStageImpl *stage_impl,
paint_stage (stage_impl, stage_view, redraw_clip, frame);
}
g_clear_pointer (&redraw_clip, cairo_region_destroy);
g_clear_pointer (&fb_clip_region, cairo_region_destroy);
g_clear_pointer (&redraw_clip, mtk_region_unref);
g_clear_pointer (&fb_clip_region, mtk_region_unref);
COGL_TRACE_BEGIN_SCOPED (MetaStageImplRedrawViewSwapFramebuffer,
"Paint (swap framebuffer)");
if (queued_redraw_clip)
{
cairo_region_t *swap_region_in_stage_space;
g_autoptr (MtkRegion) swap_region_in_stage_space = NULL;
swap_region_in_stage_space =
scale_offset_and_clamp_region (swap_region,
@ -691,25 +690,22 @@ meta_stage_impl_redraw_view_primary (MetaStageImpl *stage_impl,
view_rect.x,
view_rect.y);
cairo_region_subtract (swap_region_in_stage_space, queued_redraw_clip);
mtk_region_subtract (swap_region_in_stage_space, queued_redraw_clip);
paint_damage_region (stage_window, stage_view,
swap_region_in_stage_space, queued_redraw_clip);
cairo_region_destroy (queued_redraw_clip);
cairo_region_destroy (swap_region_in_stage_space);
}
if (clutter_stage_view_get_onscreen (stage_view) !=
clutter_stage_view_get_framebuffer (stage_view) &&
cairo_region_num_rectangles (swap_region) != 0)
mtk_region_num_rectangles (swap_region) != 0)
{
cairo_region_t *transformed_swap_region;
g_autoptr (MtkRegion) transformed_swap_region = NULL;
transformed_swap_region =
transform_swap_region_to_onscreen (stage_view, swap_region);
cairo_region_destroy (swap_region);
swap_region = transformed_swap_region;
g_clear_pointer (&swap_region, mtk_region_unref);
swap_region = g_steal_pointer (&transformed_swap_region);
}
swap_framebuffer (stage_window,
@ -717,8 +713,6 @@ meta_stage_impl_redraw_view_primary (MetaStageImpl *stage_impl,
swap_region,
swap_with_damage,
frame);
cairo_region_destroy (swap_region);
}
static gboolean