Port to MtkRegion
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3292>
This commit is contained in:

committed by
Marge Bot

parent
7c98910488
commit
655b4a9c75
@ -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
|
||||
|
Reference in New Issue
Block a user