From 31307720bf47c3ec26f250c43f63942aad639087 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20=C3=85dahl?= Date: Tue, 12 May 2020 08:54:56 +0200 Subject: [PATCH] stage-x11: Move view management to renderer In the native backend, the MetaRenderer manages the view by creating one per CRTC, but until now the MetaStageX11 managed the view for the X11 backend. This caused some issues as it meant meta_renderer_get_views() not returning anything, and that the view of the X11 screen not being a MetaRendererView, while in the other backends, all views are. Fix this by moving the view management responsibility to MetaRendererX11Cm, and have MetaStageX11 only operate on it via meta_renderer_x11_cm_*() API. The MetaRendererX11Cm takes care of making sure the view is always added to the list in the renderer, and turning X11 screen sizes into "layouts" etc. https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1251 (cherry picked from commit 8a541c08fba3bc59eddde828f080fc9a62d58b36) --- src/backends/x11/cm/meta-renderer-x11-cm.c | 64 +++++++++++++++++++ src/backends/x11/cm/meta-renderer-x11-cm.h | 11 ++++ src/backends/x11/meta-stage-x11.c | 72 +++++++++++----------- src/backends/x11/meta-stage-x11.h | 6 +- 4 files changed, 113 insertions(+), 40 deletions(-) diff --git a/src/backends/x11/cm/meta-renderer-x11-cm.c b/src/backends/x11/cm/meta-renderer-x11-cm.c index 1bdc206be..2490b055d 100644 --- a/src/backends/x11/cm/meta-renderer-x11-cm.c +++ b/src/backends/x11/cm/meta-renderer-x11-cm.c @@ -24,14 +24,75 @@ #include "backends/x11/cm/meta-renderer-x11-cm.h" +#include "backends/meta-renderer-view.h" + struct _MetaRendererX11Cm { MetaRendererX11 parent; + + MetaRendererView *screen_view; }; G_DEFINE_TYPE (MetaRendererX11Cm, meta_renderer_x11_cm, META_TYPE_RENDERER_X11) +void +meta_renderer_x11_cm_ensure_screen_view (MetaRendererX11Cm *renderer_x11_cm, + int width, + int height) +{ + cairo_rectangle_int_t view_layout; + + if (renderer_x11_cm->screen_view) + return; + + view_layout = (cairo_rectangle_int_t) { + .width = width, + .height = height, + }; + renderer_x11_cm->screen_view = g_object_new (META_TYPE_RENDERER_VIEW, + "layout", &view_layout, + NULL); + meta_renderer_add_view (META_RENDERER (renderer_x11_cm), + renderer_x11_cm->screen_view); +} + +void +meta_renderer_x11_cm_resize (MetaRendererX11Cm *renderer_x11_cm, + int width, + int height) +{ + cairo_rectangle_int_t view_layout; + + view_layout = (cairo_rectangle_int_t) { + .width = width, + .height = height, + }; + + g_object_set (G_OBJECT (renderer_x11_cm->screen_view), + "layout", &view_layout, + NULL); +} + +void +meta_renderer_x11_cm_set_onscreen (MetaRendererX11Cm *renderer_x11_cm, + CoglOnscreen *onscreen) +{ + g_object_set (G_OBJECT (renderer_x11_cm->screen_view), + "framebuffer", onscreen, + NULL); +} + +static void +meta_renderer_x11_cm_rebuild_views (MetaRenderer *renderer) +{ + MetaRendererX11Cm *renderer_x11_cm = META_RENDERER_X11_CM (renderer); + + g_return_if_fail (!meta_renderer_get_views (renderer)); + + meta_renderer_add_view (renderer, renderer_x11_cm->screen_view); +} + static void meta_renderer_x11_cm_init (MetaRendererX11Cm *renderer_x11_cm) { @@ -40,4 +101,7 @@ meta_renderer_x11_cm_init (MetaRendererX11Cm *renderer_x11_cm) static void meta_renderer_x11_cm_class_init (MetaRendererX11CmClass *klass) { + MetaRendererClass *renderer_class = META_RENDERER_CLASS (klass); + + renderer_class->rebuild_views = meta_renderer_x11_cm_rebuild_views; } diff --git a/src/backends/x11/cm/meta-renderer-x11-cm.h b/src/backends/x11/cm/meta-renderer-x11-cm.h index e890a3dbb..65c5125bb 100644 --- a/src/backends/x11/cm/meta-renderer-x11-cm.h +++ b/src/backends/x11/cm/meta-renderer-x11-cm.h @@ -30,4 +30,15 @@ G_DECLARE_FINAL_TYPE (MetaRendererX11Cm, meta_renderer_x11_cm, META, RENDERER_X11_CM, MetaRendererX11) +void meta_renderer_x11_cm_ensure_screen_view (MetaRendererX11Cm *renderer_x11_cm, + int width, + int height); + +void meta_renderer_x11_cm_resize (MetaRendererX11Cm *renderer_x11_cm, + int width, + int height); + +void meta_renderer_x11_cm_set_onscreen (MetaRendererX11Cm *renderer_x11_cm, + CoglOnscreen *onscreen); + #endif /* META_RENDERER_X11_CM_H */ diff --git a/src/backends/x11/meta-stage-x11.c b/src/backends/x11/meta-stage-x11.c index e9f456dc8..4671160a9 100644 --- a/src/backends/x11/meta-stage-x11.c +++ b/src/backends/x11/meta-stage-x11.c @@ -26,6 +26,8 @@ #include #endif +#include "backends/x11/cm/meta-backend-x11-cm.h" +#include "backends/x11/cm/meta-renderer-x11-cm.h" #include "backends/x11/meta-backend-x11.h" #include "backends/x11/meta-seat-x11.h" #include "backends/x11/meta-stage-x11.h" @@ -287,8 +289,6 @@ meta_stage_x11_unrealize (ClutterStageWindow *stage_window) clutter_stage_window_parent_iface->unrealize (stage_window); - g_list_free (stage_x11->legacy_views); - g_clear_object (&stage_x11->legacy_view); g_clear_pointer (&stage_x11->onscreen, cogl_object_unref); } @@ -330,10 +330,13 @@ meta_stage_x11_realize (ClutterStageWindow *stage_window) stage_cogl, NULL); - if (stage_x11->legacy_view) - g_object_set (G_OBJECT (stage_x11->legacy_view), - "framebuffer", stage_x11->onscreen, - NULL); + if (META_IS_BACKEND_X11_CM (stage_x11->backend)) + { + MetaRenderer *renderer = meta_backend_get_renderer (stage_x11->backend); + MetaRendererX11Cm *renderer_x11_cm = META_RENDERER_X11_CM (renderer); + + meta_renderer_x11_cm_set_onscreen (renderer_x11_cm, stage_x11->onscreen); + } /* We just created a window of the size of the actor. No need to fix the size of the stage, just update it. */ @@ -522,34 +525,13 @@ meta_stage_x11_can_clip_redraws (ClutterStageWindow *stage_window) return stage_x11->clipped_redraws_cool_off == 0; } -static void -ensure_legacy_view (ClutterStageWindow *stage_window) -{ - MetaStageX11 *stage_x11 = META_STAGE_X11 (stage_window); - cairo_rectangle_int_t view_layout; - CoglFramebuffer *framebuffer; - - if (stage_x11->legacy_view) - return; - - _clutter_stage_window_get_geometry (stage_window, &view_layout); - framebuffer = COGL_FRAMEBUFFER (stage_x11->onscreen); - stage_x11->legacy_view = g_object_new (CLUTTER_TYPE_STAGE_VIEW_COGL, - "layout", &view_layout, - "framebuffer", framebuffer, - NULL); - stage_x11->legacy_views = g_list_append (stage_x11->legacy_views, - stage_x11->legacy_view); -} - static GList * meta_stage_x11_get_views (ClutterStageWindow *stage_window) { MetaStageX11 *stage_x11 = META_STAGE_X11 (stage_window); + MetaRenderer *renderer = meta_backend_get_renderer (stage_x11->backend); - ensure_legacy_view (stage_window); - - return stage_x11->legacy_views; + return meta_renderer_get_views (renderer); } static int64_t @@ -581,6 +563,9 @@ meta_stage_x11_class_init (MetaStageX11Class *klass) static void meta_stage_x11_init (MetaStageX11 *stage) { + MetaRenderer *renderer; + MetaRendererX11Cm *renderer_x11_cm; + stage->xwin = None; stage->xwin_width = 640; stage->xwin_height = 480; @@ -591,6 +576,19 @@ meta_stage_x11_init (MetaStageX11 *stage) stage->accept_focus = TRUE; stage->title = NULL; + + stage->backend = meta_get_backend (); + g_assert (stage->backend); + + if (META_IS_BACKEND_X11_CM (stage->backend)) + { + renderer = meta_backend_get_renderer (stage->backend); + renderer_x11_cm = META_RENDERER_X11_CM (renderer); + + meta_renderer_x11_cm_ensure_screen_view (renderer_x11_cm, + stage->xwin_width, + stage->xwin_height); + } } static void @@ -778,16 +776,16 @@ meta_stage_x11_translate_event (MetaStageX11 *stage_x11, * X11 compositing manager, we need to reset the legacy * stage view, now that it has a new size. */ - if (stage_x11->legacy_view) + if (META_IS_BACKEND_X11_CM (stage_x11->backend)) { - cairo_rectangle_int_t view_layout = { - .width = stage_width, - .height = stage_height - }; + MetaBackend *backend = stage_x11->backend; + MetaRenderer *renderer = meta_backend_get_renderer (backend); + MetaRendererX11Cm *renderer_x11_cm = + META_RENDERER_X11_CM (renderer); - g_object_set (G_OBJECT (stage_x11->legacy_view), - "layout", &view_layout, - NULL); + meta_renderer_x11_cm_resize (renderer_x11_cm, + stage_width, + stage_height); } } } diff --git a/src/backends/x11/meta-stage-x11.h b/src/backends/x11/meta-stage-x11.h index 0ec429e53..f37ec6708 100644 --- a/src/backends/x11/meta-stage-x11.h +++ b/src/backends/x11/meta-stage-x11.h @@ -25,6 +25,7 @@ #include #include +#include "backends/meta-backend-private.h" #include "clutter/clutter-mutter.h" #include "clutter/x11/clutter-x11.h" @@ -51,14 +52,13 @@ struct _MetaStageX11 { ClutterStageCogl parent_instance; + MetaBackend *backend; + CoglOnscreen *onscreen; Window xwin; gint xwin_width; gint xwin_height; /* FIXME target_width / height */ - ClutterStageView *legacy_view; - GList *legacy_views; - CoglFrameClosure *frame_closure; gchar *title;