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:
parent
243140069c
commit
0ed160bc5a
@ -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);
|
||||
|
||||
|
@ -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] =
|
||||
|
@ -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);
|
||||
|
@ -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,
|
||||
|
@ -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);
|
||||
|
@ -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]);
|
||||
|
@ -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,
|
||||
|
Loading…
x
Reference in New Issue
Block a user