stage-view: Move transform from MetaRenderereView to ClutterStageView

This is possible because MonitorTransform is a Mtk type now. It will
allow us to create the offscreens in ClutterStageView.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3930>
This commit is contained in:
Sebastian Wick 2024-08-07 22:49:10 +02:00 committed by Marge Bot
parent 243140069c
commit 0ed160bc5a
7 changed files with 91 additions and 167 deletions

View File

@ -63,13 +63,6 @@ void clutter_stage_view_accumulate_redraw_clip (ClutterStageView *view);
CLUTTER_EXPORT
CoglScanout * clutter_stage_view_take_scanout (ClutterStageView *view);
CLUTTER_EXPORT
void clutter_stage_view_transform_rect_to_onscreen (ClutterStageView *view,
const MtkRectangle *src_rect,
int dst_width,
int dst_height,
MtkRectangle *dst_rect);
CLUTTER_EXPORT
void clutter_stage_view_schedule_update (ClutterStageView *view);

View File

@ -47,6 +47,7 @@ enum
PROP_SCALE,
PROP_REFRESH_RATE,
PROP_VBLANK_DURATION_US,
PROP_TRANSFORM,
PROP_LAST
};
@ -69,6 +70,7 @@ typedef struct _ClutterStageViewPrivate
MtkRectangle layout;
float scale;
MtkMonitorTransform transform;
CoglFramebuffer *framebuffer;
ClutterColorState *color_state;
ClutterColorState *output_color_state;
@ -183,13 +185,26 @@ clutter_stage_view_create_offscreen_pipeline (CoglOffscreen *offscreen)
return pipeline;
}
static void
setup_offscreen_transform (ClutterStageView *view,
CoglPipeline *pipeline)
{
ClutterStageViewPrivate *priv =
clutter_stage_view_get_instance_private (view);
graphene_matrix_t matrix;
if (priv->transform == MTK_MONITOR_TRANSFORM_NORMAL)
return;
clutter_stage_view_get_offscreen_transformation_matrix (view, &matrix);
cogl_pipeline_set_layer_matrix (pipeline, 0, &matrix);
}
static void
clutter_stage_view_ensure_offscreen_blit_pipeline (ClutterStageView *view)
{
ClutterStageViewPrivate *priv =
clutter_stage_view_get_instance_private (view);
ClutterStageViewClass *view_class =
CLUTTER_STAGE_VIEW_GET_CLASS (view);
g_assert (priv->offscreen != NULL);
@ -199,8 +214,7 @@ clutter_stage_view_ensure_offscreen_blit_pipeline (ClutterStageView *view)
priv->offscreen_pipeline =
clutter_stage_view_create_offscreen_pipeline (priv->offscreen);
if (view_class->setup_offscreen_transform)
view_class->setup_offscreen_transform (view, priv->offscreen_pipeline);
setup_offscreen_transform (view, priv->offscreen_pipeline);
clutter_color_state_add_pipeline_transform (priv->color_state,
priv->output_color_state,
@ -216,22 +230,6 @@ clutter_stage_view_invalidate_offscreen_blit_pipeline (ClutterStageView *view)
g_clear_object (&priv->offscreen_pipeline);
}
void
clutter_stage_view_transform_rect_to_onscreen (ClutterStageView *view,
const MtkRectangle *src_rect,
int dst_width,
int dst_height,
MtkRectangle *dst_rect)
{
ClutterStageViewClass *view_class = CLUTTER_STAGE_VIEW_GET_CLASS (view);
view_class->transform_rect_to_onscreen (view,
src_rect,
dst_width,
dst_height,
dst_rect);
}
static void
paint_transformed_framebuffer (ClutterStageView *view,
CoglPipeline *pipeline,
@ -239,6 +237,8 @@ paint_transformed_framebuffer (ClutterStageView *view,
CoglFramebuffer *dst_framebuffer,
const MtkRegion *redraw_clip)
{
ClutterStageViewPrivate *priv =
clutter_stage_view_get_instance_private (view);
graphene_matrix_t matrix;
unsigned int n_rectangles, i;
int dst_width, dst_height;
@ -250,9 +250,10 @@ paint_transformed_framebuffer (ClutterStageView *view,
dst_width = cogl_framebuffer_get_width (dst_framebuffer);
dst_height = cogl_framebuffer_get_height (dst_framebuffer);
clutter_stage_view_get_layout (view, &view_layout);
clutter_stage_view_transform_rect_to_onscreen (view,
&MTK_RECTANGLE_INIT (0, 0,
mtk_rectangle_transform (&MTK_RECTANGLE_INIT (0, 0,
view_layout.width, view_layout.height),
priv->transform,
view_layout.width,
view_layout.height,
&onscreen_layout);
@ -284,8 +285,8 @@ paint_transformed_framebuffer (ClutterStageView *view,
src_rect.x -= view_layout.x;
src_rect.y -= view_layout.y;
clutter_stage_view_transform_rect_to_onscreen (view,
&src_rect,
mtk_rectangle_transform (&src_rect,
priv->transform,
onscreen_layout.width,
onscreen_layout.height,
&dst_rect);
@ -593,9 +594,13 @@ void
clutter_stage_view_get_offscreen_transformation_matrix (ClutterStageView *view,
graphene_matrix_t *matrix)
{
ClutterStageViewClass *view_class = CLUTTER_STAGE_VIEW_GET_CLASS (view);
ClutterStageViewPrivate *priv =
clutter_stage_view_get_instance_private (view);
view_class->get_offscreen_transformation_matrix (view, matrix);
graphene_matrix_init_identity (matrix);
mtk_monitor_transform_transform_matrix (
mtk_monitor_transform_invert (priv->transform), matrix);
}
static void
@ -708,13 +713,6 @@ clutter_stage_view_accumulate_redraw_clip (ClutterStageView *view)
priv->has_redraw_clip = FALSE;
}
static void
clutter_stage_default_get_offscreen_transformation_matrix (ClutterStageView *view,
graphene_matrix_t *matrix)
{
graphene_matrix_init_identity (matrix);
}
void
clutter_stage_view_assign_next_scanout (ClutterStageView *view,
CoglScanout *scanout)
@ -1017,6 +1015,30 @@ clutter_stage_view_set_color_state (ClutterStageView *view,
clutter_stage_view_invalidate_offscreen_blit_pipeline (view);
}
static void
clutter_stage_view_set_transform (ClutterStageView *view,
MtkMonitorTransform transform)
{
ClutterStageViewPrivate *priv =
clutter_stage_view_get_instance_private (view);
if (priv->transform == transform)
return;
priv->transform = transform;
clutter_stage_view_invalidate_offscreen_blit_pipeline (CLUTTER_STAGE_VIEW (view));
}
MtkMonitorTransform
clutter_stage_view_get_transform (ClutterStageView *view)
{
ClutterStageViewPrivate *priv =
clutter_stage_view_get_instance_private (view);
return priv->transform;
}
static void
clutter_stage_view_get_property (GObject *object,
guint prop_id,
@ -1062,6 +1084,9 @@ clutter_stage_view_get_property (GObject *object,
case PROP_VBLANK_DURATION_US:
g_value_set_int64 (value, priv->vblank_duration_us);
break;
case PROP_TRANSFORM:
g_value_set_uint (value, priv->transform);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
}
@ -1113,6 +1138,9 @@ clutter_stage_view_set_property (GObject *object,
case PROP_VBLANK_DURATION_US:
priv->vblank_duration_us = g_value_get_int64 (value);
break;
case PROP_TRANSFORM:
clutter_stage_view_set_transform (view, g_value_get_uint (value));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
}
@ -1202,9 +1230,6 @@ clutter_stage_view_class_init (ClutterStageViewClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
klass->get_offscreen_transformation_matrix =
clutter_stage_default_get_offscreen_transformation_matrix;
object_class->get_property = clutter_stage_view_get_property;
object_class->set_property = clutter_stage_view_set_property;
object_class->constructed = clutter_stage_view_constructed;
@ -1288,6 +1313,15 @@ clutter_stage_view_class_init (ClutterStageViewClass *klass)
G_PARAM_CONSTRUCT_ONLY |
G_PARAM_STATIC_STRINGS);
obj_props[PROP_TRANSFORM] =
g_param_spec_uint ("transform", NULL, NULL,
MTK_MONITOR_TRANSFORM_NORMAL,
MTK_MONITOR_TRANSFORM_FLIPPED_270,
MTK_MONITOR_TRANSFORM_NORMAL,
G_PARAM_READWRITE |
G_PARAM_CONSTRUCT_ONLY |
G_PARAM_STATIC_STRINGS);
g_object_class_install_properties (object_class, PROP_LAST, obj_props);
stage_view_signals[DESTROY] =

View File

@ -39,18 +39,6 @@ struct _ClutterStageViewClass
{
GObjectClass parent_class;
void (* setup_offscreen_transform) (ClutterStageView *view,
CoglPipeline *pipeline);
void (* get_offscreen_transformation_matrix) (ClutterStageView *view,
graphene_matrix_t *matrix);
void (* transform_rect_to_onscreen) (ClutterStageView *view,
const MtkRectangle *src_rect,
int dst_width,
int dst_height,
MtkRectangle *dst_rect);
ClutterFrame * (* new_frame) (ClutterStageView *view);
ClutterPaintFlag (* get_default_paint_flags) (ClutterStageView *view);
@ -100,3 +88,6 @@ ClutterColorState * clutter_stage_view_get_color_state (ClutterStageView *view);
CLUTTER_EXPORT
ClutterColorState * clutter_stage_view_get_output_color_state (ClutterStageView *view);
CLUTTER_EXPORT
MtkMonitorTransform clutter_stage_view_get_transform (ClutterStageView *view);

View File

@ -41,7 +41,6 @@ enum
{
PROP_0,
PROP_TRANSFORM,
PROP_CRTC,
PROP_LAST
@ -51,22 +50,12 @@ static GParamSpec *obj_props[PROP_LAST];
typedef struct _MetaRendererViewPrivate
{
MtkMonitorTransform transform;
MetaCrtc *crtc;
} MetaRendererViewPrivate;
G_DEFINE_TYPE_WITH_PRIVATE (MetaRendererView, meta_renderer_view,
META_TYPE_STAGE_VIEW)
MtkMonitorTransform
meta_renderer_view_get_transform (MetaRendererView *view)
{
MetaRendererViewPrivate *priv =
meta_renderer_view_get_instance_private (view);
return priv->transform;
}
MetaCrtc *
meta_renderer_view_get_crtc (MetaRendererView *view)
{
@ -76,62 +65,6 @@ meta_renderer_view_get_crtc (MetaRendererView *view)
return priv->crtc;
}
static void
meta_renderer_view_get_offscreen_transformation_matrix (ClutterStageView *view,
graphene_matrix_t *matrix)
{
MetaRendererView *renderer_view = META_RENDERER_VIEW (view);
MetaRendererViewPrivate *priv =
meta_renderer_view_get_instance_private (renderer_view);
graphene_matrix_init_identity (matrix);
mtk_monitor_transform_transform_matrix (
mtk_monitor_transform_invert (priv->transform), matrix);
}
static void
meta_renderer_view_setup_offscreen_transform (ClutterStageView *view,
CoglPipeline *pipeline)
{
graphene_matrix_t matrix;
meta_renderer_view_get_offscreen_transformation_matrix (view, &matrix);
cogl_pipeline_set_layer_matrix (pipeline, 0, &matrix);
}
static void
meta_renderer_view_transform_rect_to_onscreen (ClutterStageView *view,
const MtkRectangle *src_rect,
int dst_width,
int dst_height,
MtkRectangle *dst_rect)
{
MetaRendererView *renderer_view = META_RENDERER_VIEW (view);
MetaRendererViewPrivate *priv =
meta_renderer_view_get_instance_private (renderer_view);
mtk_rectangle_transform (src_rect,
priv->transform,
dst_width,
dst_height,
dst_rect);
}
static void
meta_renderer_view_set_transform (MetaRendererView *view,
MtkMonitorTransform transform)
{
MetaRendererViewPrivate *priv =
meta_renderer_view_get_instance_private (view);
if (priv->transform == transform)
return;
priv->transform = transform;
clutter_stage_view_invalidate_offscreen_blit_pipeline (CLUTTER_STAGE_VIEW (view));
}
static void
meta_renderer_view_get_property (GObject *object,
guint prop_id,
@ -144,9 +77,6 @@ meta_renderer_view_get_property (GObject *object,
switch (prop_id)
{
case PROP_TRANSFORM:
g_value_set_uint (value, priv->transform);
break;
case PROP_CRTC:
g_value_set_object (value, priv->crtc);
break;
@ -168,9 +98,6 @@ meta_renderer_view_set_property (GObject *object,
switch (prop_id)
{
case PROP_TRANSFORM:
meta_renderer_view_set_transform (view, g_value_get_uint (value));
break;
case PROP_CRTC:
priv->crtc = g_value_get_object (value);
break;
@ -189,27 +116,10 @@ static void
meta_renderer_view_class_init (MetaRendererViewClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
ClutterStageViewClass *view_class = CLUTTER_STAGE_VIEW_CLASS (klass);
view_class->setup_offscreen_transform =
meta_renderer_view_setup_offscreen_transform;
view_class->get_offscreen_transformation_matrix =
meta_renderer_view_get_offscreen_transformation_matrix;
view_class->transform_rect_to_onscreen =
meta_renderer_view_transform_rect_to_onscreen;
object_class->get_property = meta_renderer_view_get_property;
object_class->set_property = meta_renderer_view_set_property;
obj_props[PROP_TRANSFORM] =
g_param_spec_uint ("transform", NULL, NULL,
MTK_MONITOR_TRANSFORM_NORMAL,
MTK_MONITOR_TRANSFORM_FLIPPED_270,
MTK_MONITOR_TRANSFORM_NORMAL,
G_PARAM_READWRITE |
G_PARAM_CONSTRUCT_ONLY |
G_PARAM_STATIC_STRINGS);
obj_props[PROP_CRTC] =
g_param_spec_object ("crtc", NULL, NULL,
META_TYPE_CRTC,

View File

@ -32,7 +32,5 @@ struct _MetaRendererViewClass
MetaStageViewClass parent_class;
};
MtkMonitorTransform meta_renderer_view_get_transform (MetaRendererView *view);
META_EXPORT_TEST
MetaCrtc *meta_renderer_view_get_crtc (MetaRendererView *view);

View File

@ -243,8 +243,8 @@ queue_damage_region (ClutterStageWindow *stage_window,
rect = mtk_region_get_rectangle (damage_region, i);
clutter_stage_view_transform_rect_to_onscreen (stage_view,
&rect,
mtk_rectangle_transform (&rect,
clutter_stage_view_get_transform (stage_view),
fb_width,
fb_height,
&rect);
@ -450,8 +450,8 @@ transform_swap_region_to_onscreen (ClutterStageView *stage_view,
for (i = 0; i < n_rects; i++)
{
rects[i] = mtk_region_get_rectangle (swap_region, i);
clutter_stage_view_transform_rect_to_onscreen (stage_view,
&rects[i],
mtk_rectangle_transform (&rects[i],
clutter_stage_view_get_transform (stage_view),
width,
height,
&rects[i]);

View File

@ -2311,7 +2311,6 @@ meta_wayland_surface_try_acquire_scanout (MetaWaylandSurface *surface,
CoglOnscreen *onscreen,
ClutterStageView *stage_view)
{
MetaRendererView *renderer_view;
MetaSurfaceActor *surface_actor;
MtkMonitorTransform view_transform;
ClutterActorBox actor_box;
@ -2330,8 +2329,7 @@ meta_wayland_surface_try_acquire_scanout (MetaWaylandSurface *surface,
if (surface->buffer->use_count == 0)
return NULL;
renderer_view = META_RENDERER_VIEW (stage_view);
view_transform = meta_renderer_view_get_transform (renderer_view);
view_transform = clutter_stage_view_get_transform (stage_view);
if (view_transform != surface->buffer_transform)
{
meta_topic (META_DEBUG_RENDER,