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 CLUTTER_EXPORT
CoglScanout * clutter_stage_view_take_scanout (ClutterStageView *view); 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 CLUTTER_EXPORT
void clutter_stage_view_schedule_update (ClutterStageView *view); void clutter_stage_view_schedule_update (ClutterStageView *view);

View File

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

View File

@ -39,18 +39,6 @@ struct _ClutterStageViewClass
{ {
GObjectClass parent_class; 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); ClutterFrame * (* new_frame) (ClutterStageView *view);
ClutterPaintFlag (* get_default_paint_flags) (ClutterStageView *view); ClutterPaintFlag (* get_default_paint_flags) (ClutterStageView *view);
@ -100,3 +88,6 @@ ClutterColorState * clutter_stage_view_get_color_state (ClutterStageView *view);
CLUTTER_EXPORT CLUTTER_EXPORT
ClutterColorState * clutter_stage_view_get_output_color_state (ClutterStageView *view); 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_0,
PROP_TRANSFORM,
PROP_CRTC, PROP_CRTC,
PROP_LAST PROP_LAST
@ -51,22 +50,12 @@ static GParamSpec *obj_props[PROP_LAST];
typedef struct _MetaRendererViewPrivate typedef struct _MetaRendererViewPrivate
{ {
MtkMonitorTransform transform;
MetaCrtc *crtc; MetaCrtc *crtc;
} MetaRendererViewPrivate; } MetaRendererViewPrivate;
G_DEFINE_TYPE_WITH_PRIVATE (MetaRendererView, meta_renderer_view, G_DEFINE_TYPE_WITH_PRIVATE (MetaRendererView, meta_renderer_view,
META_TYPE_STAGE_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 * MetaCrtc *
meta_renderer_view_get_crtc (MetaRendererView *view) meta_renderer_view_get_crtc (MetaRendererView *view)
{ {
@ -76,62 +65,6 @@ meta_renderer_view_get_crtc (MetaRendererView *view)
return priv->crtc; 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 static void
meta_renderer_view_get_property (GObject *object, meta_renderer_view_get_property (GObject *object,
guint prop_id, guint prop_id,
@ -144,9 +77,6 @@ meta_renderer_view_get_property (GObject *object,
switch (prop_id) switch (prop_id)
{ {
case PROP_TRANSFORM:
g_value_set_uint (value, priv->transform);
break;
case PROP_CRTC: case PROP_CRTC:
g_value_set_object (value, priv->crtc); g_value_set_object (value, priv->crtc);
break; break;
@ -168,9 +98,6 @@ meta_renderer_view_set_property (GObject *object,
switch (prop_id) switch (prop_id)
{ {
case PROP_TRANSFORM:
meta_renderer_view_set_transform (view, g_value_get_uint (value));
break;
case PROP_CRTC: case PROP_CRTC:
priv->crtc = g_value_get_object (value); priv->crtc = g_value_get_object (value);
break; break;
@ -189,27 +116,10 @@ static void
meta_renderer_view_class_init (MetaRendererViewClass *klass) meta_renderer_view_class_init (MetaRendererViewClass *klass)
{ {
GObjectClass *object_class = G_OBJECT_CLASS (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->get_property = meta_renderer_view_get_property;
object_class->set_property = meta_renderer_view_set_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] = obj_props[PROP_CRTC] =
g_param_spec_object ("crtc", NULL, NULL, g_param_spec_object ("crtc", NULL, NULL,
META_TYPE_CRTC, META_TYPE_CRTC,

View File

@ -32,7 +32,5 @@ struct _MetaRendererViewClass
MetaStageViewClass parent_class; MetaStageViewClass parent_class;
}; };
MtkMonitorTransform meta_renderer_view_get_transform (MetaRendererView *view);
META_EXPORT_TEST META_EXPORT_TEST
MetaCrtc *meta_renderer_view_get_crtc (MetaRendererView *view); 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); rect = mtk_region_get_rectangle (damage_region, i);
clutter_stage_view_transform_rect_to_onscreen (stage_view, mtk_rectangle_transform (&rect,
&rect, clutter_stage_view_get_transform (stage_view),
fb_width, fb_width,
fb_height, fb_height,
&rect); &rect);
@ -450,8 +450,8 @@ transform_swap_region_to_onscreen (ClutterStageView *stage_view,
for (i = 0; i < n_rects; i++) for (i = 0; i < n_rects; i++)
{ {
rects[i] = mtk_region_get_rectangle (swap_region, i); rects[i] = mtk_region_get_rectangle (swap_region, i);
clutter_stage_view_transform_rect_to_onscreen (stage_view, mtk_rectangle_transform (&rects[i],
&rects[i], clutter_stage_view_get_transform (stage_view),
width, width,
height, height,
&rects[i]); &rects[i]);

View File

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