diff --git a/clutter/clutter/clutter-stage-view-private.h b/clutter/clutter/clutter-stage-view-private.h index 98f2f7f0f..310672b3b 100644 --- a/clutter/clutter/clutter-stage-view-private.h +++ b/clutter/clutter/clutter-stage-view-private.h @@ -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); diff --git a/clutter/clutter/clutter-stage-view.c b/clutter/clutter/clutter-stage-view.c index 5b1bf2fdc..5d5715bde 100644 --- a/clutter/clutter/clutter-stage-view.c +++ b/clutter/clutter/clutter-stage-view.c @@ -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,12 +250,13 @@ 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, - view_layout.width, view_layout.height), - view_layout.width, - view_layout.height, - &onscreen_layout); + + mtk_rectangle_transform (&MTK_RECTANGLE_INIT (0, 0, + view_layout.width, view_layout.height), + priv->transform, + view_layout.width, + view_layout.height, + &onscreen_layout); view_scale = clutter_stage_view_get_scale (view); cogl_framebuffer_push_matrix (dst_framebuffer); @@ -284,11 +285,11 @@ 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, - onscreen_layout.width, - onscreen_layout.height, - &dst_rect); + mtk_rectangle_transform (&src_rect, + priv->transform, + onscreen_layout.width, + onscreen_layout.height, + &dst_rect); coordinates[i * 8 + 0] = (float) dst_rect.x * view_scale; coordinates[i * 8 + 1] = (float) dst_rect.y * view_scale; @@ -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] = diff --git a/clutter/clutter/clutter-stage-view.h b/clutter/clutter/clutter-stage-view.h index 2bb32bcd9..280cc9252 100644 --- a/clutter/clutter/clutter-stage-view.h +++ b/clutter/clutter/clutter-stage-view.h @@ -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); diff --git a/src/backends/meta-renderer-view.c b/src/backends/meta-renderer-view.c index 4fe72e785..a99862970 100644 --- a/src/backends/meta-renderer-view.c +++ b/src/backends/meta-renderer-view.c @@ -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, diff --git a/src/backends/meta-renderer-view.h b/src/backends/meta-renderer-view.h index 4d54c1e05..e22b50f12 100644 --- a/src/backends/meta-renderer-view.h +++ b/src/backends/meta-renderer-view.h @@ -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); diff --git a/src/backends/meta-stage-impl.c b/src/backends/meta-stage-impl.c index a633d0b08..0894dd93f 100644 --- a/src/backends/meta-stage-impl.c +++ b/src/backends/meta-stage-impl.c @@ -243,11 +243,11 @@ queue_damage_region (ClutterStageWindow *stage_window, rect = mtk_region_get_rectangle (damage_region, i); - clutter_stage_view_transform_rect_to_onscreen (stage_view, - &rect, - fb_width, - fb_height, - &rect); + mtk_rectangle_transform (&rect, + clutter_stage_view_get_transform (stage_view), + fb_width, + fb_height, + &rect); damage[i * 4] = rect.x; /* y coordinate needs to be flipped for OpenGL */ @@ -450,11 +450,11 @@ 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], - width, - height, - &rects[i]); + mtk_rectangle_transform (&rects[i], + clutter_stage_view_get_transform (stage_view), + width, + height, + &rects[i]); } transformed_region = mtk_region_create_rectangles (rects, n_rects); diff --git a/src/wayland/meta-wayland-surface.c b/src/wayland/meta-wayland-surface.c index 0f57739af..da7ea0747 100644 --- a/src/wayland/meta-wayland-surface.c +++ b/src/wayland/meta-wayland-surface.c @@ -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,