From 2091df3856939eb80baecce2f41c384fe4ae7a2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20=C3=85dahl?= Date: Fri, 17 Mar 2017 15:00:54 +0800 Subject: [PATCH] renderer-x11: Split up into CM and Nested renderers Split up the MetaRendererX11 class into one for when running as a X11 compositing manager, and one for when running as a nested Wayland compositor. https://bugzilla.gnome.org/show_bug.cgi?id=777732 --- src/Makefile.am | 4 + src/backends/x11/cm/meta-backend-x11-cm.c | 8 ++ src/backends/x11/cm/meta-renderer-x11-cm.c | 43 ++++++ src/backends/x11/cm/meta-renderer-x11-cm.h | 33 +++++ src/backends/x11/meta-backend-x11.c | 7 - src/backends/x11/meta-renderer-x11.c | 84 ----------- src/backends/x11/meta-renderer-x11.h | 11 +- .../x11/nested/meta-backend-x11-nested.c | 8 ++ .../x11/nested/meta-renderer-x11-nested.c | 134 ++++++++++++++++++ .../x11/nested/meta-renderer-x11-nested.h | 33 +++++ 10 files changed, 271 insertions(+), 94 deletions(-) create mode 100644 src/backends/x11/cm/meta-renderer-x11-cm.c create mode 100644 src/backends/x11/cm/meta-renderer-x11-cm.h create mode 100644 src/backends/x11/nested/meta-renderer-x11-nested.c create mode 100644 src/backends/x11/nested/meta-renderer-x11-nested.h diff --git a/src/Makefile.am b/src/Makefile.am index 17354ea7a..3a154b244 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -137,10 +137,14 @@ libmutter_@LIBMUTTER_API_VERSION@_la_SOURCES = \ backends/x11/meta-cursor-renderer-x11.h \ backends/x11/cm/meta-backend-x11-cm.c \ backends/x11/cm/meta-backend-x11-cm.h \ + backends/x11/cm/meta-renderer-x11-cm.c \ + backends/x11/cm/meta-renderer-x11-cm.h \ backends/x11/nested/meta-backend-x11-nested.c \ backends/x11/nested/meta-backend-x11-nested.h \ backends/x11/nested/meta-cursor-renderer-x11-nested.c \ backends/x11/nested/meta-cursor-renderer-x11-nested.h \ + backends/x11/nested/meta-renderer-x11-nested.c \ + backends/x11/nested/meta-renderer-x11-nested.h \ backends/x11/meta-idle-monitor-xsync.c \ backends/x11/meta-idle-monitor-xsync.h \ backends/x11/meta-input-settings-x11.c \ diff --git a/src/backends/x11/cm/meta-backend-x11-cm.c b/src/backends/x11/cm/meta-backend-x11-cm.c index 814ca61c0..69f9cad63 100644 --- a/src/backends/x11/cm/meta-backend-x11-cm.c +++ b/src/backends/x11/cm/meta-backend-x11-cm.c @@ -29,6 +29,7 @@ #include "backends/meta-backend-private.h" #include "backends/x11/meta-cursor-renderer-x11.h" #include "backends/x11/meta-monitor-manager-xrandr.h" +#include "backends/x11/cm/meta-renderer-x11-cm.h" struct _MetaBackendX11Cm { @@ -89,6 +90,12 @@ meta_backend_x11_cm_post_init (MetaBackend *backend) take_touch_grab (backend); } +static MetaRenderer * +meta_backend_x11_cm_create_renderer (MetaBackend *backend) +{ + return g_object_new (META_TYPE_RENDERER_X11_CM, NULL); +} + static MetaMonitorManager * meta_backend_x11_cm_create_monitor_manager (MetaBackend *backend) { @@ -380,6 +387,7 @@ meta_backend_x11_cm_class_init (MetaBackendX11CmClass *klass) MetaBackendX11Class *backend_x11_class = META_BACKEND_X11_CLASS (klass); backend_class->post_init = meta_backend_x11_cm_post_init; + backend_class->create_renderer = meta_backend_x11_cm_create_renderer; backend_class->create_monitor_manager = meta_backend_x11_cm_create_monitor_manager; backend_class->create_cursor_renderer = meta_backend_x11_cm_create_cursor_renderer; backend_class->update_screen_size = meta_backend_x11_cm_update_screen_size; diff --git a/src/backends/x11/cm/meta-renderer-x11-cm.c b/src/backends/x11/cm/meta-renderer-x11-cm.c new file mode 100644 index 000000000..1bdc206be --- /dev/null +++ b/src/backends/x11/cm/meta-renderer-x11-cm.c @@ -0,0 +1,43 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ + +/* + * Copyright (C) 2016 Red Hat + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + * 02111-1307, USA. + * + */ + +#include "config.h" + +#include "backends/x11/cm/meta-renderer-x11-cm.h" + +struct _MetaRendererX11Cm +{ + MetaRendererX11 parent; +}; + +G_DEFINE_TYPE (MetaRendererX11Cm, meta_renderer_x11_cm, + META_TYPE_RENDERER_X11) + +static void +meta_renderer_x11_cm_init (MetaRendererX11Cm *renderer_x11_cm) +{ +} + +static void +meta_renderer_x11_cm_class_init (MetaRendererX11CmClass *klass) +{ +} diff --git a/src/backends/x11/cm/meta-renderer-x11-cm.h b/src/backends/x11/cm/meta-renderer-x11-cm.h new file mode 100644 index 000000000..e890a3dbb --- /dev/null +++ b/src/backends/x11/cm/meta-renderer-x11-cm.h @@ -0,0 +1,33 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ + +/* + * Copyright (C) 2016 Red Hat + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + * 02111-1307, USA. + * + */ + +#ifndef META_RENDERER_X11_CM_H +#define META_RENDERER_X11_CM_H + +#include "backends/x11/meta-renderer-x11.h" + +#define META_TYPE_RENDERER_X11_CM (meta_renderer_x11_cm_get_type ()) +G_DECLARE_FINAL_TYPE (MetaRendererX11Cm, meta_renderer_x11_cm, + META, RENDERER_X11_CM, + MetaRendererX11) + +#endif /* META_RENDERER_X11_CM_H */ diff --git a/src/backends/x11/meta-backend-x11.c b/src/backends/x11/meta-backend-x11.c index 439fb96fb..618babfa3 100644 --- a/src/backends/x11/meta-backend-x11.c +++ b/src/backends/x11/meta-backend-x11.c @@ -451,12 +451,6 @@ meta_backend_x11_create_idle_monitor (MetaBackend *backend, NULL); } -static MetaRenderer * -meta_backend_x11_create_renderer (MetaBackend *backend) -{ - return g_object_new (META_TYPE_RENDERER_X11, NULL); -} - static gboolean meta_backend_x11_grab_device (MetaBackend *backend, int device_id, @@ -600,7 +594,6 @@ meta_backend_x11_class_init (MetaBackendX11Class *klass) backend_class->create_clutter_backend = meta_backend_x11_create_clutter_backend; backend_class->post_init = meta_backend_x11_post_init; backend_class->create_idle_monitor = meta_backend_x11_create_idle_monitor; - backend_class->create_renderer = meta_backend_x11_create_renderer; backend_class->grab_device = meta_backend_x11_grab_device; backend_class->ungrab_device = meta_backend_x11_ungrab_device; backend_class->warp_pointer = meta_backend_x11_warp_pointer; diff --git a/src/backends/x11/meta-renderer-x11.c b/src/backends/x11/meta-renderer-x11.c index 5eb81dd39..90924e038 100644 --- a/src/backends/x11/meta-renderer-x11.c +++ b/src/backends/x11/meta-renderer-x11.c @@ -40,11 +40,6 @@ #include "meta/meta-backend.h" #include "meta/util.h" -struct _MetaRendererX11 -{ - MetaRenderer parent; -}; - G_DEFINE_TYPE (MetaRendererX11, meta_renderer_x11, META_TYPE_RENDERER) static const CoglWinsysVtable * @@ -90,84 +85,6 @@ meta_renderer_x11_create_cogl_renderer (MetaRenderer *renderer) return cogl_renderer; } -static MetaMonitorTransform -calculate_view_transform (MetaMonitorManager *monitor_manager, - MetaLogicalMonitor *logical_monitor) -{ - MetaMonitor *main_monitor; - MetaOutput *main_output; - main_monitor = meta_logical_monitor_get_monitors (logical_monitor)->data; - main_output = meta_monitor_get_main_output (main_monitor); - - /* - * Pick any monitor and output and check; all CRTCs of a logical monitor will - * always have the same transform assigned to them. - */ - - if (meta_monitor_manager_is_transform_handled (monitor_manager, - main_output->crtc, - main_output->crtc->transform)) - return META_MONITOR_TRANSFORM_NORMAL; - else - return main_output->crtc->transform; -} - -static MetaRendererView * -meta_renderer_x11_create_view (MetaRenderer *renderer, - MetaLogicalMonitor *logical_monitor) -{ - MetaBackend *backend = meta_get_backend (); - MetaMonitorManager *monitor_manager = - meta_backend_get_monitor_manager (backend); - ClutterBackend *clutter_backend = meta_backend_get_clutter_backend (backend); - CoglContext *cogl_context = clutter_backend_get_cogl_context (clutter_backend); - MetaMonitorTransform view_transform; - int view_scale; - int width, height; - CoglTexture2D *texture_2d; - CoglOffscreen *fake_onscreen; - CoglOffscreen *offscreen; - GError *error = NULL; - - g_assert (meta_is_wayland_compositor ()); - - view_transform = calculate_view_transform (monitor_manager, logical_monitor); - - if (meta_is_stage_views_scaled ()) - view_scale = logical_monitor->scale; - else - view_scale = 1; - - width = logical_monitor->rect.width * view_scale; - height = logical_monitor->rect.height * view_scale; - - texture_2d = cogl_texture_2d_new_with_size (cogl_context, width, height); - fake_onscreen = cogl_offscreen_new_with_texture (COGL_TEXTURE (texture_2d)); - - if (!cogl_framebuffer_allocate (COGL_FRAMEBUFFER (fake_onscreen), &error)) - meta_fatal ("Couldn't allocate framebuffer: %s", error->message); - - if (view_transform != META_MONITOR_TRANSFORM_NORMAL) - { - texture_2d = cogl_texture_2d_new_with_size (cogl_context, width, height); - offscreen = cogl_offscreen_new_with_texture (COGL_TEXTURE (texture_2d)); - if (!cogl_framebuffer_allocate (COGL_FRAMEBUFFER (offscreen), &error)) - meta_fatal ("Couldn't allocate offscreen framebuffer: %s", error->message); - } - else - { - offscreen = NULL; - } - - return g_object_new (META_TYPE_RENDERER_VIEW, - "layout", &logical_monitor->rect, - "framebuffer", COGL_FRAMEBUFFER (fake_onscreen), - "offscreen", COGL_FRAMEBUFFER (offscreen), - "transform", view_transform, - "scale", view_scale, - NULL); -} - static void meta_renderer_x11_init (MetaRendererX11 *renderer_x11) { @@ -179,5 +96,4 @@ meta_renderer_x11_class_init (MetaRendererX11Class *klass) MetaRendererClass *renderer_class = META_RENDERER_CLASS (klass); renderer_class->create_cogl_renderer = meta_renderer_x11_create_cogl_renderer; - renderer_class->create_view = meta_renderer_x11_create_view; } diff --git a/src/backends/x11/meta-renderer-x11.h b/src/backends/x11/meta-renderer-x11.h index 710137cc0..5ec0d4bc4 100644 --- a/src/backends/x11/meta-renderer-x11.h +++ b/src/backends/x11/meta-renderer-x11.h @@ -29,9 +29,14 @@ #include "backends/meta-renderer.h" +struct _MetaRendererX11Class +{ + MetaRendererClass parent_class; +}; + #define META_TYPE_RENDERER_X11 (meta_renderer_x11_get_type ()) -G_DECLARE_FINAL_TYPE (MetaRendererX11, meta_renderer_x11, - META, RENDERER_X11, - MetaRenderer) +G_DECLARE_DERIVABLE_TYPE (MetaRendererX11, meta_renderer_x11, + META, RENDERER_X11, + MetaRenderer) #endif /* META_RENDERER_X11_H */ diff --git a/src/backends/x11/nested/meta-backend-x11-nested.c b/src/backends/x11/nested/meta-backend-x11-nested.c index 7930e3f2a..3f9486f3c 100644 --- a/src/backends/x11/nested/meta-backend-x11-nested.c +++ b/src/backends/x11/nested/meta-backend-x11-nested.c @@ -24,12 +24,19 @@ #include "backends/meta-monitor-manager-dummy.h" #include "backends/x11/nested/meta-backend-x11-nested.h" #include "backends/x11/nested/meta-cursor-renderer-x11-nested.h" +#include "backends/x11/nested/meta-renderer-x11-nested.h" #include "wayland/meta-wayland.h" G_DEFINE_TYPE (MetaBackendX11Nested, meta_backend_x11_nested, META_TYPE_BACKEND_X11) +static MetaRenderer * +meta_backend_x11_nested_create_renderer (MetaBackend *backend) +{ + return g_object_new (META_TYPE_RENDERER_X11_NESTED, NULL); +} + static MetaMonitorManager * meta_backend_x11_nested_create_monitor_manager (MetaBackend *backend) { @@ -167,6 +174,7 @@ meta_backend_x11_nested_class_init (MetaBackendX11NestedClass *klass) MetaBackendClass *backend_class = META_BACKEND_CLASS (klass); MetaBackendX11Class *backend_x11_class = META_BACKEND_X11_CLASS (klass); + backend_class->create_renderer = meta_backend_x11_nested_create_renderer; backend_class->create_monitor_manager = meta_backend_x11_nested_create_monitor_manager; backend_class->create_cursor_renderer = meta_backend_x11_nested_create_cursor_renderer; backend_class->update_screen_size = meta_backend_x11_nested_update_screen_size; diff --git a/src/backends/x11/nested/meta-renderer-x11-nested.c b/src/backends/x11/nested/meta-renderer-x11-nested.c new file mode 100644 index 000000000..abd6a539d --- /dev/null +++ b/src/backends/x11/nested/meta-renderer-x11-nested.c @@ -0,0 +1,134 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ + +/* + * Copyright (C) 2016 Red Hat + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + * 02111-1307, USA. + * + */ + +#include "config.h" + +#include "backends/x11/nested/meta-renderer-x11-nested.h" + +#include + +#include "clutter/x11/clutter-x11.h" +#include "backends/meta-backend-private.h" +#include "backends/meta-logical-monitor.h" +#include "backends/meta-renderer.h" +#include "backends/meta-renderer-view.h" +#include "core/boxes-private.h" +#include "meta/meta-backend.h" +#include "meta/util.h" + +struct _MetaRendererX11Nested +{ + MetaRendererX11 parent; +}; + +G_DEFINE_TYPE (MetaRendererX11Nested, meta_renderer_x11_nested, + META_TYPE_RENDERER_X11) + +static MetaMonitorTransform +calculate_view_transform (MetaMonitorManager *monitor_manager, + MetaLogicalMonitor *logical_monitor) +{ + MetaMonitor *main_monitor; + MetaOutput *main_output; + main_monitor = meta_logical_monitor_get_monitors (logical_monitor)->data; + main_output = meta_monitor_get_main_output (main_monitor); + + /* + * Pick any monitor and output and check; all CRTCs of a logical monitor will + * always have the same transform assigned to them. + */ + + if (meta_monitor_manager_is_transform_handled (monitor_manager, + main_output->crtc, + main_output->crtc->transform)) + return META_MONITOR_TRANSFORM_NORMAL; + else + return main_output->crtc->transform; +} + +static MetaRendererView * +meta_renderer_x11_nested_create_view (MetaRenderer *renderer, + MetaLogicalMonitor *logical_monitor) +{ + MetaBackend *backend = meta_get_backend (); + MetaMonitorManager *monitor_manager = + meta_backend_get_monitor_manager (backend); + ClutterBackend *clutter_backend = meta_backend_get_clutter_backend (backend); + CoglContext *cogl_context = clutter_backend_get_cogl_context (clutter_backend); + MetaMonitorTransform view_transform; + int view_scale; + int width, height; + CoglTexture2D *texture_2d; + CoglOffscreen *fake_onscreen; + CoglOffscreen *offscreen; + GError *error = NULL; + + view_transform = calculate_view_transform (monitor_manager, logical_monitor); + + if (meta_is_stage_views_scaled ()) + view_scale = logical_monitor->scale; + else + view_scale = 1; + + width = logical_monitor->rect.width * view_scale; + height = logical_monitor->rect.height * view_scale; + + texture_2d = cogl_texture_2d_new_with_size (cogl_context, width, height); + fake_onscreen = cogl_offscreen_new_with_texture (COGL_TEXTURE (texture_2d)); + + if (!cogl_framebuffer_allocate (COGL_FRAMEBUFFER (fake_onscreen), &error)) + meta_fatal ("Couldn't allocate framebuffer: %s", error->message); + + if (view_transform != META_MONITOR_TRANSFORM_NORMAL) + { + texture_2d = cogl_texture_2d_new_with_size (cogl_context, width, height); + offscreen = cogl_offscreen_new_with_texture (COGL_TEXTURE (texture_2d)); + if (!cogl_framebuffer_allocate (COGL_FRAMEBUFFER (offscreen), &error)) + meta_fatal ("Couldn't allocate offscreen framebuffer: %s", error->message); + } + else + { + offscreen = NULL; + } + + return g_object_new (META_TYPE_RENDERER_VIEW, + "layout", &logical_monitor->rect, + "framebuffer", COGL_FRAMEBUFFER (fake_onscreen), + "offscreen", COGL_FRAMEBUFFER (offscreen), + "transform", view_transform, + "scale", view_scale, + NULL); +} + +static void +meta_renderer_x11_nested_init (MetaRendererX11Nested *renderer_x11_nested) +{ +} + +static void +meta_renderer_x11_nested_class_init (MetaRendererX11NestedClass *klass) +{ + MetaRendererClass *renderer_class = META_RENDERER_CLASS (klass); + + renderer_class->create_view = meta_renderer_x11_nested_create_view; +} + diff --git a/src/backends/x11/nested/meta-renderer-x11-nested.h b/src/backends/x11/nested/meta-renderer-x11-nested.h new file mode 100644 index 000000000..c766db84c --- /dev/null +++ b/src/backends/x11/nested/meta-renderer-x11-nested.h @@ -0,0 +1,33 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ + +/* + * Copyright (C) 2016 Red Hat + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + * 02111-1307, USA. + * + */ + +#ifndef META_RENDERER_X11_NESTED_H +#define META_RENDERER_X11_NESTED_H + +#include "backends/x11/meta-renderer-x11.h" + +#define META_TYPE_RENDERER_X11_NESTED (meta_renderer_x11_nested_get_type ()) +G_DECLARE_FINAL_TYPE (MetaRendererX11Nested, meta_renderer_x11_nested, + META, RENDERER_X11_NESTED, + MetaRendererX11) + +#endif /* META_RENDERER_X11_NESTED_H */